From eca8c51255118cd729caddd51d2c979e0a2b4282 Mon Sep 17 00:00:00 2001 From: Luigi Malomo Date: Mon, 16 Aug 2021 17:36:01 +0200 Subject: [PATCH 01/56] another const access fix --- vcg/simplex/edge/component.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/vcg/simplex/edge/component.h b/vcg/simplex/edge/component.h index 4e922ae39..8c27bcece 100644 --- a/vcg/simplex/edge/component.h +++ b/vcg/simplex/edge/component.h @@ -128,9 +128,10 @@ template class VertexRef: public T { inline typename T::VertexType * const & V( const int j ) const { assert(j>=0 && j<2); return v[j]; } inline typename T::VertexType * cV( const int j ) const { assert(j>=0 && j<2); return v[j]; } - // Shortcut per accedere ai punti delle facce - inline CoordType & P( const int j ) { assert(j>=0 && j<2); return v[j]->P(); } - inline const CoordType &cP( const int j ) const { assert(j>=0 && j<2); return v[j]->P(); } + /// Shortcuts to access points + inline CoordType & P( const int j ) { assert(j>=0 && j<2); return v[j]->P();} + inline const CoordType & P( const int j ) const { assert(j>=0 && j<2); return v[j]->P();} + inline const CoordType & cP( const int j ) const { assert(j>=0 && j<2); return v[j]->P();} /** Return the pointer to the ((j+1)%3)-th vertex of the face. @param j Index of the face vertex. @@ -142,7 +143,7 @@ template class VertexRef: public T { inline const typename T::VertexType * const & cV0( const int j ) const { return cV(j);} inline const typename T::VertexType * const & cV1( const int j ) const { return cV((j+1)%2);} - /// Shortcut per accedere ai punti delle facce + /// Shortcuts to access points inline CoordType & P0( const int j ) { return V(j)->P();} inline CoordType & P1( const int j ) { return V((j+1)%2)->P();} inline const CoordType & P0( const int j ) const { return V(j)->P();} From 95b376b64829639bbff1573cccb4f01b7755819b Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Mon, 23 Aug 2021 11:07:40 +0200 Subject: [PATCH 02/56] apply #19, #78, #84, #157, #159 --- README.md | 36 +++++++++---------- docs/Doxygen/basic_concepts.dxy | 25 +++++++------ .../algorithms/parametrization/uv_utils.h | 17 ++++----- wrap/gl/camera.h | 3 -- 4 files changed, 39 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index d98ee6ec4..28469735c 100644 --- a/README.md +++ b/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. ![BuildExamplesLinux](https://github.com/cnr-isti-vclab/vcglib/workflows/BuildExamplesLinux/badge.svg) ![BuildExamplesMacOS](https://github.com/cnr-isti-vclab/vcglib/workflows/BuildExamplesMacOS/badge.svg) ![BuildExamplesWindows](https://github.com/cnr-isti-vclab/vcglib/workflows/BuildExamplesWindows/badge.svg) -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, -- efficient spatial query structures (uniform grids, hashed grids, kdtree, ...) , -- advanced smoothing and fairing algorithms, -- computation of curvature, -- optimization of texture coordinates, -- Hausdorff distance computation, -- geodesic paths, -- mesh repairing capabilities, -- isosurface extraction and advancing front meshing algorithms, -- Poisson Disk sampling and other tools to sample point distributions over meshes, +- high quality quadric-error edge-collapse based simplfication +- efficient spatial query structures (uniform grids, hashed grids, kdtree, etc) +- advanced smoothing and fairing algorithms +- computation of curvature +- optimization of texture coordinates +- Hausdorff distance computation +- geodesic paths +- mesh repairing capabilities +- isosurface extraction and advancing front meshing algorithms +- Poisson Disk sampling and other tools to sample point distributions over meshes - subdivision surfaces ## 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 - 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 -For any info about licensing (portion of) the library please contact us: -Paolo Cignoni (p.cignoni@isti.cnr.it) +For any info about licensing (portions of) the library please contact us: +Paolo Cignoni (p.cignoni@isti.cnr.it) 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). diff --git a/docs/Doxygen/basic_concepts.dxy b/docs/Doxygen/basic_concepts.dxy index b0ab1ff8e..5514636ee 100644 --- a/docs/Doxygen/basic_concepts.dxy +++ b/docs/Doxygen/basic_concepts.dxy @@ -28,13 +28,13 @@ The face, the edge and the vertex type are the crucial bits to understand in ord \until Qualityf \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: - 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 - 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 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: @@ -54,15 +54,15 @@ One more comment: \c vcg::face::VertexRef is an attribute that stores 3 pointers 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 ----------- -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 ------------- -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 ... @@ -73,16 +73,16 @@ class UpdateNormals{ static void PerFace(ComputeMeshType &m) // 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) // 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) ... }; \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 #include @@ -92,9 +92,9 @@ This class is part of a kernel of classes with name UpdateValue that compute the #include #include -#include -#include //class UpdateNormals -#include //class UpdateCurvature +#include +#include //class UpdateNormals +#include //class UpdateCurvature class MyVertex; class MyFace; @@ -120,6 +120,5 @@ int main() } \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.*/ - diff --git a/vcg/complex/algorithms/parametrization/uv_utils.h b/vcg/complex/algorithms/parametrization/uv_utils.h index e93bcedfe..82b2e8ecb 100644 --- a/vcg/complex/algorithms/parametrization/uv_utils.h +++ b/vcg/complex/algorithms/parametrization/uv_utils.h @@ -8,7 +8,7 @@ * \ * * All rights reserved. * * * -* This program is free software; you can redistribute it and/or modify * +* This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * @@ -21,8 +21,8 @@ * * ****************************************************************************/ -#ifndef VCG_UV_UTILS -#define VCG_UV_UTILS +#ifndef VCG_COMPLEX_ALGORITHMS_PARAMETRIZATION_UV_UTILS_H +#define VCG_COMPLEX_ALGORITHMS_PARAMETRIZATION_UV_UTILS_H #include #include @@ -30,7 +30,7 @@ #include namespace vcg { -namespace tri{ +namespace tri { template class UV_Utils { @@ -44,7 +44,7 @@ class UV_Utils public: - ///calculate the area in UV space + /// calculate the area in UV space static ScalarType PerVertUVArea(MeshType &m) { FaceIterator fi; @@ -242,6 +242,7 @@ class UV_Utils } } }; -} //End Namespace Tri -} // End Namespace vcg -#endif + +} // end Namespace tri +} // end Namespace vcg +#endif // VCG_COMPLEX_ALGORITHMS_PARAMETRIZATION_UV_UTILS_H diff --git a/wrap/gl/camera.h b/wrap/gl/camera.h index debf72520..b6a8dc777 100644 --- a/wrap/gl/camera.h +++ b/wrap/gl/camera.h @@ -79,9 +79,6 @@ creation // VCG #include -// opengl -#include - template struct GlCamera{ From aec8880e851a7eedc2669eb3254e52f471264d26 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Mon, 23 Aug 2021 16:24:23 +0200 Subject: [PATCH 03/56] restore deterministic poisson sampling --- vcg/complex/algorithms/point_sampling.h | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/vcg/complex/algorithms/point_sampling.h b/vcg/complex/algorithms/point_sampling.h index d5e711f85..1647e782e 100644 --- a/vcg/complex/algorithms/point_sampling.h +++ b/vcg/complex/algorithms/point_sampling.h @@ -502,6 +502,18 @@ static unsigned int RandomInt(unsigned int i) return (SamplingRandomGenerator().generate(i)); } +class MarsenneTwisterURBG +{ +public: + typedef unsigned int result_type; + MarsenneTwisterURBG(result_type max) : _max(max) {} + result_type min() const {return 0;} + result_type max() const {return _max;} + result_type operator()() {return SamplingRandomGenerator().generate(_max);} +private: + result_type _max; +}; + // Returns a random number in the [0,1) real interval using the improved Marsenne-Twister method. static double RandomDouble01() { @@ -714,8 +726,9 @@ static void FillAndShuffleFacePointerVector(MeshType & m, std::vector &vertVec) @@ -726,8 +739,9 @@ static void FillAndShuffleVertexPointerVector(MeshType & m, std::vector Date: Mon, 23 Aug 2021 16:29:36 +0200 Subject: [PATCH 04/56] using ninja instead of jom for windows build examples --- .github/workflows/BuildExamplesWindows.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/BuildExamplesWindows.yml b/.github/workflows/BuildExamplesWindows.yml index f92285ccd..193024c09 100644 --- a/.github/workflows/BuildExamplesWindows.yml +++ b/.github/workflows/BuildExamplesWindows.yml @@ -9,12 +9,6 @@ jobs: steps: - 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 id: envs run: | @@ -27,5 +21,5 @@ jobs: run: | mkdir build cd build - cmake -G "NMake Makefiles" -DVCG_BUILD_EXAMPLES=ON .. - jom -j4 + cmake -GNinja -DVCG_BUILD_EXAMPLES=ON .. + ninja From e3731ec7f52902f5f2fee4cda9141f50eb786c5a Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Mon, 23 Aug 2021 17:26:28 +0200 Subject: [PATCH 05/56] fix MarsenneTwisterURBG class --- vcg/complex/algorithms/point_sampling.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vcg/complex/algorithms/point_sampling.h b/vcg/complex/algorithms/point_sampling.h index 1647e782e..5436042c1 100644 --- a/vcg/complex/algorithms/point_sampling.h +++ b/vcg/complex/algorithms/point_sampling.h @@ -506,9 +506,9 @@ class MarsenneTwisterURBG { public: typedef unsigned int result_type; - MarsenneTwisterURBG(result_type max) : _max(max) {} - result_type min() const {return 0;} - result_type max() const {return _max;} + MarsenneTwisterURBG(result_type max){_max = max;} + static result_type min() {return 0;} + static result_type max() {return std::numeric_limits::max();} result_type operator()() {return SamplingRandomGenerator().generate(_max);} private: result_type _max; From b1c1d03215ee6968adf4ebdbab225daf933f07eb Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Mon, 23 Aug 2021 17:35:50 +0200 Subject: [PATCH 06/56] fix MarsenneTwisterURBG class --- vcg/complex/algorithms/point_sampling.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vcg/complex/algorithms/point_sampling.h b/vcg/complex/algorithms/point_sampling.h index 5436042c1..1ef40d619 100644 --- a/vcg/complex/algorithms/point_sampling.h +++ b/vcg/complex/algorithms/point_sampling.h @@ -507,8 +507,8 @@ class MarsenneTwisterURBG public: typedef unsigned int result_type; MarsenneTwisterURBG(result_type max){_max = max;} - static result_type min() {return 0;} - static result_type max() {return std::numeric_limits::max();} + static constexpr result_type min() {return 0;} + static constexpr result_type max() {return std::numeric_limits::max();} result_type operator()() {return SamplingRandomGenerator().generate(_max);} private: result_type _max; From 78d98b25770e5f9f1c5bb93e15f90a0642aafab5 Mon Sep 17 00:00:00 2001 From: nico Date: Tue, 24 Aug 2021 09:26:28 +1000 Subject: [PATCH 07/56] Fixed 2 more instances of the Marsienne Twister --- vcg/complex/algorithms/point_sampling.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/vcg/complex/algorithms/point_sampling.h b/vcg/complex/algorithms/point_sampling.h index 1ef40d619..4bd163c02 100644 --- a/vcg/complex/algorithms/point_sampling.h +++ b/vcg/complex/algorithms/point_sampling.h @@ -1948,8 +1948,10 @@ static void PoissonDiskPruning(VertexSampler &ps, MeshType &montecarloMesh, InitRadiusHandleFromQuality(montecarloMesh, rH, diskRadius, pp.radiusVariance, pp.invertQuality); //unsigned int (*p_myrandom)(unsigned int) = RandomInt; - std::random_device rd; - std::mt19937 g(rd()); +// std::random_device rd; +// std::mt19937 g(rd()); +// std::shuffle(montecarloSHT.AllocatedCells.begin(),montecarloSHT.AllocatedCells.end(), g); + MarsenneTwisterURBG g(montecarloSHT.AllocatedCells.size()); std::shuffle(montecarloSHT.AllocatedCells.begin(),montecarloSHT.AllocatedCells.end(), g); int t1 = clock(); pp.pds.montecarloSampleNum = montecarloMesh.vn; @@ -2085,7 +2087,9 @@ static void HierarchicalPoissonDisk(MeshType &origMesh, VertexSampler &ps, MeshT // shuffle active cells //unsigned int (*p_myrandom)(unsigned int) = RandomInt; std::random_device rd; - std::mt19937 g(rd()); +// std::mt19937 g(rd()); +// std::shuffle(montecarloSHT.AllocatedCells.begin(),montecarloSHT.AllocatedCells.end(), g); + MarsenneTwisterURBG g(montecarloSHT.AllocatedCells.size()); std::shuffle(montecarloSHT.AllocatedCells.begin(),montecarloSHT.AllocatedCells.end(), g); // generate a sample inside C by choosing one of the contained pre-generated samples From bd05cf0932cb1b1c5721e5ba58498a3da5e1c005 Mon Sep 17 00:00:00 2001 From: nico Date: Tue, 24 Aug 2021 09:28:03 +1000 Subject: [PATCH 08/56] Checked to not collapse triangular faces in Function RemoveValence2Vertices --- vcg/complex/algorithms/polygonal_algorithms.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vcg/complex/algorithms/polygonal_algorithms.h b/vcg/complex/algorithms/polygonal_algorithms.h index 7154278cb..a8988afda 100644 --- a/vcg/complex/algorithms/polygonal_algorithms.h +++ b/vcg/complex/algorithms/polygonal_algorithms.h @@ -23,8 +23,8 @@ #ifndef __VCGLIB_POLY_MESH_ALGORITHM #define __VCGLIB_POLY_MESH_ALGORITHM -#include #include +#include #include #include #include From 4e3f08e134e922d0c4b50c002f3c4ff535f0b95f Mon Sep 17 00:00:00 2001 From: nico Date: Tue, 31 Aug 2021 21:38:59 +1000 Subject: [PATCH 09/56] corrected some simple warning and avoided collapse of edges of triangular faces for polygons --- .../algorithms/parametrization/tangent_field_operators.h | 2 +- vcg/complex/algorithms/polygonal_algorithms.h | 8 ++++++++ vcg/container/simple_temporary_data.h | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/vcg/complex/algorithms/parametrization/tangent_field_operators.h b/vcg/complex/algorithms/parametrization/tangent_field_operators.h index 4dfb39631..6e2d30871 100644 --- a/vcg/complex/algorithms/parametrization/tangent_field_operators.h +++ b/vcg/complex/algorithms/parametrization/tangent_field_operators.h @@ -624,7 +624,7 @@ class CrossField do { std::vector new_queue; - for (int i=0; iIsD()); diff --git a/vcg/complex/algorithms/polygonal_algorithms.h b/vcg/complex/algorithms/polygonal_algorithms.h index a8988afda..6d1807de1 100644 --- a/vcg/complex/algorithms/polygonal_algorithms.h +++ b/vcg/complex/algorithms/polygonal_algorithms.h @@ -1181,6 +1181,14 @@ class PolygonalAlgorithm for (int j=0;j3)continue; + for (int j=0;j void resize(size_t sz) { int oldDatasize = datasize; - if (sz <= oldDatasize) + if ((int)sz <= oldDatasize) return; if (sz > datareserve) reserve(sz); From fea0a33575356a7b00517aa45b9b06f804262827 Mon Sep 17 00:00:00 2001 From: nico Date: Tue, 31 Aug 2021 21:40:01 +1000 Subject: [PATCH 10/56] added std namespace for max function on line 281 --- vcg/complex/algorithms/mesh_to_matrix.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vcg/complex/algorithms/mesh_to_matrix.h b/vcg/complex/algorithms/mesh_to_matrix.h index c85edf8bb..89ac2afde 100644 --- a/vcg/complex/algorithms/mesh_to_matrix.h +++ b/vcg/complex/algorithms/mesh_to_matrix.h @@ -278,7 +278,7 @@ class MeshToMatrix } ScalarType maxA=0; for(int i=0;i Date: Tue, 31 Aug 2021 21:40:46 +1000 Subject: [PATCH 11/56] set to void parameters when not using Miq Field smoothing to avoid warnings --- wrap/igl/smooth_field.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/wrap/igl/smooth_field.h b/wrap/igl/smooth_field.h index bc3ad19f8..9629a8838 100644 --- a/wrap/igl/smooth_field.h +++ b/wrap/igl/smooth_field.h @@ -264,6 +264,14 @@ class FieldSmoother mesh.face[i].PD2()=dir2*Norm2; } #else + (void)mesh; + (void)HardI; + (void)HardD; + (void)SoftI; + (void)SoftD; + (void)SoftW; + (void)alpha_soft; + (void)Ndir; assert(0); #endif } From 02c4e32a1fa47b56788e904032d0f61f7b710b11 Mon Sep 17 00:00:00 2001 From: gabryon99 Date: Mon, 13 Sep 2021 19:29:54 +0200 Subject: [PATCH 12/56] add OccupancyGrid class --- CMakeLists.txt | 1 + vcg/complex/algorithms/occupancy_grid.h | 435 ++++++++++++++++++++++++ 2 files changed, 436 insertions(+) create mode 100644 vcg/complex/algorithms/occupancy_grid.h diff --git a/CMakeLists.txt b/CMakeLists.txt index acc67cd0c..60fc296a0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,6 +72,7 @@ set(VCG_HEADERS vcg/complex/algorithms/polygonal_algorithms.h vcg/complex/algorithms/inertia.h vcg/complex/algorithms/mesh_assert.h + vcg/complex/algorithms/occupancy_grid.h vcg/complex/algorithms/cut_tree.h vcg/complex/algorithms/nring.h vcg/complex/algorithms/tetra/tetfuse_collapse.h diff --git a/vcg/complex/algorithms/occupancy_grid.h b/vcg/complex/algorithms/occupancy_grid.h new file mode 100644 index 000000000..bcd6148c5 --- /dev/null +++ b/vcg/complex/algorithms/occupancy_grid.h @@ -0,0 +1,435 @@ +#include + +#include +#include + +#ifndef VCGLIB_OCCUPANCY_GRID_H +#define VCGLIB_OCCUPANCY_GRID_H + +#define OG_MAX_MCB_SIZE 2048 +#define OG_MESH_INFO_MAX_STAT 64 + +namespace vcg { + namespace tri { + + template + class OccupancyGrid { + + private: + + GridStaticObj G; + + int mn; + int TotalArea; + /** + * Maximum number of meshes that cross a cell + */ + int MaxCount; + + /** + * SortedVisual Arcs + */ + std::vector SVA; // SortedVirtual Arcs; + /** + * High level information for each mesh. Mapped by mesh id + */ + std::map VM; + + public: + + /** + * Class to keep for each voxel the id of the mesh passing through it. + * based on bitset + */ + class MeshCounter { + + private: + std::bitset cnt; + + public: + + static constexpr int MaxVal() { + return OG_MAX_MCB_SIZE; + } + + bool Empty() const { + return cnt.none(); + } + + void Clear() { + cnt.reset(); + } + + bool IsSet(size_t i) const { + return cnt.test(i); + } + + void Set(size_t i) { + cnt.set(i); + } + + void UnSet(size_t i) { + cnt.reset(i); + } + + size_t Count() const { + return cnt.count(); + } + + /** + * Return a vector with all the id of the meshes + */ + void Pack(std::vector &v) const { + + v.clear(); + + for (size_t i = 0; i < MeshCounter::MaxVal(); ++i) { + if (cnt.test(i) { + v.push_back(i); + } + } + } + + bool operator < (const MeshCounter &c) const { + + if (cnt==c.cnt) return false; + + size_t ii = 0; + + while (ii < MeshCounter::MaxVal()){ + if (cnt[ii]!=c.cnt[ii]) { + return cnt[ii] < c.cnt[ii]; + } + ++ii; + } + return false; + } + }; + + /** + * Class for collecting cumulative information about each mesh in the OG. + * This info are collected in the Compute() by scanning the OG after we filled it with all the meshes. + */ + class OGMeshInfo { + + public: + + int id; // the id of the mesh + int area; // number of voxels in the OG touched by this mesh + int coverage; // quanto e' ricoperta da altre mesh eccetto se stessa (eg: se ho due mesh di 1000 con overlap al 30% la covrg e' 300) + + bool used = false; + + std::vector densityDistribution; // Distribution of the of the density of the voxels touched by this mesh: + // densityDistribution[i] says how many voxel (among the ones coverd by this mesh) + // are covered by othermeshes. Sum(densityDistribution) == area; + // if densityDistribution[1] > 0 means that this mesh is the unique to cover some portion of the space. + + OGMeshInfo() { + Init(-1); + } + + void Init(int _id) { + coverage=0;area=0; id=_id; + } + + bool operator < (OGMeshInfo &o) const { + return area < o.area; + } + + static constexpr int MaxStat() { + return OG_MESH_INFO_MAX_STAT; + } + }; + + /** + * Classe con informazioni su un arco plausibile + */ + class OGArcInfo { + public: + + enum sort { + AREA, + NORM_AREA, + DEGREE + }; + + int s,t; // source and target (come indici nel gruppo corrente) + int area; // + float norm_area; + + OGArcInfo(int _s, int _t, int _area, float _n) : s{_s}, t{_t}, area{_area}, norm_area{_n} {} + OGArcInfo(int _s, int _t, int _area) s{_s}, t{_t}, area{_area} {} + + bool operator < (const OGArcInfo &p) const { + return norm_area < p.norm_area; + } + }; + + bool Init(int _mn, Box3d bb, int size) { + + // the number of meshes (including all the unused ones; eg it is the range of the possible id) + mn = _mn; + if (mn > MeshCounter::MaxVal()) return false; + + MeshCounter MC; + + MC.Clear(); + G.Create(bb,size,MC); + VM.clear(); + + return true; + } + + void Add(const char *MeshName, Matrix44d &Tr, int id) { + + AlignPair::A2Mesh M; + + vcg::tri::io::Importer::Open(M,MeshName); + vcg::tri::Clean::RemoveUnreferencedVertex(M); + + AddMesh(M,Tr,id); + } + + void AddMeshes(std::vector &names, std::vector &trv,int size) { + + Box3d bb, totalbb; + + bb.SetNull(); + totalbb.SetNull(); + + std::fprintf(stdout, "OG::AddMesh:Scanning BBoxex\n"); + + for (std::size_t i = 0; i < names.size(); ++i) { + ply::ScanBBox(names[i].c_str(),bb); + totalbb.Add(trv[i], bb); + } + + Init(names.size(),totalbb,size); + + for (std::size_t i = 0; i < names.size(); ++i) { + std::fprintf(stdout, "OG::AddMesh:Adding Mesh %i '%s'\n", i, names[i].c_str()); + Add(names[i].c_str(),trv[i],i); + } + } + + void AddMesh(MeshType &mesh, const Matrix44d &Tr, int ind) { + + Matrix44f Trf; + Trf.Import(Tr); + + for (auto vi = std::begin(M.vert); vi != std::end(M.vert); ++vi) { + + if (!(*vi).IsD()) { + G.Grid( Trf * Point3f::Construct((*vi).P()) ).Set(ind); + } + } + + VM[ind].Init(ind); + VM[ind].used = true; + } + + void RemoveMesh(int id) { + + MeshCounter *GridEnd = G.grid+G.size(); + + for (MeshCounter* ig = G.grid; ig != GridEnd; ++ig) { + ig->UnSet(id); + } + } + + /** + * This function is called after we have all the mesh to the OG + * to collect the information about the interferences between the various meshes. + */ + void Compute() { + + // Analisi della griglia + // Si deve trovare l'insieme degli archi piu'plausibili + // un arco ha "senso" in una cella se entrambe le mesh compaiono in quell'arco + // Si considera tutti gli archi possibili e si conta in quante celle ha senso un arco + + std::vector VA; // virtual arcs + VA.resize(mn * mn, 0); + + std::map, int> VAMap; + + // First Loop: + // Scan the grid and update possible arc count + for (int i = 0; i < G.siz[0]; ++i) { + + for (int j = 0; j < G.siz[1]; ++j) { + + for (int k = 0; k < G.siz[2]; ++k) { + + std::vector vv; + G.Grid(i, j, k).Pack(vv); + std::size_t meshInCell = vv.size(); + + for (std::size_t ii = 0; ii < vv.size(); ++ii) { + + OccupancyGrid::OGMeshInfo &omi_ii = VM[vv[ii]]; + + ++omi_ii.area; // compute mesh area + if (meshInCell > omi_ii.densityDistribution.size()) { + omi_ii.densityDistribution.resize(meshInCell); + } + + ++(omi_ii.densityDistribution[meshInCell - 1]); + } + + for (std::size_t ii = 0; ii < vv.size(); ++ii) { + for (std::size_t jj = ii + 1; jj < vv.size(); ++jj) { + // count intersections of all mesh pairs + ++VAMap[std::make_pair(vv[ii], vv[jj])]; + } + } + } + } + } + + // Find all the arcs, e.g. all the pair of meshes + SVA.clear(); + for (auto vi = std::begin(VAMap); vi != std::end(VAMap); ++vi) { + if (vi->second > 0) { + int m_s = vi->first.first; + int m_t = vi->first.second; + int area = vi->second; + SVA.push_back( OGArcInfo (m_s,m_t,area,float(area)/float(min(VM[m_s].area,VM[m_t].area)) )); + } + } + + // Compute Mesh Coverage + for (std::size_t i = 0; i < SVA.size(); ++i) { + VM[SVA[i].s].coverage += SVA[i].area; + VM[SVA[i].t].coverage += SVA[i].area; + } + + std::sort(std::begin(SVA), std::end(SVA)); + std::reverse(std::begin(SVA), std::end(SVA)); + } + + void ComputeUsefulMesh(FILE *elfp) { + + int mcnt = 0; + std::vector UpdArea(mn); + std::vector UpdCovg(mn); + + for (std::size_t m = 0; m < mn; ++m) { + + if (VM[m].used && VM[m].area > 0) { + mcnt++; + UpdCovg[m]=VM[m].coverage; + UpdArea[m]=VM[m].area; + } + } + + int sz = G.size(); + if (elfp) { + std::fprintf(elfp, "\n\nComputing Usefulness of Meshes of %i(on %i) meshes\n Og with %i / %i fill ratio %i max mesh per cell\n\n", mcnt, mn, TotalArea, sz, MaxCount); + std::fprintf(elfp, "\n"); + } + + int CumArea = 0; + + for (std::size_t m = 0; m < mn-1; ++m) { + + int best = max_element(std::begin(UpdArea), std::end(UpdArea)) - std::begin(UpdArea); + + CumArea += UpdArea[best]; + if (UpdCovg[best] < 0) break; + + // se era una mesh fuori del working group si salta tutto. + if (VM[best].area == 0) continue; + + if (elfp) { + fprintf(elfp, "%3i %3i %7i (%7i) %7i %5.2f %7i(%7i)\n", + m, best, UpdArea[best], VM[best].area, TotalArea - CumArea, + 100.0 - 100 * float(CumArea) / TotalArea, UpdCovg[best], VM[best].coverage); + } + + UpdArea[best] = -1; + UpdCovg[best] = -1; + + for (std::size_t i = 0; i < sz; ++i) { + + MeshCounter &mc = G.grid[i]; + + if (mc.IsSet(best)) { + + mc.UnSet(best); + + for (std::size_t j = 0; j < mn; ++j) { + if (mc.IsSet(j)) { + --UpdArea[j]; + UpdCovg[j]-=mc.Count(); + } + } + + mc.Clear(); + } + } + } + } + + void Dump(FILE *fp) { + + std::fprintf(fp, "Occupancy Grid\n"); + std::fprintf(fp, "grid of ~%i kcells: %d x %d x %d\n", G.size(), G.siz[0], G.siz[1], G.siz[2]); + std::fprintf(fp, "grid voxel size of %f %f %f\n", G.voxel[0], G.voxel[1], G.voxel[2]); + + std::fprintf(fp,"Computed %lu arcs for %i meshes\n", SVA.size(), mn); + + for (std::size_t i=0;i(8), VM[i].densityDistribution.size()); ++j) { + std::fprintf(fp," %3i ", VM[i].densityDistribution[j]); + } + + std::fprintf(fp,"\n"); + } + else { + std::fprintf(fp, "mesh %3lu ---- UNUSED\n", i); + } + } + + std::fprintf(fp, "Computed %lu Arcs :\n", SVA.size()); + + for (std::size_t i = 0; i .1; ++i) { + std::fprintf(fp, "%4i -> %4i Area:%5i NormArea:%5.3f\n", SVA[i].s, SVA[i].t, SVA[i].area, SVA[i].norm_area); + } + + std::fprintf(fp, "End OG Dump\n"); + } + + void ComputeTotalArea() { + + using uint = unsigned int; + + int ccnt = 0; + MaxCount = 0; + + int sz=G.size(); + + for (int i = 0; i < sz; ++i) + + if (!G.grid[i].Empty()) { + + ccnt++; + if (G.grid[i].Count() > static_cast(MaxCount)) { + MaxCount = G.grid[i].Count(); + } + } + + TotalArea = ccnt; + } + + }; + } +} + +#endif //VCGLIB_OCCUPANCY_GRID_H From 6f38a1adc6a23aab4c128c8f79e75bd49324810d Mon Sep 17 00:00:00 2001 From: gabryon99 Date: Mon, 13 Sep 2021 19:34:50 +0200 Subject: [PATCH 13/56] removed tri namespace from OccupancyGrid --- vcg/complex/algorithms/occupancy_grid.h | 571 ++++++++++++------------ 1 file changed, 284 insertions(+), 287 deletions(-) diff --git a/vcg/complex/algorithms/occupancy_grid.h b/vcg/complex/algorithms/occupancy_grid.h index bcd6148c5..5272f9462 100644 --- a/vcg/complex/algorithms/occupancy_grid.h +++ b/vcg/complex/algorithms/occupancy_grid.h @@ -10,426 +10,423 @@ #define OG_MESH_INFO_MAX_STAT 64 namespace vcg { - namespace tri { + template + class OccupancyGrid { - template - class OccupancyGrid { + private: - private: + GridStaticObj G; - GridStaticObj G; + int mn; + int TotalArea; + /** + * Maximum number of meshes that cross a cell + */ + int MaxCount; - int mn; - int TotalArea; - /** - * Maximum number of meshes that cross a cell - */ - int MaxCount; + /** + * SortedVisual Arcs + */ + std::vector SVA; // SortedVirtual Arcs; + /** + * High level information for each mesh. Mapped by mesh id + */ + std::map VM; - /** - * SortedVisual Arcs - */ - std::vector SVA; // SortedVirtual Arcs; - /** - * High level information for each mesh. Mapped by mesh id - */ - std::map VM; + public: - public: - - /** - * Class to keep for each voxel the id of the mesh passing through it. - * based on bitset - */ - class MeshCounter { + /** + * Class to keep for each voxel the id of the mesh passing through it. + * based on bitset + */ + class MeshCounter { - private: - std::bitset cnt; + private: + std::bitset cnt; - public: + public: - static constexpr int MaxVal() { - return OG_MAX_MCB_SIZE; - } + static constexpr int MaxVal() { + return OG_MAX_MCB_SIZE; + } - bool Empty() const { - return cnt.none(); - } + bool Empty() const { + return cnt.none(); + } - void Clear() { - cnt.reset(); - } + void Clear() { + cnt.reset(); + } - bool IsSet(size_t i) const { - return cnt.test(i); - } + bool IsSet(size_t i) const { + return cnt.test(i); + } - void Set(size_t i) { - cnt.set(i); - } + void Set(size_t i) { + cnt.set(i); + } - void UnSet(size_t i) { - cnt.reset(i); - } + void UnSet(size_t i) { + cnt.reset(i); + } - size_t Count() const { - return cnt.count(); - } + size_t Count() const { + return cnt.count(); + } - /** - * Return a vector with all the id of the meshes - */ - void Pack(std::vector &v) const { + /** + * Return a vector with all the id of the meshes + */ + void Pack(std::vector &v) const { - v.clear(); + v.clear(); - for (size_t i = 0; i < MeshCounter::MaxVal(); ++i) { - if (cnt.test(i) { - v.push_back(i); - } + for (size_t i = 0; i < MeshCounter::MaxVal(); ++i) { + if (cnt.test(i) { + v.push_back(i); } } + } - bool operator < (const MeshCounter &c) const { + bool operator < (const MeshCounter &c) const { - if (cnt==c.cnt) return false; + if (cnt==c.cnt) return false; - size_t ii = 0; + size_t ii = 0; - while (ii < MeshCounter::MaxVal()){ - if (cnt[ii]!=c.cnt[ii]) { - return cnt[ii] < c.cnt[ii]; - } - ++ii; + while (ii < MeshCounter::MaxVal()){ + if (cnt[ii]!=c.cnt[ii]) { + return cnt[ii] < c.cnt[ii]; } - return false; + ++ii; } - }; + return false; + } + }; - /** - * Class for collecting cumulative information about each mesh in the OG. - * This info are collected in the Compute() by scanning the OG after we filled it with all the meshes. - */ - class OGMeshInfo { + /** + * Class for collecting cumulative information about each mesh in the OG. + * This info are collected in the Compute() by scanning the OG after we filled it with all the meshes. + */ + class OGMeshInfo { - public: + public: - int id; // the id of the mesh - int area; // number of voxels in the OG touched by this mesh - int coverage; // quanto e' ricoperta da altre mesh eccetto se stessa (eg: se ho due mesh di 1000 con overlap al 30% la covrg e' 300) + int id; // the id of the mesh + int area; // number of voxels in the OG touched by this mesh + int coverage; // quanto e' ricoperta da altre mesh eccetto se stessa (eg: se ho due mesh di 1000 con overlap al 30% la covrg e' 300) - bool used = false; + bool used = false; - std::vector densityDistribution; // Distribution of the of the density of the voxels touched by this mesh: - // densityDistribution[i] says how many voxel (among the ones coverd by this mesh) - // are covered by othermeshes. Sum(densityDistribution) == area; - // if densityDistribution[1] > 0 means that this mesh is the unique to cover some portion of the space. + std::vector densityDistribution; // Distribution of the of the density of the voxels touched by this mesh: + // densityDistribution[i] says how many voxel (among the ones coverd by this mesh) + // are covered by othermeshes. Sum(densityDistribution) == area; + // if densityDistribution[1] > 0 means that this mesh is the unique to cover some portion of the space. - OGMeshInfo() { - Init(-1); - } + OGMeshInfo() { + Init(-1); + } - void Init(int _id) { - coverage=0;area=0; id=_id; - } + void Init(int _id) { + coverage=0;area=0; id=_id; + } - bool operator < (OGMeshInfo &o) const { - return area < o.area; - } + bool operator < (OGMeshInfo &o) const { + return area < o.area; + } - static constexpr int MaxStat() { - return OG_MESH_INFO_MAX_STAT; - } - }; + static constexpr int MaxStat() { + return OG_MESH_INFO_MAX_STAT; + } + }; - /** - * Classe con informazioni su un arco plausibile - */ - class OGArcInfo { - public: + /** + * Classe con informazioni su un arco plausibile + */ + class OGArcInfo { + public: - enum sort { - AREA, - NORM_AREA, - DEGREE - }; + enum sort { + AREA, + NORM_AREA, + DEGREE + }; - int s,t; // source and target (come indici nel gruppo corrente) - int area; // - float norm_area; + int s,t; // source and target (come indici nel gruppo corrente) + int area; // + float norm_area; - OGArcInfo(int _s, int _t, int _area, float _n) : s{_s}, t{_t}, area{_area}, norm_area{_n} {} - OGArcInfo(int _s, int _t, int _area) s{_s}, t{_t}, area{_area} {} + OGArcInfo(int _s, int _t, int _area, float _n) : s{_s}, t{_t}, area{_area}, norm_area{_n} {} + OGArcInfo(int _s, int _t, int _area) s{_s}, t{_t}, area{_area} {} - bool operator < (const OGArcInfo &p) const { - return norm_area < p.norm_area; - } - }; + bool operator < (const OGArcInfo &p) const { + return norm_area < p.norm_area; + } + }; - bool Init(int _mn, Box3d bb, int size) { + bool Init(int _mn, Box3d bb, int size) { - // the number of meshes (including all the unused ones; eg it is the range of the possible id) - mn = _mn; - if (mn > MeshCounter::MaxVal()) return false; + // the number of meshes (including all the unused ones; eg it is the range of the possible id) + mn = _mn; + if (mn > MeshCounter::MaxVal()) return false; - MeshCounter MC; + MeshCounter MC; - MC.Clear(); - G.Create(bb,size,MC); - VM.clear(); + MC.Clear(); + G.Create(bb,size,MC); + VM.clear(); - return true; - } + return true; + } - void Add(const char *MeshName, Matrix44d &Tr, int id) { + void Add(const char *MeshName, Matrix44d &Tr, int id) { - AlignPair::A2Mesh M; + AlignPair::A2Mesh M; - vcg::tri::io::Importer::Open(M,MeshName); - vcg::tri::Clean::RemoveUnreferencedVertex(M); + vcg::tri::io::Importer::Open(M,MeshName); + vcg::tri::Clean::RemoveUnreferencedVertex(M); - AddMesh(M,Tr,id); - } + AddMesh(M,Tr,id); + } - void AddMeshes(std::vector &names, std::vector &trv,int size) { + void AddMeshes(std::vector &names, std::vector &trv,int size) { - Box3d bb, totalbb; + Box3d bb, totalbb; - bb.SetNull(); - totalbb.SetNull(); + bb.SetNull(); + totalbb.SetNull(); - std::fprintf(stdout, "OG::AddMesh:Scanning BBoxex\n"); + std::fprintf(stdout, "OG::AddMesh:Scanning BBoxex\n"); - for (std::size_t i = 0; i < names.size(); ++i) { - ply::ScanBBox(names[i].c_str(),bb); - totalbb.Add(trv[i], bb); - } + for (std::size_t i = 0; i < names.size(); ++i) { + ply::ScanBBox(names[i].c_str(),bb); + totalbb.Add(trv[i], bb); + } - Init(names.size(),totalbb,size); + Init(names.size(),totalbb,size); - for (std::size_t i = 0; i < names.size(); ++i) { - std::fprintf(stdout, "OG::AddMesh:Adding Mesh %i '%s'\n", i, names[i].c_str()); - Add(names[i].c_str(),trv[i],i); - } + for (std::size_t i = 0; i < names.size(); ++i) { + std::fprintf(stdout, "OG::AddMesh:Adding Mesh %i '%s'\n", i, names[i].c_str()); + Add(names[i].c_str(),trv[i],i); } + } - void AddMesh(MeshType &mesh, const Matrix44d &Tr, int ind) { + void AddMesh(MeshType &mesh, const Matrix44d &Tr, int ind) { - Matrix44f Trf; - Trf.Import(Tr); + Matrix44f Trf; + Trf.Import(Tr); - for (auto vi = std::begin(M.vert); vi != std::end(M.vert); ++vi) { + for (auto vi = std::begin(M.vert); vi != std::end(M.vert); ++vi) { - if (!(*vi).IsD()) { - G.Grid( Trf * Point3f::Construct((*vi).P()) ).Set(ind); - } + if (!(*vi).IsD()) { + G.Grid( Trf * Point3f::Construct((*vi).P()) ).Set(ind); } - - VM[ind].Init(ind); - VM[ind].used = true; } - void RemoveMesh(int id) { + VM[ind].Init(ind); + VM[ind].used = true; + } - MeshCounter *GridEnd = G.grid+G.size(); + void RemoveMesh(int id) { - for (MeshCounter* ig = G.grid; ig != GridEnd; ++ig) { - ig->UnSet(id); - } - } + MeshCounter *GridEnd = G.grid+G.size(); - /** - * This function is called after we have all the mesh to the OG - * to collect the information about the interferences between the various meshes. - */ - void Compute() { + for (MeshCounter* ig = G.grid; ig != GridEnd; ++ig) { + ig->UnSet(id); + } + } - // Analisi della griglia - // Si deve trovare l'insieme degli archi piu'plausibili - // un arco ha "senso" in una cella se entrambe le mesh compaiono in quell'arco - // Si considera tutti gli archi possibili e si conta in quante celle ha senso un arco + /** + * This function is called after we have all the mesh to the OG + * to collect the information about the interferences between the various meshes. + */ + void Compute() { - std::vector VA; // virtual arcs - VA.resize(mn * mn, 0); + // Analisi della griglia + // Si deve trovare l'insieme degli archi piu'plausibili + // un arco ha "senso" in una cella se entrambe le mesh compaiono in quell'arco + // Si considera tutti gli archi possibili e si conta in quante celle ha senso un arco - std::map, int> VAMap; + std::vector VA; // virtual arcs + VA.resize(mn * mn, 0); - // First Loop: - // Scan the grid and update possible arc count - for (int i = 0; i < G.siz[0]; ++i) { + std::map, int> VAMap; - for (int j = 0; j < G.siz[1]; ++j) { + // First Loop: + // Scan the grid and update possible arc count + for (int i = 0; i < G.siz[0]; ++i) { - for (int k = 0; k < G.siz[2]; ++k) { + for (int j = 0; j < G.siz[1]; ++j) { - std::vector vv; - G.Grid(i, j, k).Pack(vv); - std::size_t meshInCell = vv.size(); + for (int k = 0; k < G.siz[2]; ++k) { - for (std::size_t ii = 0; ii < vv.size(); ++ii) { + std::vector vv; + G.Grid(i, j, k).Pack(vv); + std::size_t meshInCell = vv.size(); - OccupancyGrid::OGMeshInfo &omi_ii = VM[vv[ii]]; + for (std::size_t ii = 0; ii < vv.size(); ++ii) { - ++omi_ii.area; // compute mesh area - if (meshInCell > omi_ii.densityDistribution.size()) { - omi_ii.densityDistribution.resize(meshInCell); - } + OccupancyGrid::OGMeshInfo &omi_ii = VM[vv[ii]]; - ++(omi_ii.densityDistribution[meshInCell - 1]); + ++omi_ii.area; // compute mesh area + if (meshInCell > omi_ii.densityDistribution.size()) { + omi_ii.densityDistribution.resize(meshInCell); } - for (std::size_t ii = 0; ii < vv.size(); ++ii) { - for (std::size_t jj = ii + 1; jj < vv.size(); ++jj) { - // count intersections of all mesh pairs - ++VAMap[std::make_pair(vv[ii], vv[jj])]; - } - } + ++(omi_ii.densityDistribution[meshInCell - 1]); } - } - } - // Find all the arcs, e.g. all the pair of meshes - SVA.clear(); - for (auto vi = std::begin(VAMap); vi != std::end(VAMap); ++vi) { - if (vi->second > 0) { - int m_s = vi->first.first; - int m_t = vi->first.second; - int area = vi->second; - SVA.push_back( OGArcInfo (m_s,m_t,area,float(area)/float(min(VM[m_s].area,VM[m_t].area)) )); + for (std::size_t ii = 0; ii < vv.size(); ++ii) { + for (std::size_t jj = ii + 1; jj < vv.size(); ++jj) { + // count intersections of all mesh pairs + ++VAMap[std::make_pair(vv[ii], vv[jj])]; + } + } } } + } - // Compute Mesh Coverage - for (std::size_t i = 0; i < SVA.size(); ++i) { - VM[SVA[i].s].coverage += SVA[i].area; - VM[SVA[i].t].coverage += SVA[i].area; + // Find all the arcs, e.g. all the pair of meshes + SVA.clear(); + for (auto vi = std::begin(VAMap); vi != std::end(VAMap); ++vi) { + if (vi->second > 0) { + int m_s = vi->first.first; + int m_t = vi->first.second; + int area = vi->second; + SVA.push_back( OGArcInfo (m_s,m_t,area,float(area)/float(min(VM[m_s].area,VM[m_t].area)) )); } + } - std::sort(std::begin(SVA), std::end(SVA)); - std::reverse(std::begin(SVA), std::end(SVA)); + // Compute Mesh Coverage + for (std::size_t i = 0; i < SVA.size(); ++i) { + VM[SVA[i].s].coverage += SVA[i].area; + VM[SVA[i].t].coverage += SVA[i].area; } - void ComputeUsefulMesh(FILE *elfp) { + std::sort(std::begin(SVA), std::end(SVA)); + std::reverse(std::begin(SVA), std::end(SVA)); + } - int mcnt = 0; - std::vector UpdArea(mn); - std::vector UpdCovg(mn); + void ComputeUsefulMesh(FILE *elfp) { - for (std::size_t m = 0; m < mn; ++m) { + int mcnt = 0; + std::vector UpdArea(mn); + std::vector UpdCovg(mn); - if (VM[m].used && VM[m].area > 0) { - mcnt++; - UpdCovg[m]=VM[m].coverage; - UpdArea[m]=VM[m].area; - } - } + for (std::size_t m = 0; m < mn; ++m) { - int sz = G.size(); - if (elfp) { - std::fprintf(elfp, "\n\nComputing Usefulness of Meshes of %i(on %i) meshes\n Og with %i / %i fill ratio %i max mesh per cell\n\n", mcnt, mn, TotalArea, sz, MaxCount); - std::fprintf(elfp, "\n"); + if (VM[m].used && VM[m].area > 0) { + mcnt++; + UpdCovg[m]=VM[m].coverage; + UpdArea[m]=VM[m].area; } + } - int CumArea = 0; + int sz = G.size(); + if (elfp) { + std::fprintf(elfp, "\n\nComputing Usefulness of Meshes of %i(on %i) meshes\n Og with %i / %i fill ratio %i max mesh per cell\n\n", mcnt, mn, TotalArea, sz, MaxCount); + std::fprintf(elfp, "\n"); + } - for (std::size_t m = 0; m < mn-1; ++m) { + int CumArea = 0; - int best = max_element(std::begin(UpdArea), std::end(UpdArea)) - std::begin(UpdArea); + for (std::size_t m = 0; m < mn-1; ++m) { - CumArea += UpdArea[best]; - if (UpdCovg[best] < 0) break; + int best = max_element(std::begin(UpdArea), std::end(UpdArea)) - std::begin(UpdArea); - // se era una mesh fuori del working group si salta tutto. - if (VM[best].area == 0) continue; + CumArea += UpdArea[best]; + if (UpdCovg[best] < 0) break; - if (elfp) { - fprintf(elfp, "%3i %3i %7i (%7i) %7i %5.2f %7i(%7i)\n", - m, best, UpdArea[best], VM[best].area, TotalArea - CumArea, - 100.0 - 100 * float(CumArea) / TotalArea, UpdCovg[best], VM[best].coverage); - } + // se era una mesh fuori del working group si salta tutto. + if (VM[best].area == 0) continue; - UpdArea[best] = -1; - UpdCovg[best] = -1; + if (elfp) { + fprintf(elfp, "%3i %3i %7i (%7i) %7i %5.2f %7i(%7i)\n", + m, best, UpdArea[best], VM[best].area, TotalArea - CumArea, + 100.0 - 100 * float(CumArea) / TotalArea, UpdCovg[best], VM[best].coverage); + } - for (std::size_t i = 0; i < sz; ++i) { + UpdArea[best] = -1; + UpdCovg[best] = -1; - MeshCounter &mc = G.grid[i]; + for (std::size_t i = 0; i < sz; ++i) { - if (mc.IsSet(best)) { + MeshCounter &mc = G.grid[i]; - mc.UnSet(best); + if (mc.IsSet(best)) { - for (std::size_t j = 0; j < mn; ++j) { - if (mc.IsSet(j)) { - --UpdArea[j]; - UpdCovg[j]-=mc.Count(); - } - } + mc.UnSet(best); - mc.Clear(); + for (std::size_t j = 0; j < mn; ++j) { + if (mc.IsSet(j)) { + --UpdArea[j]; + UpdCovg[j]-=mc.Count(); + } } + + mc.Clear(); } } } + } - void Dump(FILE *fp) { - - std::fprintf(fp, "Occupancy Grid\n"); - std::fprintf(fp, "grid of ~%i kcells: %d x %d x %d\n", G.size(), G.siz[0], G.siz[1], G.siz[2]); - std::fprintf(fp, "grid voxel size of %f %f %f\n", G.voxel[0], G.voxel[1], G.voxel[2]); + void Dump(FILE *fp) { - std::fprintf(fp,"Computed %lu arcs for %i meshes\n", SVA.size(), mn); + std::fprintf(fp, "Occupancy Grid\n"); + std::fprintf(fp, "grid of ~%i kcells: %d x %d x %d\n", G.size(), G.siz[0], G.siz[1], G.siz[2]); + std::fprintf(fp, "grid voxel size of %f %f %f\n", G.voxel[0], G.voxel[1], G.voxel[2]); - for (std::size_t i=0;i(8), VM[i].densityDistribution.size()); ++j) { - std::fprintf(fp," %3i ", VM[i].densityDistribution[j]); - } + std::fprintf(fp, "mesh %3lu area %6i covg %7i (%5.2f%%) DensDistr:", i, VM[i].area, VM[i].coverage, float(VM[i].coverage)/float(VM[i].area)); - std::fprintf(fp,"\n"); - } - else { - std::fprintf(fp, "mesh %3lu ---- UNUSED\n", i); + for (std::size_t j = 0; j < std::min(static_cast(8), VM[i].densityDistribution.size()); ++j) { + std::fprintf(fp," %3i ", VM[i].densityDistribution[j]); } - } - std::fprintf(fp, "Computed %lu Arcs :\n", SVA.size()); - - for (std::size_t i = 0; i .1; ++i) { - std::fprintf(fp, "%4i -> %4i Area:%5i NormArea:%5.3f\n", SVA[i].s, SVA[i].t, SVA[i].area, SVA[i].norm_area); + std::fprintf(fp,"\n"); + } + else { + std::fprintf(fp, "mesh %3lu ---- UNUSED\n", i); } + } - std::fprintf(fp, "End OG Dump\n"); + std::fprintf(fp, "Computed %lu Arcs :\n", SVA.size()); + + for (std::size_t i = 0; i .1; ++i) { + std::fprintf(fp, "%4i -> %4i Area:%5i NormArea:%5.3f\n", SVA[i].s, SVA[i].t, SVA[i].area, SVA[i].norm_area); } - void ComputeTotalArea() { + std::fprintf(fp, "End OG Dump\n"); + } - using uint = unsigned int; + void ComputeTotalArea() { - int ccnt = 0; - MaxCount = 0; + using uint = unsigned int; - int sz=G.size(); + int ccnt = 0; + MaxCount = 0; - for (int i = 0; i < sz; ++i) + int sz=G.size(); - if (!G.grid[i].Empty()) { + for (int i = 0; i < sz; ++i) - ccnt++; - if (G.grid[i].Count() > static_cast(MaxCount)) { - MaxCount = G.grid[i].Count(); - } + if (!G.grid[i].Empty()) { + + ccnt++; + if (G.grid[i].Count() > static_cast(MaxCount)) { + MaxCount = G.grid[i].Count(); } + } - TotalArea = ccnt; - } + TotalArea = ccnt; + } - }; - } + }; } #endif //VCGLIB_OCCUPANCY_GRID_H From 8928fbbe6bfcc9b15b45a86e427ce765bdd09eac Mon Sep 17 00:00:00 2001 From: gabryon99 Date: Mon, 13 Sep 2021 19:37:26 +0200 Subject: [PATCH 14/56] fixes --- vcg/complex/algorithms/occupancy_grid.h | 40 ++++++++++++------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/vcg/complex/algorithms/occupancy_grid.h b/vcg/complex/algorithms/occupancy_grid.h index 5272f9462..6bb150673 100644 --- a/vcg/complex/algorithms/occupancy_grid.h +++ b/vcg/complex/algorithms/occupancy_grid.h @@ -13,26 +13,6 @@ namespace vcg { template class OccupancyGrid { - private: - - GridStaticObj G; - - int mn; - int TotalArea; - /** - * Maximum number of meshes that cross a cell - */ - int MaxCount; - - /** - * SortedVisual Arcs - */ - std::vector SVA; // SortedVirtual Arcs; - /** - * High level information for each mesh. Mapped by mesh id - */ - std::map VM; - public: /** @@ -426,6 +406,26 @@ namespace vcg { TotalArea = ccnt; } + private: + + GridStaticObj G; + + int mn; + int TotalArea; + /** + * Maximum number of meshes that cross a cell + */ + int MaxCount; + + /** + * SortedVisual Arcs + */ + std::vector SVA; // SortedVirtual Arcs; + /** + * High level information for each mesh. Mapped by mesh id + */ + std::map VM; + }; } From 2a5c9bfb6177bf24707fd90b299f2da8f2e60643 Mon Sep 17 00:00:00 2001 From: gabryon99 Date: Mon, 13 Sep 2021 20:28:45 +0200 Subject: [PATCH 15/56] fix typos --- vcg/complex/algorithms/occupancy_grid.h | 55 +++++++++++++------------ 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/vcg/complex/algorithms/occupancy_grid.h b/vcg/complex/algorithms/occupancy_grid.h index 6bb150673..e37422463 100644 --- a/vcg/complex/algorithms/occupancy_grid.h +++ b/vcg/complex/algorithms/occupancy_grid.h @@ -3,6 +3,9 @@ #include #include +#include +#include + #ifndef VCGLIB_OCCUPANCY_GRID_H #define VCGLIB_OCCUPANCY_GRID_H @@ -62,7 +65,7 @@ namespace vcg { v.clear(); for (size_t i = 0; i < MeshCounter::MaxVal(); ++i) { - if (cnt.test(i) { + if (cnt.test(i)) { v.push_back(i); } } @@ -132,18 +135,36 @@ namespace vcg { DEGREE }; - int s,t; // source and target (come indici nel gruppo corrente) + int s, t; // source and target (come indici nel gruppo corrente) int area; // float norm_area; OGArcInfo(int _s, int _t, int _area, float _n) : s{_s}, t{_t}, area{_area}, norm_area{_n} {} - OGArcInfo(int _s, int _t, int _area) s{_s}, t{_t}, area{_area} {} + OGArcInfo(int _s, int _t, int _area) : s{_s}, t{_t}, area{_area} {} bool operator < (const OGArcInfo &p) const { return norm_area < p.norm_area; } }; + GridStaticObj G; + + int mn; + int TotalArea; + /** + * Maximum number of meshes that cross a cell + */ + int MaxCount; + + /** + * SortedVisual Arcs + */ + std::vector SVA; // SortedVirtual Arcs; + /** + * High level information for each mesh. Mapped by mesh id + */ + std::map VM; + bool Init(int _mn, Box3d bb, int size) { // the number of meshes (including all the unused ones; eg it is the range of the possible id) @@ -163,8 +184,8 @@ namespace vcg { AlignPair::A2Mesh M; - vcg::tri::io::Importer::Open(M,MeshName); - vcg::tri::Clean::RemoveUnreferencedVertex(M); + vcg::tri::io::Importer::Open(M, MeshName); + vcg::tri::Clean::RemoveUnreferencedVertex(M); AddMesh(M,Tr,id); } @@ -179,7 +200,7 @@ namespace vcg { std::fprintf(stdout, "OG::AddMesh:Scanning BBoxex\n"); for (std::size_t i = 0; i < names.size(); ++i) { - ply::ScanBBox(names[i].c_str(),bb); + vcg::ply::ScanBBox(names[i].c_str(),bb); totalbb.Add(trv[i], bb); } @@ -196,7 +217,7 @@ namespace vcg { Matrix44f Trf; Trf.Import(Tr); - for (auto vi = std::begin(M.vert); vi != std::end(M.vert); ++vi) { + for (auto vi = std::begin(mesh.vert); vi != std::end(mesh.vert); ++vi) { if (!(*vi).IsD()) { G.Grid( Trf * Point3f::Construct((*vi).P()) ).Set(ind); @@ -406,26 +427,6 @@ namespace vcg { TotalArea = ccnt; } - private: - - GridStaticObj G; - - int mn; - int TotalArea; - /** - * Maximum number of meshes that cross a cell - */ - int MaxCount; - - /** - * SortedVisual Arcs - */ - std::vector SVA; // SortedVirtual Arcs; - /** - * High level information for each mesh. Mapped by mesh id - */ - std::map VM; - }; } From 4595f3220251412b64911383f61ff027a208519c Mon Sep 17 00:00:00 2001 From: gabryon99 Date: Mon, 13 Sep 2021 21:05:08 +0200 Subject: [PATCH 16/56] uncommented the include of plystuff to avoid duplicate symbols --- vcg/complex/algorithms/occupancy_grid.h | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/vcg/complex/algorithms/occupancy_grid.h b/vcg/complex/algorithms/occupancy_grid.h index e37422463..1c74ae6f7 100644 --- a/vcg/complex/algorithms/occupancy_grid.h +++ b/vcg/complex/algorithms/occupancy_grid.h @@ -1,11 +1,11 @@ #include +// #include +#include + #include #include -#include -#include - #ifndef VCGLIB_OCCUPANCY_GRID_H #define VCGLIB_OCCUPANCY_GRID_H @@ -78,7 +78,7 @@ namespace vcg { size_t ii = 0; while (ii < MeshCounter::MaxVal()){ - if (cnt[ii]!=c.cnt[ii]) { + if (cnt[ii] != c.cnt[ii]) { return cnt[ii] < c.cnt[ii]; } ++ii; @@ -197,10 +197,10 @@ namespace vcg { bb.SetNull(); totalbb.SetNull(); - std::fprintf(stdout, "OG::AddMesh:Scanning BBoxex\n"); + std::fprintf(stdout, "OG::AddMesh:Scanning BBoxes\n"); for (std::size_t i = 0; i < names.size(); ++i) { - vcg::ply::ScanBBox(names[i].c_str(),bb); + // vcg::ply::ScanBBox(names[i].c_str(), bb, true); totalbb.Add(trv[i], bb); } @@ -208,7 +208,7 @@ namespace vcg { for (std::size_t i = 0; i < names.size(); ++i) { std::fprintf(stdout, "OG::AddMesh:Adding Mesh %i '%s'\n", i, names[i].c_str()); - Add(names[i].c_str(),trv[i],i); + Add(names[i].c_str(), trv[i], i); } } @@ -220,7 +220,7 @@ namespace vcg { for (auto vi = std::begin(mesh.vert); vi != std::end(mesh.vert); ++vi) { if (!(*vi).IsD()) { - G.Grid( Trf * Point3f::Construct((*vi).P()) ).Set(ind); + G.Grid(Trf * Point3f::Construct((*vi).P())).Set(ind); } } @@ -230,7 +230,7 @@ namespace vcg { void RemoveMesh(int id) { - MeshCounter *GridEnd = G.grid+G.size(); + MeshCounter *GridEnd = G.grid + G.size(); for (MeshCounter* ig = G.grid; ig != GridEnd; ++ig) { ig->UnSet(id); @@ -294,7 +294,7 @@ namespace vcg { int m_s = vi->first.first; int m_t = vi->first.second; int area = vi->second; - SVA.push_back( OGArcInfo (m_s,m_t,area,float(area)/float(min(VM[m_s].area,VM[m_t].area)) )); + SVA.push_back( OGArcInfo (m_s,m_t,area,float(area)/float(std::min(VM[m_s].area,VM[m_t].area)) )); } } @@ -398,7 +398,7 @@ namespace vcg { std::fprintf(fp, "Computed %lu Arcs :\n", SVA.size()); - for (std::size_t i = 0; i .1; ++i) { + for (std::size_t i = 0; i < SVA.size() && SVA[i].norm_area > .1; ++i) { std::fprintf(fp, "%4i -> %4i Area:%5i NormArea:%5.3f\n", SVA[i].s, SVA[i].t, SVA[i].area, SVA[i].norm_area); } From 16de5d341c07e02e27888c590f1509d6950a8921 Mon Sep 17 00:00:00 2001 From: gabryon99 Date: Mon, 13 Sep 2021 21:34:08 +0200 Subject: [PATCH 17/56] add meshtree.h --- CMakeLists.txt | 1 + vcg/complex/algorithms/meshtree.h | 352 ++++++++++++++++++++++++++++++ 2 files changed, 353 insertions(+) create mode 100644 vcg/complex/algorithms/meshtree.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 60fc296a0..e671ab530 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,6 +73,7 @@ set(VCG_HEADERS vcg/complex/algorithms/inertia.h vcg/complex/algorithms/mesh_assert.h vcg/complex/algorithms/occupancy_grid.h + vcg/complex/algorithms/meshtree.h.h vcg/complex/algorithms/cut_tree.h vcg/complex/algorithms/nring.h vcg/complex/algorithms/tetra/tetfuse_collapse.h diff --git a/vcg/complex/algorithms/meshtree.h b/vcg/complex/algorithms/meshtree.h new file mode 100644 index 000000000..c66fadc7f --- /dev/null +++ b/vcg/complex/algorithms/meshtree.h @@ -0,0 +1,352 @@ +#ifndef VCGLIB_MESHTREE_H +#define VCGLIB_MESHTREE_H + +namespace vcg { + + template + class MeshTree { + + public: + + class MeshNode { + + public: + bool glued; + MeshType *m; + + MeshNode(MeshType *_m) : m{_m}, glued{false} {} + + vcg::Matrix44 &tr() { + return m->cm.Tr; + } + + const vcg::Box3 &bbox() const { + return m->cm.bbox; + } + + int Id() { + return m->id(); + } + }; + + class Param { + public: + int OGSize = 5000; + float arcThreshold = 0.3f; + float recalcThreshold = 0.1f; + }; + + std::map nodeMap; + std::list resultList; + + vcg::OccupancyGrid OG; + vcg::CallBackPos * cb; + + MeshType *MM(unsigned int i) { + return nodeMap[i]->m; + } + + MeshTree(); + + void clear() { + + for (auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { + delete ni->second; + } + + nodeMap.clear(); + resultList.clear(); + } + + void deleteResult(MeshTree::MeshNode *mp) { + + auto li = std::begin(resultList); + while (li != resultList.end()) { + + if (li->MovName==mp->Id() || li->FixName==mp->Id()) { + li=resultList.erase(li); + } + else { + ++li; + } + } + } + + vcg::AlignPair::Result* findResult(int id1, int id2) { + + for (auto li = std::begin(resultList); li != std::end(resultList); ++li) { + if ((li->MovName==id1 && li->FixName==id2) || (li->MovName==id2 && li->FixName==id1) ) { + return &*li; + } + } + + return 0; + } + + MeshTree::MeshNode *find(int id) { + + MeshTree::MeshNode *mp = nodeMap[id]; + + if (mp==0 || mp->Id()!=id) { + assert("You are trying to find an unexistent mesh"==0); + } + + return mp; + } + + MeshTree::MeshNode *find(MeshType *m) { + + for (auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { + if (ni->second->m==m) return ni->second; + } + + assert("You are trying to find an unexistent mesh" ==0); + return 0; + } + + int gluedNum() { + + int cnt = 0; + + for (auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { + MeshTree::MeshNode *mn=ni->second; + if (mn->glued) ++cnt; + } + + return cnt; + } + + void Process(vcg::AlignPair::Param &ap, Param &mtp) { + + // QString buf; + // cb(0,qUtf8Printable(buf.sprintf("Starting Processing of %i glued meshes out of %zu meshes\n",gluedNum(),nodeMap.size()))); + + /******* Occupancy Grid Computation *************/ + // cb(0,qUtf8Printable(buf.sprintf("Computing Overlaps %i glued meshes...\n",gluedNum() ))); + + OG.Init(static_cast(nodeMap.size()), vcg::Box3d::Construct(gluedBBox()), mtp.OGSize); + + for(auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { + MeshTree::MeshNode *mn = ni->second; + if (mn->glued) { + OG.AddMesh(mn->m->cm, vcg::Matrix44d::Construct(mn->tr()), mn->Id()); + } + } + + OG.Compute(); + OG.Dump(stdout); + // Note: the s and t of the OG translate into fix and mov, respectively. + + /*************** The long loop of arc computing **************/ + + // count existing arcs within current error threshold + float percentileThr = 0f; + if (resultList.size() > 0) { + + vcg::Distribution H; + for (auto li = std::begin(resultList); li != std::end(resultList); ++li) { + H.Add(li->err); + } + + percentileThr = H.Percentile(1.0f - mtp.recalcThreshold); + } + + std::size_t totalArcNum = 0; + int preservedArcNum = 0, recalcArcNum = 0; + + while(totalArcNum mtp.arcThreshold) + { + AlignPair::Result *curResult = findResult(OG.SVA[totalArcNum].s, OG.SVA[totalArcNum].t); + if (curResult) { + if (curResult->err < percentileThr) { + ++preservedArcNum; + } + else { + ++recalcArcNum; + } + } + else { + resultList.push_back(AlignPair::Result()); + resultList.back().FixName = OG.SVA[totalArcNum].s; + resultList.back().MovName = OG.SVA[totalArcNum].t; + resultList.back().err = std::numeric_limits::max(); + } + ++totalArcNum; + } + + //if there are no arcs at all complain and return + if (totalArcNum == 0) { + // cb(0, qUtf8Printable(buf.sprintf("\n Failure. There are no overlapping meshes?\n No candidate alignment arcs. Nothing Done.\n"))); + return; + } + + int num_max_thread = 1; + #ifdef _OPENMP + if (totalArcNum > 32) num_max_thread = omp_get_max_threads(); + #endif + // cb(0,qUtf8Printable(buf.sprintf("Arc with good overlap %6zu (on %6zu)\n",totalArcNum,OG.SVA.size()))); + // cb(0,qUtf8Printable(buf.sprintf(" %6i preserved %i Recalc \n",preservedArcNum,recalcArcNum))); + + bool hasValidAlign = false; + + #pragma omp parallel for schedule(dynamic, 1) num_threads(num_max_thread) + + // on windows, omp does not support unsigned types for indices on cycles + for (int i = 0 ;i < static_cast(totalArcNum); ++i) { + + std::fprintf(stdout,"%4i -> %4i Area:%5i NormArea:%5.3f\n",OG.SVA[i].s,OG.SVA[i].t,OG.SVA[i].area,OG.SVA[i].norm_area); + AlignPair::Result *curResult = findResult(OG.SVA[i].s,OG.SVA[i].t); + + // // missing arc and arc with great error must be recomputed. + if (curResult->err >= percentileThr) { + + ProcessArc(OG.SVA[i].s, OG.SVA[i].t, *curResult, ap); + curResult->area = OG.SVA[i].norm_area; + + if (curResult->isValid()) { + hasValidAlign = true; + std::pair dd = curResult->computeAvgErr(); + #pragma omp critical + //cb(0,qUtf8Printable(buf.sprintf("(%3i/%3zu) %2i -> %2i Aligned AvgErr dd=%f -> dd=%f \n",i+1,totalArcNum,OG.SVA[i].s,OG.SVA[i].t,dd.first,dd.second))); + } + else { + #pragma omp critical + //cb(0,qUtf8Printable(buf.sprintf( "(%3i/%3zu) %2i -> %2i Failed Alignment of one arc %s\n",i+1,totalArcNum,OG.SVA[i].s,OG.SVA[i].t,vcg::AlignPair::errorMsg(curResult->status)))); + } + } + } + + //if there are no valid arcs complain and return + if (!hasValidAlign) { + // cb(0,qUtf8Printable(buf.sprintf("\n Failure. No successful arc among candidate Alignment arcs. Nothing Done.\n"))); + return; + } + + vcg::Distribution H; // stat for printing + for (auto li = std::begin(resultList); li != std::end(resultList); ++li) { + if ((*li).isValid()) { + H.Add(li->err); + } + } + + //cb(0,qUtf8Printable(buf.sprintf("Completed Mesh-Mesh Alignment: Avg Err %5.3f; Median %5.3f; 90%% %5.3f\n", H.Avg(), H.Percentile(0.5f), H.Percentile(0.9f)))); + + ProcessGlobal(ap); + } + + void ProcessGlobal(vcg::AlignPair::Param &ap) { + + /************** Preparing Matrices for global alignment *************/ + std::vector GluedIdVec; + std::vector GluedTrVec; + + std::map names; + + for (auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { + MeshTree::MeshNode *mn=ni->second; + if (mn->glued) { + GluedIdVec.push_back(mn->Id()); + GluedTrVec.push_back(vcg::Matrix44d::Construct(mn->tr())); + names[mn->Id()]=qUtf8Printable(mn->m->label()); + } + } + + vcg::AlignGlobal AG; + std::vector ResVecPtr; + for (auto li = std::begin(resultList); li != std::end(resultList); ++li) { + if ((*li).isValid()) { + ResVecPtr.push_back(&*li); + } + } + + AG.BuildGraph(ResVecPtr, GluedTrVec, GluedIdVec); + + float StartGlobErr = 0.001f; + while (!AG.GlobalAlign(names, StartGlobErr, 100, ap.MatchMode==vcg::AlignPair::Param::MMRigid, stdout)){ + StartGlobErr *= 2; + AG.BuildGraph(ResVecPtr,GluedTrVec, GluedIdVec); + } + + std::vector GluedTrVecOut(GluedTrVec.size()); + AG.GetMatrixVector(GluedTrVecOut,GluedIdVec); + + // Now get back the results! + for (std::size_t ii = 0; ii < GluedTrVecOut.size(); ++ii) { + MM(GluedIdVec[ii])->cm.Tr.Import(GluedTrVecOut[ii]); + } + + } + + void ProcessArc(int fixId, int movId, vcg::AlignPair::Result &result, vcg::AlignPair::Param ap) { + + // l'allineatore globale cambia le varie matrici di posizione di base delle mesh + // per questo motivo si aspetta i punti nel sistema di riferimento locale della mesh fix + // Si fanno tutti i conti rispetto al sistema di riferimento locale della mesh fix + vcg::Matrix44d FixM = vcg::Matrix44d::Construct(find(fixId)->tr()); + vcg::Matrix44d MovM = vcg::Matrix44d::Construct(find(movId)->tr()); + vcg::Matrix44d MovToFix = Inverse(FixM) * MovM; + + ProcessArc(fixId,movId,MovToFix,result,ap); + } + + void ProcessArc(int fixId, int movId, vcg::Matrix44d &MovToFix, vcg::AlignPair::Result &result, vcg::AlignPair::Param ap) { + + vcg::AlignPair::A2Mesh Fix; + vcg::AlignPair aa; + + // 1) Convert fixed mesh and put it into the grid. + MM(fixId)->updateDataMask(MeshModel::MM_FACEMARK); + aa.convertMesh(MM(fixId)->cm,Fix); + + vcg::AlignPair::A2Grid UG; + vcg::AlignPair::A2GridVert VG; + + if (MM(fixId)->cm.fn==0 || ap.UseVertexOnly) { + Fix.initVert(vcg::Matrix44d::Identity()); + vcg::AlignPair::InitFixVert(&Fix,ap,VG); + } + else { + Fix.init(vcg::Matrix44d::Identity()); + vcg::AlignPair::initFix(&Fix, ap, UG); + } + + // 2) Convert the second mesh and sample a points on it. + MM(movId)->updateDataMask(MeshModel::MM_FACEMARK); + std::vector tmpmv; + aa.convertVertex(MM(movId)->cm.vert,tmpmv); + aa.sampleMovVert(tmpmv, ap.SampleNum, ap.SampleMode); + + aa.mov=&tmpmv; + aa.fix=&Fix; + aa.ap = ap; + + vcg::Matrix44d In=MovM; + // Perform the ICP algorithm + aa.align(In,UG,VG,result); + + result.FixName=fixId; + result.MovName=movId; + } + + inline Box3m bbox() { + Box3m FullBBox; + for (auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { + FullBBox.Add(Matrix44m::Construct(ni->second->tr()),ni->second->bbox()); + } + return FullBBox; + } + + inline Box3m gluedBBox() { + Box3m FullBBox; + for (auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { + if (ni->second->glued) { + FullBBox.Add(Matrix44m::Construct(ni->second->tr()), ni->second->bbox()); + } + } + return FullBBox; + } + + }; +} + +#endif //VCGLIB_MESHTREE_H From 76d2649a5eba6f30124a1fb7950475f7f6effa52 Mon Sep 17 00:00:00 2001 From: gabryon99 Date: Mon, 13 Sep 2021 21:35:16 +0200 Subject: [PATCH 18/56] fix typo in CMakeLists.txt --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e671ab530..d8555cf0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,7 +73,7 @@ set(VCG_HEADERS vcg/complex/algorithms/inertia.h vcg/complex/algorithms/mesh_assert.h vcg/complex/algorithms/occupancy_grid.h - vcg/complex/algorithms/meshtree.h.h + vcg/complex/algorithms/meshtree.h vcg/complex/algorithms/cut_tree.h vcg/complex/algorithms/nring.h vcg/complex/algorithms/tetra/tetfuse_collapse.h From cfc21cd8d26b23480f1284b012a9652e6fc7ff1d Mon Sep 17 00:00:00 2001 From: gabryon99 Date: Tue, 14 Sep 2021 14:17:07 +0200 Subject: [PATCH 19/56] remove ScalarType from MeshTree --- vcg/complex/algorithms/meshtree.h | 104 +++++++++++++++++++----------- 1 file changed, 68 insertions(+), 36 deletions(-) diff --git a/vcg/complex/algorithms/meshtree.h b/vcg/complex/algorithms/meshtree.h index c66fadc7f..3bd18a9a3 100644 --- a/vcg/complex/algorithms/meshtree.h +++ b/vcg/complex/algorithms/meshtree.h @@ -1,9 +1,17 @@ #ifndef VCGLIB_MESHTREE_H #define VCGLIB_MESHTREE_H +#include +#include +#include + +#ifdef _OPENMP +#include +#endif + namespace vcg { - template + template class MeshTree { public: @@ -16,11 +24,11 @@ namespace vcg { MeshNode(MeshType *_m) : m{_m}, glued{false} {} - vcg::Matrix44 &tr() { + vcg::Matrix44d &tr() { return m->cm.Tr; } - const vcg::Box3 &bbox() const { + const vcg::Box3d &bbox() const { return m->cm.bbox; } @@ -36,8 +44,8 @@ namespace vcg { float recalcThreshold = 0.1f; }; - std::map nodeMap; - std::list resultList; + std::map nodeMap; + std::vector resultList; vcg::OccupancyGrid OG; vcg::CallBackPos * cb; @@ -46,7 +54,9 @@ namespace vcg { return nodeMap[i]->m; } - MeshTree(); + MeshTree() {} + + MeshTree(vcg::CallBackPos* _cb) : cb{_cb} {} void clear() { @@ -116,13 +126,16 @@ namespace vcg { return cnt; } - void Process(vcg::AlignPair::Param &ap, Param &mtp) { + void Process(vcg::AlignPair::Param &ap, MeshTree::Param &mtp) { - // QString buf; - // cb(0,qUtf8Printable(buf.sprintf("Starting Processing of %i glued meshes out of %zu meshes\n",gluedNum(),nodeMap.size()))); + char buf[1024]; + std::sprintf(buf, "Starting Processing of %i glued meshes out of %zu meshes\n", gluedNum(), nodeMap.size()); + cb(0, buf); /******* Occupancy Grid Computation *************/ - // cb(0,qUtf8Printable(buf.sprintf("Computing Overlaps %i glued meshes...\n",gluedNum() ))); + std::memset(buf, '\0', 1024); + std::sprintf(buf, "Computing Overlaps %i glued meshes...\n", gluedNum()); + cb(0, buf); OG.Init(static_cast(nodeMap.size()), vcg::Box3d::Construct(gluedBBox()), mtp.OGSize); @@ -140,8 +153,8 @@ namespace vcg { /*************** The long loop of arc computing **************/ // count existing arcs within current error threshold - float percentileThr = 0f; - if (resultList.size() > 0) { + float percentileThr = 0; + if (!resultList.empty()) { vcg::Distribution H; for (auto li = std::begin(resultList); li != std::end(resultList); ++li) { @@ -176,20 +189,27 @@ namespace vcg { //if there are no arcs at all complain and return if (totalArcNum == 0) { - // cb(0, qUtf8Printable(buf.sprintf("\n Failure. There are no overlapping meshes?\n No candidate alignment arcs. Nothing Done.\n"))); + std::memset(buf, '\0', 1024); + std::sprintf(buf, "\n Failure. There are no overlapping meshes?\n No candidate alignment arcs. Nothing Done.\n"); + cb(0, buf); return; } int num_max_thread = 1; - #ifdef _OPENMP +#ifdef _OPENMP if (totalArcNum > 32) num_max_thread = omp_get_max_threads(); - #endif - // cb(0,qUtf8Printable(buf.sprintf("Arc with good overlap %6zu (on %6zu)\n",totalArcNum,OG.SVA.size()))); - // cb(0,qUtf8Printable(buf.sprintf(" %6i preserved %i Recalc \n",preservedArcNum,recalcArcNum))); +#endif + std::memset(buf, '\0', 1024); + std::sprintf(buf, "Arc with good overlap %6zu (on %6zu)\n", totalArcNum, OG.SVA.size()); + cb(0, buf); + + std::memset(buf, '\0', 1024); + std::sprintf(buf, " %6i preserved %i Recalc \n", preservedArcNum, recalcArcNum); + cb(0, buf); bool hasValidAlign = false; - #pragma omp parallel for schedule(dynamic, 1) num_threads(num_max_thread) +#pragma omp parallel for schedule(dynamic, 1) num_threads(num_max_thread) // on windows, omp does not support unsigned types for indices on cycles for (int i = 0 ;i < static_cast(totalArcNum); ++i) { @@ -206,19 +226,26 @@ namespace vcg { if (curResult->isValid()) { hasValidAlign = true; std::pair dd = curResult->computeAvgErr(); - #pragma omp critical - //cb(0,qUtf8Printable(buf.sprintf("(%3i/%3zu) %2i -> %2i Aligned AvgErr dd=%f -> dd=%f \n",i+1,totalArcNum,OG.SVA[i].s,OG.SVA[i].t,dd.first,dd.second))); +#pragma omp critical + + std::memset(buf, '\0', 1024); + std::sprintf(buf, "(%3i/%3zu) %2i -> %2i Aligned AvgErr dd=%f -> dd=%f \n", i+1,totalArcNum,OG.SVA[i].s,OG.SVA[i].t,dd.first,dd.second); + cb(0, buf); } else { - #pragma omp critical - //cb(0,qUtf8Printable(buf.sprintf( "(%3i/%3zu) %2i -> %2i Failed Alignment of one arc %s\n",i+1,totalArcNum,OG.SVA[i].s,OG.SVA[i].t,vcg::AlignPair::errorMsg(curResult->status)))); +#pragma omp critical + std::memset(buf, '\0', 1024); + std::sprintf(buf, "(%3i/%3zu) %2i -> %2i Failed Alignment of one arc %s\n",i+1,totalArcNum,OG.SVA[i].s,OG.SVA[i].t,vcg::AlignPair::errorMsg(curResult->status)); + cb(0, buf); } } } //if there are no valid arcs complain and return if (!hasValidAlign) { - // cb(0,qUtf8Printable(buf.sprintf("\n Failure. No successful arc among candidate Alignment arcs. Nothing Done.\n"))); + std::memset(buf, '\0', 1024); + std::sprintf(buf, "\n Failure. No successful arc among candidate Alignment arcs. Nothing Done.\n"); + cb(0, buf); return; } @@ -229,7 +256,9 @@ namespace vcg { } } - //cb(0,qUtf8Printable(buf.sprintf("Completed Mesh-Mesh Alignment: Avg Err %5.3f; Median %5.3f; 90%% %5.3f\n", H.Avg(), H.Percentile(0.5f), H.Percentile(0.9f)))); + std::memset(buf, '\0', 1024); + std::sprintf(buf, "Completed Mesh-Mesh Alignment: Avg Err %5.3f; Median %5.3f; 90%% %5.3f\n", H.Avg(), H.Percentile(0.5f), H.Percentile(0.9f)); + cb(0, buf); ProcessGlobal(ap); } @@ -262,7 +291,7 @@ namespace vcg { AG.BuildGraph(ResVecPtr, GluedTrVec, GluedIdVec); float StartGlobErr = 0.001f; - while (!AG.GlobalAlign(names, StartGlobErr, 100, ap.MatchMode==vcg::AlignPair::Param::MMRigid, stdout)){ + while (!AG.GlobalAlign(names, StartGlobErr, 100, ap.MatchMode == vcg::AlignPair::Param::MMRigid, stdout, cb)) { StartGlobErr *= 2; AG.BuildGraph(ResVecPtr,GluedTrVec, GluedIdVec); } @@ -286,16 +315,16 @@ namespace vcg { vcg::Matrix44d MovM = vcg::Matrix44d::Construct(find(movId)->tr()); vcg::Matrix44d MovToFix = Inverse(FixM) * MovM; - ProcessArc(fixId,movId,MovToFix,result,ap); + ProcessArc(fixId, movId, MovToFix, result, ap); } - void ProcessArc(int fixId, int movId, vcg::Matrix44d &MovToFix, vcg::AlignPair::Result &result, vcg::AlignPair::Param ap) { + void ProcessArc(int fixId, int movId, vcg::Matrix44d &MovM, vcg::AlignPair::Result &result, vcg::AlignPair::Param ap) { vcg::AlignPair::A2Mesh Fix; vcg::AlignPair aa; // 1) Convert fixed mesh and put it into the grid. - MM(fixId)->updateDataMask(MeshModel::MM_FACEMARK); + MM(fixId)->updateDataMask(MeshType::MeshModel::MM_FACEMARK); aa.convertMesh(MM(fixId)->cm,Fix); vcg::AlignPair::A2Grid UG; @@ -311,7 +340,7 @@ namespace vcg { } // 2) Convert the second mesh and sample a points on it. - MM(movId)->updateDataMask(MeshModel::MM_FACEMARK); + MM(movId)->updateDataMask(MeshType::MeshModel::MM_FACEMARK); std::vector tmpmv; aa.convertVertex(MM(movId)->cm.vert,tmpmv); aa.sampleMovVert(tmpmv, ap.SampleNum, ap.SampleMode); @@ -320,7 +349,7 @@ namespace vcg { aa.fix=&Fix; aa.ap = ap; - vcg::Matrix44d In=MovM; + vcg::Matrix44d In = MovM; // Perform the ICP algorithm aa.align(In,UG,VG,result); @@ -328,19 +357,22 @@ namespace vcg { result.MovName=movId; } - inline Box3m bbox() { - Box3m FullBBox; + inline vcg::Box3d bbox() { + + vcg::Box3d FullBBox; for (auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { - FullBBox.Add(Matrix44m::Construct(ni->second->tr()),ni->second->bbox()); + FullBBox.Add(vcg::Matrix44d::Construct(ni->second->tr()),ni->second->bbox()); } return FullBBox; } - inline Box3m gluedBBox() { - Box3m FullBBox; + inline vcg::Box3d gluedBBox() { + + vcg::Box3d FullBBox; + for (auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { if (ni->second->glued) { - FullBBox.Add(Matrix44m::Construct(ni->second->tr()), ni->second->bbox()); + FullBBox.Add(vcg::Matrix44d::Construct(ni->second->tr()), ni->second->bbox()); } } return FullBBox; From 2b507b55400369df87bfc6fe5f58b0e46ed72d4c Mon Sep 17 00:00:00 2001 From: gabryon99 Date: Tue, 14 Sep 2021 14:19:17 +0200 Subject: [PATCH 20/56] add align_global.h --- CMakeLists.txt | 487 +++++++++--------- vcg/complex/algorithms/align_global.h | 695 ++++++++++++++++++++++++++ 2 files changed, 939 insertions(+), 243 deletions(-) create mode 100644 vcg/complex/algorithms/align_global.h diff --git a/CMakeLists.txt b/CMakeLists.txt index d8555cf0d..a4f6c76d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,263 +30,264 @@ elseif(ALLOW_BUNDLED_EIGEN AND EXISTS "${VCG_EIGEN_DIR}/Eigen/Eigen") set(EIGEN_INCLUDE_DIRS ${VCG_EIGEN_DIR}) else() message( - FATAL_ERROR + FATAL_ERROR "Eigen is required - at least one of ALLOW_SYSTEM_EIGEN or ALLOW_BUNDLED_EIGEN must be enabled and found.") endif() ### VCGLib headers and sources set(VCG_HEADERS - vcg/complex/append.h - vcg/complex/all_types.h - vcg/complex/complex.h - vcg/complex/allocate.h - vcg/complex/exception.h - vcg/complex/algorithms/overlap_estimation.h - vcg/complex/algorithms/dual_meshing.h - vcg/complex/algorithms/intersection.h - vcg/complex/algorithms/clip.h - vcg/complex/algorithms/geodesic.h - vcg/complex/algorithms/parametrization/poisson_solver.h - vcg/complex/algorithms/parametrization/uv_utils.h - vcg/complex/algorithms/parametrization/distortion.h - vcg/complex/algorithms/parametrization/tangent_field_operators.h - vcg/complex/algorithms/parametrization/voronoi_atlas.h - vcg/complex/algorithms/edge_collapse.h - vcg/complex/algorithms/hole.h - vcg/complex/algorithms/align_pair.h - vcg/complex/algorithms/closest.h - vcg/complex/algorithms/tetra_implicit_smooth.h - vcg/complex/algorithms/bitquad_support.h - vcg/complex/algorithms/skeleton.h - vcg/complex/algorithms/symmetry.h - vcg/complex/algorithms/voronoi_volume_sampling.h - vcg/complex/algorithms/polygon_polychord_collapse.h - vcg/complex/algorithms/inside.h - vcg/complex/algorithms/local_optimization/tri_edge_flip.h - vcg/complex/algorithms/local_optimization/quad_diag_collapse.h - vcg/complex/algorithms/local_optimization/tri_edge_collapse_quadric.h - vcg/complex/algorithms/local_optimization/tri_edge_collapse_quadric_tex.h - vcg/complex/algorithms/local_optimization/tri_edge_collapse.h - vcg/complex/algorithms/local_optimization/tetra_edge_collapse.h - vcg/complex/algorithms/polygonal_algorithms.h - vcg/complex/algorithms/inertia.h - vcg/complex/algorithms/mesh_assert.h - vcg/complex/algorithms/occupancy_grid.h - vcg/complex/algorithms/meshtree.h - vcg/complex/algorithms/cut_tree.h - vcg/complex/algorithms/nring.h - vcg/complex/algorithms/tetra/tetfuse_collapse.h - vcg/complex/algorithms/stat.h - vcg/complex/algorithms/ransac_matching.h - vcg/complex/algorithms/refine.h - vcg/complex/algorithms/outline_support.h - vcg/complex/algorithms/convex_hull.h - vcg/complex/algorithms/clean.h - vcg/complex/algorithms/mesh_to_matrix.h - vcg/complex/algorithms/quadrangulator.h - vcg/complex/algorithms/isotropic_remeshing.h - vcg/complex/algorithms/smooth.h - vcg/complex/algorithms/autoalign_4pcs.h - vcg/complex/algorithms/local_optimization.h - vcg/complex/algorithms/curve_on_manifold.h - vcg/complex/algorithms/clustering.h - vcg/complex/algorithms/refine_loop.h - vcg/complex/algorithms/cylinder_clipping.h - vcg/complex/algorithms/pointcloud_normal.h - vcg/complex/algorithms/bitquad_creation.h - vcg/complex/algorithms/crease_cut.h - vcg/complex/algorithms/implicit_smooth.h - vcg/complex/algorithms/voronoi_remesher.h - vcg/complex/algorithms/polygon_support.h - vcg/complex/algorithms/point_sampling.h - vcg/complex/algorithms/create/mc_lookup_table.h - vcg/complex/algorithms/create/mc_trivial_walker.h - vcg/complex/algorithms/create/extrude.h - vcg/complex/algorithms/create/resampler.h - vcg/complex/algorithms/create/ball_pivoting.h - vcg/complex/algorithms/create/readme.txt - vcg/complex/algorithms/create/zonohedron.h - vcg/complex/algorithms/create/platonic.h - vcg/complex/algorithms/create/marching_cubes.h - vcg/complex/algorithms/create/plymc/voxel.h - vcg/complex/algorithms/create/plymc/simplemeshprovider.h - vcg/complex/algorithms/create/plymc/tri_edge_collapse_mc.h - vcg/complex/algorithms/create/plymc/volume.h - vcg/complex/algorithms/create/plymc/plymc.h - vcg/complex/algorithms/create/plymc/svoxel.h - vcg/complex/algorithms/create/tetramesh_support.h - vcg/complex/algorithms/create/advancing_front.h - vcg/complex/algorithms/textcoord_optimization.h - vcg/complex/algorithms/bitquad_optimization.h - vcg/complex/algorithms/halfedge_quad_clean.h - vcg/complex/algorithms/voronoi_processing.h - vcg/complex/algorithms/update/quality.h - vcg/complex/algorithms/update/selection.h - vcg/complex/algorithms/update/fitmaps.h - vcg/complex/algorithms/update/component_ep.h - vcg/complex/algorithms/update/texture.h - vcg/complex/algorithms/update/curvature_fitting.h - vcg/complex/algorithms/update/normal.h - vcg/complex/algorithms/update/position.h - vcg/complex/algorithms/update/halfedge_topology.h - vcg/complex/algorithms/update/topology.h - vcg/complex/algorithms/update/flag.h - vcg/complex/algorithms/update/bounding.h - vcg/complex/algorithms/update/halfedge_indexed.h - vcg/complex/algorithms/update/color.h - vcg/complex/algorithms/update/curvature.h - vcg/complex/algorithms/point_outlier.h - vcg/complex/algorithms/harmonic.h - vcg/complex/algorithms/point_matching_scale.h - vcg/complex/algorithms/attribute_seam.h - vcg/complex/foreach.h - vcg/complex/base.h - vcg/complex/used_types.h - vcg/container/entries_allocation_table.h - vcg/container/container_allocation_table.h - vcg/container/derivation_chain.h - vcg/container/vector_occ.h - vcg/container/simple_temporary_data.h - vcg/space/segment2.h - vcg/space/fitting3.h - vcg/space/tetra3.h - vcg/space/triangle2.h - vcg/space/ray2.h - vcg/space/deprecated_point2.h - vcg/space/point4.h - vcg/space/box2.h - vcg/space/ray3.h - vcg/space/planar_polygon_tessellation.h - vcg/space/texcoord2.h - vcg/space/deprecated_point3.h - vcg/space/intersection/triangle_triangle3.h - vcg/space/distance2.h - vcg/space/point3.h - vcg/space/deprecated_point.h - vcg/space/space.h - vcg/space/point.h - vcg/space/colorspace.h - vcg/space/rect_packer.h - vcg/space/triangle3.h - vcg/space/obox3.h - vcg/space/point2.h - vcg/space/smallest_enclosing.h - vcg/space/color4.h - vcg/space/polygon3.h - vcg/space/line3.h - vcg/space/index/octree.h - vcg/space/index/grid_util2d.h - vcg/space/index/grid_closest.h - vcg/space/index/grid_static_ptr.h - vcg/space/index/grid_util.h - vcg/space/index/spatial_hashing.h - vcg/space/index/closest2d.h - vcg/space/index/grid_static_obj.h - vcg/space/index/kdtree/kdtree.h - vcg/space/index/kdtree/priorityqueue.h - vcg/space/index/kdtree/kdtree_face.h - vcg/space/index/kdtree/mlsutils.h - vcg/space/index/octree_template.h - vcg/space/index/aabb_binary_tree/kclosest.h - vcg/space/index/aabb_binary_tree/closest.h - vcg/space/index/aabb_binary_tree/ray.h - vcg/space/index/aabb_binary_tree/frustum_cull.h - vcg/space/index/aabb_binary_tree/aabb_binary_tree.h - vcg/space/index/aabb_binary_tree/base.h - vcg/space/index/grid_closest2d.h - vcg/space/index/spatial_hashing2d.h - vcg/space/index/space_iterators.h - vcg/space/index/grid_static_ptr2d.h - vcg/space/index/base2d.h - vcg/space/index/base.h - vcg/space/index/perfect_spatial_hashing.h - vcg/space/index/space_iterators2d.h - vcg/space/line2.h - vcg/space/point_matching.h - vcg/space/intersection3.h - vcg/space/deprecated_point4.h - vcg/space/rasterized_outline2_packer.h - vcg/space/box.h - vcg/space/plane3.h - vcg/space/outline2_packer.h - vcg/space/segment3.h - vcg/space/intersection2.h - vcg/space/sphere3.h - vcg/space/box3.h - vcg/space/distance3.h - vcg/math/quadric5.h - vcg/math/factorial.h - vcg/math/eigen_matrix_addons.h - vcg/math/quadric.h - vcg/math/perlin_noise.h - vcg/math/shot.h - vcg/math/spherical_harmonics.h - vcg/math/eigen_matrixbase_addons.h - vcg/math/quaternion.h - vcg/math/similarity.h - vcg/math/disjoint_set.h - vcg/math/random_generator.h - vcg/math/camera.h - vcg/math/linear.h - vcg/math/matrix44.h - vcg/math/eigen.h - vcg/math/old_lin_algebra.h - vcg/math/similarity2.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/base.h - vcg/math/histogram.h - vcg/math/legendre.h - vcg/math/matrix33.h - vcg/math/old_matrix.h - vcg/simplex/edge/distance.h - vcg/simplex/edge/topology.h - vcg/simplex/edge/pos.h - vcg/simplex/edge/component.h - vcg/simplex/edge/base.h - vcg/simplex/tetrahedron/tetrahedron.h - vcg/simplex/tetrahedron/topology.h - vcg/simplex/tetrahedron/pos.h - vcg/simplex/tetrahedron/component.h - vcg/simplex/tetrahedron/base.h - vcg/simplex/face/component_occ.h - vcg/simplex/face/component_ep.h - vcg/simplex/face/jumping_pos.h - vcg/simplex/face/distance.h - vcg/simplex/face/component_polygon.h - vcg/simplex/face/topology.h - vcg/simplex/face/pos.h - vcg/simplex/face/component.h - vcg/simplex/face/component_ocf.h - vcg/simplex/face/base.h - vcg/simplex/vertex/component_occ.h - vcg/simplex/vertex/component_sph.h - vcg/simplex/vertex/distance.h - vcg/simplex/vertex/component.h - vcg/simplex/vertex/component_ocf.h - vcg/simplex/vertex/base.h - vcg/connectors/halfedge_pos.h - vcg/connectors/hedge.h - vcg/connectors/hedge_component.h + vcg/complex/append.h + vcg/complex/all_types.h + vcg/complex/complex.h + vcg/complex/allocate.h + vcg/complex/exception.h + vcg/complex/algorithms/overlap_estimation.h + vcg/complex/algorithms/dual_meshing.h + vcg/complex/algorithms/intersection.h + vcg/complex/algorithms/clip.h + vcg/complex/algorithms/geodesic.h + vcg/complex/algorithms/parametrization/poisson_solver.h + vcg/complex/algorithms/parametrization/uv_utils.h + vcg/complex/algorithms/parametrization/distortion.h + vcg/complex/algorithms/parametrization/tangent_field_operators.h + vcg/complex/algorithms/parametrization/voronoi_atlas.h + vcg/complex/algorithms/edge_collapse.h + vcg/complex/algorithms/hole.h + vcg/complex/algorithms/align_pair.h + vcg/complex/algorithms/closest.h + vcg/complex/algorithms/tetra_implicit_smooth.h + vcg/complex/algorithms/bitquad_support.h + vcg/complex/algorithms/skeleton.h + vcg/complex/algorithms/symmetry.h + vcg/complex/algorithms/voronoi_volume_sampling.h + vcg/complex/algorithms/polygon_polychord_collapse.h + vcg/complex/algorithms/inside.h + vcg/complex/algorithms/local_optimization/tri_edge_flip.h + vcg/complex/algorithms/local_optimization/quad_diag_collapse.h + vcg/complex/algorithms/local_optimization/tri_edge_collapse_quadric.h + vcg/complex/algorithms/local_optimization/tri_edge_collapse_quadric_tex.h + vcg/complex/algorithms/local_optimization/tri_edge_collapse.h + vcg/complex/algorithms/local_optimization/tetra_edge_collapse.h + vcg/complex/algorithms/polygonal_algorithms.h + vcg/complex/algorithms/inertia.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/nring.h + vcg/complex/algorithms/tetra/tetfuse_collapse.h + vcg/complex/algorithms/stat.h + vcg/complex/algorithms/ransac_matching.h + vcg/complex/algorithms/refine.h + vcg/complex/algorithms/outline_support.h + vcg/complex/algorithms/convex_hull.h + vcg/complex/algorithms/clean.h + vcg/complex/algorithms/mesh_to_matrix.h + vcg/complex/algorithms/quadrangulator.h + vcg/complex/algorithms/isotropic_remeshing.h + vcg/complex/algorithms/smooth.h + vcg/complex/algorithms/autoalign_4pcs.h + vcg/complex/algorithms/local_optimization.h + vcg/complex/algorithms/curve_on_manifold.h + vcg/complex/algorithms/clustering.h + vcg/complex/algorithms/refine_loop.h + vcg/complex/algorithms/cylinder_clipping.h + vcg/complex/algorithms/pointcloud_normal.h + vcg/complex/algorithms/bitquad_creation.h + vcg/complex/algorithms/crease_cut.h + vcg/complex/algorithms/implicit_smooth.h + vcg/complex/algorithms/voronoi_remesher.h + vcg/complex/algorithms/polygon_support.h + vcg/complex/algorithms/point_sampling.h + vcg/complex/algorithms/create/mc_lookup_table.h + vcg/complex/algorithms/create/mc_trivial_walker.h + vcg/complex/algorithms/create/extrude.h + vcg/complex/algorithms/create/resampler.h + vcg/complex/algorithms/create/ball_pivoting.h + vcg/complex/algorithms/create/readme.txt + vcg/complex/algorithms/create/zonohedron.h + vcg/complex/algorithms/create/platonic.h + vcg/complex/algorithms/create/marching_cubes.h + vcg/complex/algorithms/create/plymc/voxel.h + vcg/complex/algorithms/create/plymc/simplemeshprovider.h + vcg/complex/algorithms/create/plymc/tri_edge_collapse_mc.h + vcg/complex/algorithms/create/plymc/volume.h + vcg/complex/algorithms/create/plymc/plymc.h + vcg/complex/algorithms/create/plymc/svoxel.h + vcg/complex/algorithms/create/tetramesh_support.h + vcg/complex/algorithms/create/advancing_front.h + vcg/complex/algorithms/textcoord_optimization.h + vcg/complex/algorithms/bitquad_optimization.h + vcg/complex/algorithms/halfedge_quad_clean.h + vcg/complex/algorithms/voronoi_processing.h + vcg/complex/algorithms/update/quality.h + vcg/complex/algorithms/update/selection.h + vcg/complex/algorithms/update/fitmaps.h + vcg/complex/algorithms/update/component_ep.h + vcg/complex/algorithms/update/texture.h + vcg/complex/algorithms/update/curvature_fitting.h + vcg/complex/algorithms/update/normal.h + vcg/complex/algorithms/update/position.h + vcg/complex/algorithms/update/halfedge_topology.h + vcg/complex/algorithms/update/topology.h + vcg/complex/algorithms/update/flag.h + vcg/complex/algorithms/update/bounding.h + vcg/complex/algorithms/update/halfedge_indexed.h + vcg/complex/algorithms/update/color.h + vcg/complex/algorithms/update/curvature.h + vcg/complex/algorithms/point_outlier.h + vcg/complex/algorithms/harmonic.h + vcg/complex/algorithms/point_matching_scale.h + vcg/complex/algorithms/attribute_seam.h + vcg/complex/foreach.h + vcg/complex/base.h + vcg/complex/used_types.h + vcg/container/entries_allocation_table.h + vcg/container/container_allocation_table.h + vcg/container/derivation_chain.h + vcg/container/vector_occ.h + vcg/container/simple_temporary_data.h + vcg/space/segment2.h + vcg/space/fitting3.h + vcg/space/tetra3.h + vcg/space/triangle2.h + vcg/space/ray2.h + vcg/space/deprecated_point2.h + vcg/space/point4.h + vcg/space/box2.h + vcg/space/ray3.h + vcg/space/planar_polygon_tessellation.h + vcg/space/texcoord2.h + vcg/space/deprecated_point3.h + vcg/space/intersection/triangle_triangle3.h + vcg/space/distance2.h + vcg/space/point3.h + vcg/space/deprecated_point.h + vcg/space/space.h + vcg/space/point.h + vcg/space/colorspace.h + vcg/space/rect_packer.h + vcg/space/triangle3.h + vcg/space/obox3.h + vcg/space/point2.h + vcg/space/smallest_enclosing.h + vcg/space/color4.h + vcg/space/polygon3.h + vcg/space/line3.h + vcg/space/index/octree.h + vcg/space/index/grid_util2d.h + vcg/space/index/grid_closest.h + vcg/space/index/grid_static_ptr.h + vcg/space/index/grid_util.h + vcg/space/index/spatial_hashing.h + vcg/space/index/closest2d.h + vcg/space/index/grid_static_obj.h + vcg/space/index/kdtree/kdtree.h + vcg/space/index/kdtree/priorityqueue.h + vcg/space/index/kdtree/kdtree_face.h + vcg/space/index/kdtree/mlsutils.h + vcg/space/index/octree_template.h + vcg/space/index/aabb_binary_tree/kclosest.h + vcg/space/index/aabb_binary_tree/closest.h + vcg/space/index/aabb_binary_tree/ray.h + vcg/space/index/aabb_binary_tree/frustum_cull.h + vcg/space/index/aabb_binary_tree/aabb_binary_tree.h + vcg/space/index/aabb_binary_tree/base.h + vcg/space/index/grid_closest2d.h + vcg/space/index/spatial_hashing2d.h + vcg/space/index/space_iterators.h + vcg/space/index/grid_static_ptr2d.h + vcg/space/index/base2d.h + vcg/space/index/base.h + vcg/space/index/perfect_spatial_hashing.h + vcg/space/index/space_iterators2d.h + vcg/space/line2.h + vcg/space/point_matching.h + vcg/space/intersection3.h + vcg/space/deprecated_point4.h + vcg/space/rasterized_outline2_packer.h + vcg/space/box.h + vcg/space/plane3.h + vcg/space/outline2_packer.h + vcg/space/segment3.h + vcg/space/intersection2.h + vcg/space/sphere3.h + vcg/space/box3.h + vcg/space/distance3.h + vcg/math/quadric5.h + vcg/math/factorial.h + vcg/math/eigen_matrix_addons.h + vcg/math/quadric.h + vcg/math/perlin_noise.h + vcg/math/shot.h + vcg/math/spherical_harmonics.h + vcg/math/eigen_matrixbase_addons.h + vcg/math/quaternion.h + vcg/math/similarity.h + vcg/math/disjoint_set.h + vcg/math/random_generator.h + vcg/math/camera.h + vcg/math/linear.h + vcg/math/matrix44.h + vcg/math/eigen.h + vcg/math/old_lin_algebra.h + vcg/math/similarity2.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/base.h + vcg/math/histogram.h + vcg/math/legendre.h + vcg/math/matrix33.h + vcg/math/old_matrix.h + vcg/simplex/edge/distance.h + vcg/simplex/edge/topology.h + vcg/simplex/edge/pos.h + vcg/simplex/edge/component.h + vcg/simplex/edge/base.h + vcg/simplex/tetrahedron/tetrahedron.h + vcg/simplex/tetrahedron/topology.h + vcg/simplex/tetrahedron/pos.h + vcg/simplex/tetrahedron/component.h + vcg/simplex/tetrahedron/base.h + vcg/simplex/face/component_occ.h + vcg/simplex/face/component_ep.h + vcg/simplex/face/jumping_pos.h + vcg/simplex/face/distance.h + vcg/simplex/face/component_polygon.h + vcg/simplex/face/topology.h + vcg/simplex/face/pos.h + vcg/simplex/face/component.h + vcg/simplex/face/component_ocf.h + vcg/simplex/face/base.h + vcg/simplex/vertex/component_occ.h + vcg/simplex/vertex/component_sph.h + vcg/simplex/vertex/distance.h + vcg/simplex/vertex/component.h + vcg/simplex/vertex/component_ocf.h + vcg/simplex/vertex/base.h + vcg/connectors/halfedge_pos.h + vcg/connectors/hedge.h + vcg/connectors/hedge_component.h - #wrap - wrap/callback.h -) + #wrap + wrap/callback.h + ) set(SOURCES -) + ) if (VCG_HEADER_ONLY) if (NOT TARGET vcglib) # to be sure that vcglib target is created just one time add_library(vcglib INTERFACE) target_include_directories( - vcglib INTERFACE - ${CMAKE_CURRENT_LIST_DIR} - ${EIGEN_INCLUDE_DIRS}) + vcglib INTERFACE + ${CMAKE_CURRENT_LIST_DIR} + ${EIGEN_INCLUDE_DIRS}) #just to show headers in ide add_custom_target(vcglib_ide SOURCES ${VCG_HEADERS}) diff --git a/vcg/complex/algorithms/align_global.h b/vcg/complex/algorithms/align_global.h new file mode 100644 index 000000000..fbd049dfd --- /dev/null +++ b/vcg/complex/algorithms/align_global.h @@ -0,0 +1,695 @@ +#include +#include + +#include + +#ifndef MESHLAB_ALIGNGLOBAL_H +#define MESHLAB_ALIGNGLOBAL_H + +namespace vcg { + class AlignGlobal { + public: + + /** + * Forward declaration for the `VirtAlign` class. + */ + class Node; + + /** + * Allineamento virtuale tra due mesh (estratto da un alignresult). + * Nota Importante: la trasformazione e i punti qui memorizzati si intendono al netto delle trasf di base delle due mesh in gioco. + * Quindi se qualcuno sposta una mesh le pos dei punti sono ancora valide ma non la trasf da applicarvi. + */ + class VirtAlign + { + public: + + AlignGlobal::Node *Fix, *Mov; // allineamento tra i e j + std::vector FixP; // punti su Fix + std::vector MovP; // punti su Mov + std::vector FixN; // Normali su Fix + std::vector MovN; // Normali su Mov + vcg::Matrix44d M2F; //la matrice da applicare ai punti di Mov per ottenere quelli su Fix + vcg::Matrix44d F2M; //la matrice da applicare ai punti di Fix per ottenere quelli su Mov + /* + Nel caso semplificato che le mesh avessero come trasf di base l'identita' deve valere: + + N2A(N).Apply( P(N)) ~= AdjP(N) + A2N(N).Apply(AdjP(N)) ~= P(N) + + In generale un nodo N qualsiasi dell'VirtAlign vale che: + + N2A(N).Apply( N->M.Apply( P(N)) ) ~= AdjN(N)->M.Apply( AdjP(N) ); + A2M(N).Apply( AdjN(N)->M.Apply(AdjP(N)) ) ~= N->M.Apply( P(N) ); + + in cui il ~= significa uguale al netto dell'errore di allineamento. + + Per ottenere i virtualmate relativi ad un nodo n: + */ + + inline vcg::Matrix44d &N2A(AlignGlobal::Node *n) {if(n==Fix) return F2M; else return M2F;} + inline vcg::Matrix44d &A2N(AlignGlobal::Node *n) {if(n==Fix) return M2F; else return F2M;} + + inline std::vector &P(AlignGlobal::Node *n) {if(n==Fix) return FixP; else return MovP;} + inline std::vector &N(AlignGlobal::Node *n) {if(n==Fix) return FixN; else return MovN;} + + inline std::vector &AdjP(AlignGlobal::Node *n) {if(n==Fix) return MovP; else return FixP;} + inline std::vector &AdjN(AlignGlobal::Node *n) {if(n==Fix) return MovN; else return FixN;} + + AlignGlobal::Node *Adj(Node *n) const { + + assert(n == Fix || n == Mov); + if (n == Fix) return Mov; + + return Fix; + } + + bool Check() const { + + if (FixP.size() != MovP.size()) return false; + + Point3d mp, fp; + + double md = 0, fd = 0; + double md2 = 0, fd2 = 0; + + Matrix44d &MovTr=Mov->M; + Matrix44d &FixTr=Fix->M; + + for (std::size_t i = 0; i < FixP.size(); ++i) { + + mp = MovTr * MovP[i]; + fp = FixTr * FixP[i]; + + md += Distance(fp, M2F * mp); + md2 += SquaredDistance(fp, M2F * mp); + + fd += Distance(mp, F2M * fp); + fd2 += SquaredDistance(mp, F2M * fp); + } + + int nn = static_cast(MovP.size()); + + std::fprintf(stdout, "Arc %3i -> %3i : %i pt\n", Fix->id, Mov->id, nn); + std::fprintf(stdout, "SquaredSum Distance %7.3f %7.3f Avg %7.3f %7.3f\n", fd2, md2, fd2/nn, md2/nn); + std::fprintf(stdout, " Sum Distance %7.3f %7.3f Avg %7.3f %7.3f\n", fd , md , fd/nn, md/nn); + return true; + } + }; + + class Node { + public: + + int id; // id della mesh a cui corrisponde il nodo + int sid; // Subgraph id; + Matrix44d M; // La matrice che mette la mesh nella sua posizione di base; + std::list Adj; + + /*** + * True if the node is inside the active set + */ + bool Active; + + /*** + * False if it's dormant + */ + bool Queued; + bool Discarded; + + Node() : id{-1}, Active{false}, Discarded{false}, Queued{false} {} + + // Allinea un nodo con tutti i suoi vicini + double AlignWithActiveAdj(bool Rigid) { + + std::printf("--- AlignWithActiveAdj --- \nMoving node %i with respect to nodes:", id); + + for (auto li = std::begin(Adj); li != std::end(Adj); ++li) { + if ((*li)->Adj(this)->Active) { + std::printf(" %i,", (*li)->Adj(this)->id); + } + } + + std::printf("\n"); + + //printf("Base Matrix of Node %i\n",id);print(M); + + // Step 1; Costruiamo le due liste di punti da allineare + std::vector FixP, MovP, FixN, MovN; + Box3d FixBox, MovBox; + FixBox.SetNull(); MovBox.SetNull(); + + for (auto li = std::begin(Adj); li != std::end(Adj); ++li) { + + // scorro tutti i nodi adiacenti attivi + if ((*li)->Adj(this)->Active) { + //printf("Base Matrix of Node %i adj to %i\n",id,(*li)->Adj(this)->id); + //print((*li)->Adj(this)->M); + std::vector &AP=(*li)->AdjP(this); // Punti sul nodo adiacente corrente; + std::vector &AN=(*li)->AdjN(this); // Normali sul nodo adiacente corrente; + + //printf("Transf that bring points of %i onto %i\n",id,(*li)->Adj(this)->id); + //print((*li)->A2N(this)); + //printf("Transf that bring points of %i onto %i\n",(*li)->Adj(this)->id,id); + //print((*li)->N2A(this)); + vcg::Point3d pf, nf; + vcg::Point3d pm; + + for (std::size_t i = 0; i < AP.size(); ++i) { + + pf = (*li)->Adj(this)->M*AP[i]; // i punti fissi sono quelli sulla sup degli adiacenti messi nella loro pos corrente + FixP.push_back(pf); + FixBox.Add(pf); + nf=(*li)->Adj(this)->M*Point3d(AP[i]+AN[i])-pf; + nf.Normalize(); + FixN.push_back(nf); + + pm = (*li)->A2N(this)*pf; + MovP.push_back(pm); // i punti che si muovono sono quelli sul adj trasformati in modo tale da cascare sul nodo corr. + MovBox.Add(pm); + } + } + } + + vcg::Matrix44d out; + //if(Rigid) ret=ComputeRigidMatchMatrix(out,FixP,MovP); + //else ret=ComputeMatchMatrix2(out,FixP,FixN,MovP); + if (Rigid) { + ComputeRigidMatchMatrix(FixP,MovP,out); + } + else { + vcg::PointMatchingScale::computeRotoTranslationScalingMatchMatrix(out, FixP, MovP); + } + + Matrix44d outIn=vcg::Inverse(out); + //double maxdiff = MatrixNorm(out); + double maxdiff = MatrixBoxNorm(out,FixBox); + + // printf("Computed Transformation:\n"); print(out);printf("--\n"); + // printf("Collected %i points . Err = %f\n",FixP.size(),maxdiff); + + // La matrice out calcolata e' quella che applicata ai punti MovP li porta su FixP, quindi i punti della mesh corrente + // La nuova posizione di base della mesh diventa quindi + // M * out + // infatti se considero un punto della mesh originale applicarci la nuova matricie significa fare + // p * M * out + + // M=M*out; //--Orig + M = out * M; + + // come ultimo step occorre applicare la matrice trovata a tutti gli allineamenti in gioco. + // scorro tutti i nodi adiacenti attivi + for (auto li = std::begin(Adj); li != std::end(Adj); ++li) { + //print((*li)->N2A(this)); + //print((*li)->A2N(this));printf("--\n"); + + (*li)->N2A(this)=(*li)->N2A(this)*outIn; + (*li)->A2N(this)=(*li)->A2N(this)*out ; + //print((*li)->N2A(this)); + //print((*li)->A2N(this));printf("--\n"); + } + + return maxdiff; + } + + double MatrixNorm(vcg::Matrix44d &NewM) const { + + double maxDiff = 0; + + vcg::Matrix44d diff; + diff.SetIdentity(); + diff = diff-NewM; + + for (int i = 0; i < 4; ++i) { + for (int j = 0; j < 4; ++j) { + maxDiff += (diff[i][j] * diff[i][j]); + } + } + + return maxDiff; + } + + double MatrixBoxNorm(vcg::Matrix44d &NewM, vcg::Box3d &bb) const { + + double maxDiff = 0; + vcg::Point3d pt; + + pt = Point3d(bb.min[0], bb.min[1], bb.min[2]); maxDiff = std::max(maxDiff, Distance(pt, NewM * pt)); + pt = Point3d(bb.max[0], bb.min[1], bb.min[2]); maxDiff = std::max(maxDiff, Distance(pt, NewM * pt)); + pt = Point3d(bb.min[0], bb.max[1], bb.min[2]); maxDiff = std::max(maxDiff, Distance(pt, NewM * pt)); + pt = Point3d(bb.max[0], bb.max[1], bb.min[2]); maxDiff = std::max(maxDiff, Distance(pt, NewM * pt)); + pt = Point3d(bb.min[0], bb.min[1], bb.max[2]); maxDiff = std::max(maxDiff, Distance(pt, NewM * pt)); + pt = Point3d(bb.max[0], bb.min[1], bb.max[2]); maxDiff = std::max(maxDiff, Distance(pt, NewM * pt)); + pt = Point3d(bb.min[0], bb.max[1], bb.max[2]); maxDiff = std::max(maxDiff, Distance(pt, NewM * pt)); + pt = Point3d(bb.max[0], bb.max[1], bb.max[2]); maxDiff = std::max(maxDiff, Distance(pt, NewM * pt)); + + return maxDiff; + } + + int PushBackActiveAdj(std::queue &Q) { + + assert(Active); + + int count = 0; + AlignGlobal::Node *pt; + + for (auto li = std::begin(Adj); li != std::end(Adj); ++li) { + + pt = (*li)->Adj(this); + + if (pt->Active && !pt->Queued) { + ++count; + pt->Queued=true; + Q.push(pt); + } + } + return count; + } + + int DormantAdjNum() { + + int count = 0; + + for (auto li = std::begin(Adj); li != std::end(Adj); ++li) { + if (!(*li)->Adj(this)->Active) ++count; + } + + return count; + } + + int ActiveAdjNum() { + + int count = 0; + + for (auto li = std::begin(Adj); li != std::end(Adj); ++li) { + if ((*li)->Adj(this)->Active) ++count; + } + + return count; + } + }; + + class SubGraphInfo { + public: + int sid; + int size; + Node *root; + }; + + std::list N; + std::list A; + + /** + * Descrittori delle componenti connesse, riempito dalla ComputeConnectedComponents + */ + std::list CC; + + static inline void LOG( FILE *fp, const char * f, ... ) { + + if (fp == 0) return; + + va_list marker; + va_start(marker, f); + std::vfprintf(fp, f, marker); + va_end(marker); + std::fflush(fp); + } + + inline int DormantNum() const { + + int count = 0; + + for (auto li = std::begin(N); li != std::end(N); ++li) { + if (!(*li).Active) ++count; + } + + return count; + } + + inline int ActiveNum() const { + + int count = 0; + + for (auto li = std::begin(N); li != std::end(N); ++li) { + if ((*li).Active) ++count; + } + + return count; + } + + bool CheckGraph() { + + std::vector Visited(N.size(), false); + std::stack st; + + st.push(&(*N.begin())); + while (!st.empty()) { + + AlignGlobal::Node *cur=st.top(); + st.pop(); + // std::printf("Visiting node %i\n",cur->id); + + for (auto li = std::begin(cur->Adj); li != std::end(cur->Adj); ++li) { + if (!Visited[(*li)->Adj(cur)->id]) { + Visited[(*li)->Adj(cur)->id] = true; + st.push((*li)->Adj(cur)); + } + } + } + + size_t cnt = std::count(std::begin(Visited), std::end(Visited), true); + std::printf("Nodes that can be reached from root %zu on %zu \n", cnt, N.size()); + + return (cnt == N.size()); + } + + void Dump(FILE *fp) const { + std::fprintf(fp, "Alignment Graph of %lu nodes and %lu arcs\n", N.size(), A.size()); + // list::iterator li; + // for(li=A.begin();li!=A.end();++li) + // printf("Arc : %3i ->%3i\n",(*li)->Fix->id,(*li)->Mov->id); + } + + int ComputeConnectedComponents() { + + std::printf("Building Connected Components on a graph with %lu nodes and %lu arcs\n", N.size(), A.size()); + + CC.clear(); + + std::stack ToReach; // nodi ancora da visitare + std::stack st; // nodi che si stanno visitando + + for (auto li = std::begin(N); li != std::end(N); ++li) { + (*li).sid = -1; + ToReach.push(&*li); + } + + int cnt = 0; + + while (!ToReach.empty()) { + + SubGraphInfo sg; + st.push(&*ToReach.top()); + ToReach.pop(); + + assert(st.top()->sid==-1); + + sg.root=st.top(); + sg.sid=cnt; + sg.size=0; + st.top()->sid=cnt; + + while (!st.empty()) { + + AlignGlobal::Node *cur=st.top(); + st.pop(); + ++sg.size; + + assert(cur->sid==cnt); + // std::printf("Visiting node %2i %2i\n",cur->id,cur->sid); + + for (auto li = std::begin(cur->Adj); li != std::end(cur->Adj); ++li) { + + if ((*li)->Adj(cur)->sid == -1) { + (*li)->Adj(cur)->sid=cnt; + st.push((*li)->Adj(cur)); + } + else { + assert((*li)->Adj(cur)->sid == cnt); + } + } + + } + + cnt++; + CC.push_back(sg); + + while (!ToReach.empty() && ToReach.top()->sid != -1) ToReach.pop(); + } + + return cnt; + } + + void Clear() { + + for (auto li = std::begin(A); li != std::end(A); ++li) { + delete (*li); + } + + N.clear(); + A.clear(); + } + + void MakeAllDormant() { + for (auto li = std::begin(N); li != std::end(N); ++li) { + (*li).Active=false; + } + } + + bool GlobalAlign(const std::map &Names, const double epsilon, int maxiter, bool Rigid, FILE *elfp, vcg::CallBackPos* cb) { + + double change; + int step = 0, localmaxiter; + + if (cb != NULL) cb(0, "Global Alignment..."); + AlignGlobal::LOG(elfp,"----------------\n----------------\nGlobalAlignment (target eps %7.3f)\n", epsilon); + + std::queue Q; + MakeAllDormant(); + AlignGlobal::Node *curr = ChooseDormantWithMostDormantLink(); + curr->Active = true; + + int cursid = curr->sid; + AlignGlobal::LOG(elfp, "Root node %i '%s' with %i dormant link\n", curr->id, Names.find(curr->id)->second.c_str(), curr->DormantAdjNum()); + + while (DormantNum() > 0) { + + AlignGlobal::LOG(elfp,"---------\nGlobalAlignment loop DormantNum = %i\n", DormantNum()); + + curr = ChooseDormantWithMostActiveLink(); + if (!curr) { + // la componente connessa e' finita e si passa alla successiva cercando un dormant con tutti dormant. + AlignGlobal::LOG(elfp,"\nCompleted Connected Component %i\n", cursid); + AlignGlobal::LOG(elfp,"\nDormant Num: %i\n", DormantNum()); + + curr = ChooseDormantWithMostDormantLink(); + if (curr == 0) { + AlignGlobal::LOG(elfp,"\nFailed ChooseDormantWithMostDormantLink, chosen id:%i\n" ,0); + break; // non ci sono piu' componenti connesse composte da piu' di una singola mesh. + } + else { + AlignGlobal::LOG(elfp,"\nCompleted ChooseDormantWithMostDormantLink, chosen id:%i\n" ,curr->id); + } + + curr->Active = true; + cursid = curr->sid; + curr = ChooseDormantWithMostActiveLink (); + if (curr == 0) { + AlignGlobal::LOG(elfp, "\nFailed ChooseDormantWithMostActiveLink, chosen id:%i\n", 0); + } + else { + AlignGlobal::LOG(elfp, "\nCompleted ChooseDormantWithMostActiveLink, chosen id:%i\n", curr->id); + } + } + + AlignGlobal::LOG(elfp,"\nAdded node %i '%s' with %i/%i Active link\n",curr->id,Names.find(curr->id)->second.c_str(),curr->ActiveAdjNum(),curr->Adj.size()); + curr->Active=true; + curr->Queued=true; + + // Si suppone, ad occhio, che per risistemare un insieme di n mesh servano al piu' 10n passi; + localmaxiter = ActiveNum() * 10; + Q.push(curr); + step = 0; + + // Ciclo interno di allineamento + while (!Q.empty()) { + + curr = Q.front(); + Q.pop(); + + curr->Queued=false; + change = curr->AlignWithActiveAdj(Rigid); + step++; + + AlignGlobal::LOG(elfp, " Step %5i Queue size %5i Moved %4i err %10.4f\n", step, Q.size(), curr->id, change); + + if (change > epsilon) { + + curr->PushBackActiveAdj(Q); + AlignGlobal::LOG(elfp," Large Change pushing back active nodes adj to %i to Q (new size %i)\n",curr->id,Q.size()); + + if (change > epsilon * 1000) { + std::printf("Large Change Warning\n\n"); + } + } + if (step > localmaxiter) return false; + if (step > maxiter) return false; + } + } + + if (!curr) { + + AlignGlobal::LOG(elfp,"Alignment failed for %i meshes:\n",DormantNum()); + for (auto li = std::begin(N); li != std::end(N); ++li){ + if (!(*li).Active) { + //(*li).M.SetIdentity(); + (*li).Discarded=true; + AlignGlobal::LOG(elfp, "%5i\n", (*li).id); + } + } + } + + AlignGlobal::LOG(elfp,"Completed Alignment in %i steps with error %f\n",step,epsilon); + return true; + } + + AlignGlobal::Node* ChooseDormantWithMostDormantLink() { + + int MaxAdjNum = 0; + AlignGlobal::Node *BestNode = 0; + + for (auto li = std::begin(N); li != std::end(N); ++li) { + if (!(*li).Active) { + int AdjNum = (*li).DormantAdjNum(); + if (AdjNum > MaxAdjNum) { + MaxAdjNum = AdjNum; + BestNode = &(*li); + } + } + } + + assert(BestNode); + assert(!BestNode->Queued); + assert(!BestNode->Active); + + return BestNode; + } + + AlignGlobal::Node* ChooseDormantWithMostActiveLink() { + + int MaxAdjNum = 0; + AlignGlobal::Node* BestNode = 0; + + for (auto li = std::begin(N); li != std::end(N); ++li) { + if (!(*li).Active) { + int AdjNum = (*li).ActiveAdjNum(); + if (AdjNum > MaxAdjNum) { + MaxAdjNum = AdjNum; + BestNode = &(*li); + } + } + } + + if (!BestNode){ + // Abbiamo finito di sistemare questa componente connessa. + std::printf("Warning! Unable to find a Node with at least an active link!!\n"); + return 0; + } + + assert(BestNode); + assert(!BestNode->Queued); + assert(!BestNode->Active); + + return BestNode; + } + + void BuildGraph(std::vector &Res, std::vector &Tr, std::vector &Id) { + + Clear(); + // si suppone che la matrice Tr[i] sia relativa ad un nodo con id Id[i]; + int mn = static_cast(Tr.size()); + + // printf("building graph\n"); + AlignGlobal::Node rgn; + rgn.Active = false; + rgn.Queued = false; + rgn.Discarded = false; + + std::map Id2N; + std::map Id2I; + + for (int i = 0; i < mn; ++i) { + rgn.id = Id[i]; + rgn.M = Tr[i]; + N.push_back(rgn); + Id2N[rgn.id] = &(N.back()); + Id2I[rgn.id] = i; + } + + std::printf("building %zu graph arcs\n",Res.size()); + AlignGlobal::VirtAlign *tv; + + // Ciclo principale in cui si costruiscono i vari archi + // Si assume che i result siano fatti nel sistema di riferimento della matrici fix. + + for (auto rii = std::begin(Res); rii != std::end(Res); ++rii) { + + AlignPair::Result *ri = *rii; + tv = new VirtAlign(); + tv->Fix = Id2N[(*ri).FixName]; + tv->Mov = Id2N[(*ri).MovName]; + tv->Fix->Adj.push_back(tv); + tv->Mov->Adj.push_back(tv); + tv->FixP = (*ri).Pfix; + tv->MovP = (*ri).Pmov; + tv->FixN = (*ri).Nfix; + tv->MovN = (*ri).Nmov; + + /* + + Siano: + Pf e Pm i punti sulle mesh fix e mov nei sist di rif originali + Pft e Pmt i punti sulle mesh fix e mov dopo le trasf correnti; + Mf e Mm le trasf che portano le mesh fix e mov nelle posizioni correnti; + If e Im le trasf inverse di cui sopra + Vale: + Pft = Mf*Pf e Pmt = Mm*Pm + Pf = If*Pft e Pm = Im*Pmt + + Res * Pm = Pf; + Res * Im * Pmt = If * Pft + Mf * Res * Im * Pmt = Mf * If * Pft + (Mf * Res * Im) * Pmt = Pft + + */ + Matrix44d Mm = Tr[Id2I[(*ri).MovName]]; + Matrix44d Mf = Tr[Id2I[(*ri).FixName]]; + Matrix44d Im = Inverse(Mm); + Matrix44d If = Inverse(Mf); + + Matrix44d NewTr = Mf * (*ri).Tr * Im; // --- orig + + tv->M2F = NewTr; + tv->F2M = Inverse(NewTr); + + assert(tv->Check()); + A.push_back(tv); + } + + ComputeConnectedComponents(); + } + + bool GetMatrixVector(std::vector &Tr, std::vector &Id) { + + std::map Id2N; + + Tr.clear(); + + for (auto li = std::begin(N); li != std::end(N); ++li) { + Id2N[(*li).id] = &*li; + } + + Tr.resize(Id.size()); + + for (std::size_t i = 0; i < Id.size(); ++i) { + + if (Id2N[Id[i]] == 0) return false; + Tr[i] = Id2N[Id[i]]->M; + } + + return false; + } + + }; +} + +#endif //MESHLAB_ALIGNGLOBAL_H From df6f92da0125db90f2a2df16bd5a557869b03e21 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 14 Sep 2021 16:49:09 +0200 Subject: [PATCH 21/56] removed old .clang-format file --- wrap/openfbx/.clang-format | 42 -------------------------------------- 1 file changed, 42 deletions(-) delete mode 100755 wrap/openfbx/.clang-format diff --git a/wrap/openfbx/.clang-format b/wrap/openfbx/.clang-format deleted file mode 100755 index 2950cfd38..000000000 --- a/wrap/openfbx/.clang-format +++ /dev/null @@ -1,42 +0,0 @@ -BasedOnStyle: LLVM - -AlignAfterOpenBracket : false -AlignEscapedNewlinesLeft : true -AlignConsecutiveAssignments : false -AllowAllParametersOfDeclarationOnNextLine : false -AccessModifierOffset : -4 -AllowShortCaseLabelsOnASingleLine : true -AllowShortFunctionsOnASingleLine : Inline -AllowShortIfStatementsOnASingleLine : true -AllowShortLoopsOnASingleLine : true -AlwaysBreakAfterDefinitionReturnType : None -BinPackArguments : false -BinPackParameters : false -BreakBeforeBraces : Allman -BreakConstructorInitializersBeforeComma : true -ColumnLimit : 120 -ConstructorInitializerIndentWidth : 4 -ConstructorInitializerAllOnOneLineOrOnePerLine : false -ContinuationIndentWidth : 4 -IndentCaseLabels : true -IndentWidth : 4 -KeepEmptyLinesAtTheStartOfBlocks : true -MaxEmptyLinesToKeep : 2 -NamespaceIndentation : None -PenaltyBreakBeforeFirstCallParameter : 0 -PenaltyReturnTypeOnItsOwnLine : 1000 -PointerAlignment : Left -SpaceAfterCStyleCast : false -SpaceBeforeAssignmentOperators : true -SpaceBeforeParens : true -SpaceInEmptyParentheses : false -SpacesBeforeTrailingComments : 1 -SpacesInAngles : false -SpacesInCStyleCastParentheses : false -SpacesInParentheses : false -SpacesInSquareBrackets : false -Standard : Cpp11 -TabWidth : 4 -UseTab : true - - From 30f0383fc60e0137715a20dc9bcfa4b13b2765aa Mon Sep 17 00:00:00 2001 From: gabryon99 Date: Tue, 14 Sep 2021 17:47:56 +0200 Subject: [PATCH 22/56] add ScalarType to OccupancyGrid and MeshTree --- vcg/complex/algorithms/meshtree.h | 22 +++++++++++----------- vcg/complex/algorithms/occupancy_grid.h | 12 ++++++------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/vcg/complex/algorithms/meshtree.h b/vcg/complex/algorithms/meshtree.h index 3bd18a9a3..081c81b28 100644 --- a/vcg/complex/algorithms/meshtree.h +++ b/vcg/complex/algorithms/meshtree.h @@ -11,7 +11,7 @@ namespace vcg { - template + template class MeshTree { public: @@ -24,11 +24,11 @@ namespace vcg { MeshNode(MeshType *_m) : m{_m}, glued{false} {} - vcg::Matrix44d &tr() { + vcg::Matrix44 &tr() { return m->cm.Tr; } - const vcg::Box3d &bbox() const { + const vcg::Box3 &bbox() const { return m->cm.bbox; } @@ -47,7 +47,7 @@ namespace vcg { std::map nodeMap; std::vector resultList; - vcg::OccupancyGrid OG; + vcg::OccupancyGrid OG; vcg::CallBackPos * cb; MeshType *MM(unsigned int i) { @@ -137,12 +137,12 @@ namespace vcg { std::sprintf(buf, "Computing Overlaps %i glued meshes...\n", gluedNum()); cb(0, buf); - OG.Init(static_cast(nodeMap.size()), vcg::Box3d::Construct(gluedBBox()), mtp.OGSize); + OG.Init(static_cast(nodeMap.size()), vcg::Box3::Construct(gluedBBox()), mtp.OGSize); for(auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { MeshTree::MeshNode *mn = ni->second; if (mn->glued) { - OG.AddMesh(mn->m->cm, vcg::Matrix44d::Construct(mn->tr()), mn->Id()); + OG.AddMesh(mn->m->cm, vcg::Matrix44::Construct(mn->tr()), mn->Id()); } } @@ -357,22 +357,22 @@ namespace vcg { result.MovName=movId; } - inline vcg::Box3d bbox() { + inline vcg::Box3 bbox() { - vcg::Box3d FullBBox; + vcg::Box3 FullBBox; for (auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { FullBBox.Add(vcg::Matrix44d::Construct(ni->second->tr()),ni->second->bbox()); } return FullBBox; } - inline vcg::Box3d gluedBBox() { + inline vcg::Box3 gluedBBox() { - vcg::Box3d FullBBox; + vcg::Box3 FullBBox; for (auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { if (ni->second->glued) { - FullBBox.Add(vcg::Matrix44d::Construct(ni->second->tr()), ni->second->bbox()); + FullBBox.Add(vcg::Matrix44::Construct(ni->second->tr()), ni->second->bbox()); } } return FullBBox; diff --git a/vcg/complex/algorithms/occupancy_grid.h b/vcg/complex/algorithms/occupancy_grid.h index 1c74ae6f7..6ddcfd9cc 100644 --- a/vcg/complex/algorithms/occupancy_grid.h +++ b/vcg/complex/algorithms/occupancy_grid.h @@ -13,7 +13,7 @@ #define OG_MESH_INFO_MAX_STAT 64 namespace vcg { - template + template class OccupancyGrid { public: @@ -165,7 +165,7 @@ namespace vcg { */ std::map VM; - bool Init(int _mn, Box3d bb, int size) { + bool Init(int _mn, Box3 bb, int size) { // the number of meshes (including all the unused ones; eg it is the range of the possible id) mn = _mn; @@ -180,7 +180,7 @@ namespace vcg { return true; } - void Add(const char *MeshName, Matrix44d &Tr, int id) { + void Add(const char *MeshName, Matrix44 &Tr, int id) { AlignPair::A2Mesh M; @@ -190,9 +190,9 @@ namespace vcg { AddMesh(M,Tr,id); } - void AddMeshes(std::vector &names, std::vector &trv,int size) { + void AddMeshes(std::vector &names, std::vector> &trv,int size) { - Box3d bb, totalbb; + Box3 bb, totalbb; bb.SetNull(); totalbb.SetNull(); @@ -212,7 +212,7 @@ namespace vcg { } } - void AddMesh(MeshType &mesh, const Matrix44d &Tr, int ind) { + void AddMesh(MeshType &mesh, const Matrix44 &Tr, int ind) { Matrix44f Trf; Trf.Import(Tr); From 1980f1a775ba3d2a020c0960286f58ea4be9813a Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Wed, 15 Sep 2021 15:15:28 +0200 Subject: [PATCH 23/56] curvature ocf const correctness --- vcg/simplex/vertex/component_ocf.h | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/vcg/simplex/vertex/component_ocf.h b/vcg/simplex/vertex/component_ocf.h index c063308c4..8750066c7 100644 --- a/vcg/simplex/vertex/component_ocf.h +++ b/vcg/simplex/vertex/component_ocf.h @@ -494,13 +494,17 @@ template class CurvatureDirOcf: public TT { typedef typename CurvatureDirType::CurVecType CurVecType; typedef typename CurvatureDirType::CurScalarType CurScalarType; - CurVecType &PD1() { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].max_dir;} - CurVecType &PD2() { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].min_dir;} - CurVecType cPD1() const { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].max_dir;} - CurVecType cPD2() const { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].min_dir;} - - CurScalarType &K1() { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].k1;} - CurScalarType &K2() { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].k2;} + CurVecType& PD1() { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].max_dir;} + CurVecType& PD2() { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].min_dir;} + const CurVecType& cPD1() const { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].max_dir;} + const CurVecType& cPD2() const { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].min_dir;} + const CurVecType& PD1() const { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].max_dir;} + const CurVecType& PD2() const { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].min_dir;} + + CurScalarType& K1() { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].k1;} + CurScalarType& K2() { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].k2;} + CurScalarType K1() const { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].k1;} + CurScalarType K2() const { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].k2;} CurScalarType cK1() const { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].k1;} CurScalarType cK2() const { assert((*this).Base().CurvatureDirEnabled); return (*this).Base().CuDV[(*this).Index()].k2;} From 6d7eeb4908c500ec3ea6bc3056f3ef8e8b756135 Mon Sep 17 00:00:00 2001 From: gabryon99 Date: Wed, 15 Sep 2021 23:47:42 +0200 Subject: [PATCH 24/56] format occupancy_grid.h --- vcg/complex/algorithms/occupancy_grid.h | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/vcg/complex/algorithms/occupancy_grid.h b/vcg/complex/algorithms/occupancy_grid.h index 6ddcfd9cc..e4603119e 100644 --- a/vcg/complex/algorithms/occupancy_grid.h +++ b/vcg/complex/algorithms/occupancy_grid.h @@ -73,9 +73,9 @@ namespace vcg { bool operator < (const MeshCounter &c) const { - if (cnt==c.cnt) return false; + if (cnt == c.cnt) return false; - size_t ii = 0; + std::size_t ii = 0; while (ii < MeshCounter::MaxVal()){ if (cnt[ii] != c.cnt[ii]) { @@ -95,9 +95,9 @@ namespace vcg { public: - int id; // the id of the mesh - int area; // number of voxels in the OG touched by this mesh - int coverage; // quanto e' ricoperta da altre mesh eccetto se stessa (eg: se ho due mesh di 1000 con overlap al 30% la covrg e' 300) + int id {-1}; // the id of the mesh + int area {0}; // number of voxels in the OG touched by this mesh + int coverage {0}; // quanto e' ricoperta da altre mesh eccetto se stessa (eg: se ho due mesh di 1000 con overlap al 30% la covrg e' 300) bool used = false; @@ -106,12 +106,8 @@ namespace vcg { // are covered by othermeshes. Sum(densityDistribution) == area; // if densityDistribution[1] > 0 means that this mesh is the unique to cover some portion of the space. - OGMeshInfo() { - Init(-1); - } - void Init(int _id) { - coverage=0;area=0; id=_id; + id=_id; } bool operator < (OGMeshInfo &o) const { @@ -251,7 +247,7 @@ namespace vcg { std::vector VA; // virtual arcs VA.resize(mn * mn, 0); - std::map, int> VAMap; + std::map, int> VAMap; // First Loop: // Scan the grid and update possible arc count @@ -412,7 +408,7 @@ namespace vcg { int ccnt = 0; MaxCount = 0; - int sz=G.size(); + int sz = G.size(); for (int i = 0; i < sz; ++i) From 3cd68269fd79bfe3c328dac2ed517550da576e3d Mon Sep 17 00:00:00 2001 From: gabryon99 Date: Wed, 15 Sep 2021 23:48:59 +0200 Subject: [PATCH 25/56] replaced for with smart ones --- vcg/complex/algorithms/meshtree.h | 96 ++++++++++++++++--------------- 1 file changed, 49 insertions(+), 47 deletions(-) diff --git a/vcg/complex/algorithms/meshtree.h b/vcg/complex/algorithms/meshtree.h index 081c81b28..f5221f08c 100644 --- a/vcg/complex/algorithms/meshtree.h +++ b/vcg/complex/algorithms/meshtree.h @@ -22,7 +22,7 @@ namespace vcg { bool glued; MeshType *m; - MeshNode(MeshType *_m) : m{_m}, glued{false} {} + explicit MeshNode(MeshType *_m) : m{_m}, glued{false} {} vcg::Matrix44 &tr() { return m->cm.Tr; @@ -47,21 +47,19 @@ namespace vcg { std::map nodeMap; std::vector resultList; - vcg::OccupancyGrid OG; - vcg::CallBackPos * cb; + vcg::OccupancyGrid OG{}; + vcg::CallBackPos* cb = vcg::DummyCallBackPos; MeshType *MM(unsigned int i) { return nodeMap[i]->m; } - MeshTree() {} - - MeshTree(vcg::CallBackPos* _cb) : cb{_cb} {} + MeshTree() = default; void clear() { - for (auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { - delete ni->second; + for (auto& ni : nodeMap) { + delete ni.second; } nodeMap.clear(); @@ -73,8 +71,8 @@ namespace vcg { auto li = std::begin(resultList); while (li != resultList.end()) { - if (li->MovName==mp->Id() || li->FixName==mp->Id()) { - li=resultList.erase(li); + if (li->MovName == mp->Id() || li->FixName == mp->Id()) { + li = resultList.erase(li); } else { ++li; @@ -84,21 +82,21 @@ namespace vcg { vcg::AlignPair::Result* findResult(int id1, int id2) { - for (auto li = std::begin(resultList); li != std::end(resultList); ++li) { - if ((li->MovName==id1 && li->FixName==id2) || (li->MovName==id2 && li->FixName==id1) ) { - return &*li; + for (auto& li : resultList) { + if ((li.MovName == id1 && li.FixName == id2) || (li.MovName == id2 && li.FixName == id1) ) { + return &li; } } - return 0; + return nullptr; } MeshTree::MeshNode *find(int id) { MeshTree::MeshNode *mp = nodeMap[id]; - if (mp==0 || mp->Id()!=id) { - assert("You are trying to find an unexistent mesh"==0); + if (mp == nullptr || mp->Id() != id) { + assert("You are trying to find a non existent mesh" == nullptr); } return mp; @@ -106,24 +104,23 @@ namespace vcg { MeshTree::MeshNode *find(MeshType *m) { - for (auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { - if (ni->second->m==m) return ni->second; + for (auto& ni : nodeMap) { + if (ni.second->m == m) return ni.second; } - assert("You are trying to find an unexistent mesh" ==0); - return 0; + assert("You are trying to find a non existent mesh" == nullptr); + return nullptr; } int gluedNum() { - int cnt = 0; + int count = 0; - for (auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { - MeshTree::MeshNode *mn=ni->second; - if (mn->glued) ++cnt; + for (auto& ni : nodeMap) { + if (ni.second->glued) ++count; } - return cnt; + return count; } void Process(vcg::AlignPair::Param &ap, MeshTree::Param &mtp) { @@ -139,8 +136,8 @@ namespace vcg { OG.Init(static_cast(nodeMap.size()), vcg::Box3::Construct(gluedBBox()), mtp.OGSize); - for(auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { - MeshTree::MeshNode *mn = ni->second; + for (auto& ni : nodeMap) { + MeshTree::MeshNode *mn = ni.second; if (mn->glued) { OG.AddMesh(mn->m->cm, vcg::Matrix44::Construct(mn->tr()), mn->Id()); } @@ -157,8 +154,8 @@ namespace vcg { if (!resultList.empty()) { vcg::Distribution H; - for (auto li = std::begin(resultList); li != std::end(resultList); ++li) { - H.Add(li->err); + for (auto& li : resultList) { + H.Add(li.err); } percentileThr = H.Percentile(1.0f - mtp.recalcThreshold); @@ -167,7 +164,7 @@ namespace vcg { std::size_t totalArcNum = 0; int preservedArcNum = 0, recalcArcNum = 0; - while(totalArcNum mtp.arcThreshold) + while(totalArcNum < OG.SVA.size() && OG.SVA[totalArcNum].norm_area > mtp.arcThreshold) { AlignPair::Result *curResult = findResult(OG.SVA[totalArcNum].s, OG.SVA[totalArcNum].t); if (curResult) { @@ -250,10 +247,8 @@ namespace vcg { } vcg::Distribution H; // stat for printing - for (auto li = std::begin(resultList); li != std::end(resultList); ++li) { - if ((*li).isValid()) { - H.Add(li->err); - } + for (auto& li : resultList) { + if (li.isValid()) H.Add(li.err); } std::memset(buf, '\0', 1024); @@ -265,26 +260,30 @@ namespace vcg { void ProcessGlobal(vcg::AlignPair::Param &ap) { + char buff[1024]; + std::memset(buff, '\0', 1024); + /************** Preparing Matrices for global alignment *************/ std::vector GluedIdVec; std::vector GluedTrVec; std::map names; - for (auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { - MeshTree::MeshNode *mn=ni->second; + for (auto& ni : nodeMap) { + + MeshTree::MeshNode *mn = ni.second; if (mn->glued) { GluedIdVec.push_back(mn->Id()); GluedTrVec.push_back(vcg::Matrix44d::Construct(mn->tr())); - names[mn->Id()]=qUtf8Printable(mn->m->label()); + names[mn->Id()] = qUtf8Printable(mn->m->label()); } } vcg::AlignGlobal AG; std::vector ResVecPtr; - for (auto li = std::begin(resultList); li != std::end(resultList); ++li) { - if ((*li).isValid()) { - ResVecPtr.push_back(&*li); + for (auto& li : resultList) { + if (li.isValid()) { + ResVecPtr.push_back(&li); } } @@ -304,6 +303,8 @@ namespace vcg { MM(GluedIdVec[ii])->cm.Tr.Import(GluedTrVecOut[ii]); } + std::sprintf(buff, "Completed Global Alignment (error bound %6.4f)\n", StartGlobErr); + cb(0, buff); } void ProcessArc(int fixId, int movId, vcg::AlignPair::Result &result, vcg::AlignPair::Param ap) { @@ -349,9 +350,8 @@ namespace vcg { aa.fix=&Fix; aa.ap = ap; - vcg::Matrix44d In = MovM; // Perform the ICP algorithm - aa.align(In,UG,VG,result); + aa.align(MovM,UG,VG,result); result.FixName=fixId; result.MovName=movId; @@ -360,9 +360,10 @@ namespace vcg { inline vcg::Box3 bbox() { vcg::Box3 FullBBox; - for (auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { - FullBBox.Add(vcg::Matrix44d::Construct(ni->second->tr()),ni->second->bbox()); + for (auto& ni : nodeMap) { + FullBBox.Add(vcg::Matrix44d::Construct(ni.second->tr()), ni.second->bbox()); } + return FullBBox; } @@ -370,11 +371,12 @@ namespace vcg { vcg::Box3 FullBBox; - for (auto ni = std::begin(nodeMap); ni != std::end(nodeMap); ++ni) { - if (ni->second->glued) { - FullBBox.Add(vcg::Matrix44::Construct(ni->second->tr()), ni->second->bbox()); + for (auto& ni : nodeMap) { + if (ni.second->glued) { + FullBBox.Add(vcg::Matrix44::Construct(ni.second->tr()), ni.second->bbox()); } } + return FullBBox; } From b98261e29fd6e35f73f467010dfc3f1a52ee3298 Mon Sep 17 00:00:00 2001 From: gabryon99 Date: Thu, 16 Sep 2021 18:58:41 +0200 Subject: [PATCH 26/56] fix meshtree params --- vcg/complex/algorithms/align_global.h | 15 ++++++++++----- vcg/complex/algorithms/meshtree.h | 9 ++++++--- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/vcg/complex/algorithms/align_global.h b/vcg/complex/algorithms/align_global.h index fbd049dfd..c695a623e 100644 --- a/vcg/complex/algorithms/align_global.h +++ b/vcg/complex/algorithms/align_global.h @@ -472,7 +472,7 @@ namespace vcg { AlignGlobal::LOG(elfp,"\nDormant Num: %i\n", DormantNum()); curr = ChooseDormantWithMostDormantLink(); - if (curr == 0) { + if (curr == nullptr) { AlignGlobal::LOG(elfp,"\nFailed ChooseDormantWithMostDormantLink, chosen id:%i\n" ,0); break; // non ci sono piu' componenti connesse composte da piu' di una singola mesh. } @@ -483,7 +483,7 @@ namespace vcg { curr->Active = true; cursid = curr->sid; curr = ChooseDormantWithMostActiveLink (); - if (curr == 0) { + if (curr == nullptr) { AlignGlobal::LOG(elfp, "\nFailed ChooseDormantWithMostActiveLink, chosen id:%i\n", 0); } else { @@ -545,7 +545,7 @@ namespace vcg { AlignGlobal::Node* ChooseDormantWithMostDormantLink() { int MaxAdjNum = 0; - AlignGlobal::Node *BestNode = 0; + AlignGlobal::Node *BestNode = nullptr; for (auto li = std::begin(N); li != std::end(N); ++li) { if (!(*li).Active) { @@ -557,6 +557,11 @@ namespace vcg { } } + if (!BestNode){ + std::printf("Warning! Unable to find a Node with at least a dormant link!!\n"); + return nullptr; + } + assert(BestNode); assert(!BestNode->Queued); assert(!BestNode->Active); @@ -567,7 +572,7 @@ namespace vcg { AlignGlobal::Node* ChooseDormantWithMostActiveLink() { int MaxAdjNum = 0; - AlignGlobal::Node* BestNode = 0; + AlignGlobal::Node* BestNode = nullptr; for (auto li = std::begin(N); li != std::end(N); ++li) { if (!(*li).Active) { @@ -582,7 +587,7 @@ namespace vcg { if (!BestNode){ // Abbiamo finito di sistemare questa componente connessa. std::printf("Warning! Unable to find a Node with at least an active link!!\n"); - return 0; + return nullptr; } assert(BestNode); diff --git a/vcg/complex/algorithms/meshtree.h b/vcg/complex/algorithms/meshtree.h index f5221f08c..13d0d3a98 100644 --- a/vcg/complex/algorithms/meshtree.h +++ b/vcg/complex/algorithms/meshtree.h @@ -39,7 +39,7 @@ namespace vcg { class Param { public: - int OGSize = 5000; + int OGSize = 50000; float arcThreshold = 0.3f; float recalcThreshold = 0.1f; }; @@ -50,12 +50,14 @@ namespace vcg { vcg::OccupancyGrid OG{}; vcg::CallBackPos* cb = vcg::DummyCallBackPos; + MeshTree() = default; + + ~MeshTree() { clear(); } + MeshType *MM(unsigned int i) { return nodeMap[i]->m; } - MeshTree() = default; - void clear() { for (auto& ni : nodeMap) { @@ -381,6 +383,7 @@ namespace vcg { } }; + } #endif //VCGLIB_MESHTREE_H From 9bdcf887f2d97c030516c13089afc7107b436863 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 5 Oct 2021 16:57:17 +0200 Subject: [PATCH 27/56] fix eigen compile error on curvature_fitting.h --- vcg/complex/algorithms/update/curvature_fitting.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/vcg/complex/algorithms/update/curvature_fitting.h b/vcg/complex/algorithms/update/curvature_fitting.h index 27e96182f..44cd60e07 100644 --- a/vcg/complex/algorithms/update/curvature_fitting.h +++ b/vcg/complex/algorithms/update/curvature_fitting.h @@ -372,8 +372,8 @@ class Quadric { assert(VV.size() >= 5); Eigen::MatrixXd A(VV.size(),5); - Eigen::MatrixXd b(VV.size(),1); - Eigen::MatrixXd sol(5,1); + Eigen::VectorXd b(VV.size()); + Eigen::VectorXd sol(5); for(unsigned int c=0; c < VV.size(); ++c) { @@ -580,12 +580,12 @@ class Quadric c_val = -c_val; CoordType v1, v2; - v1[0] = c_vec[0]; - v1[1] = c_vec[1]; + v1[0] = c_vec(0); + v1[1] = c_vec(1); v1[2] = d * v1[0] + e * v1[1]; - v2[0] = c_vec[2]; - v2[1] = c_vec[3]; + v2[0] = c_vec(2); + v2[1] = c_vec(3); v2[2] = d * v2[0] + e * v2[1]; v1 = v1.Normalize(); From fa6bab75912840168c7814d9157bf11bc5be4224 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Wed, 13 Oct 2021 15:29:56 +0200 Subject: [PATCH 28/56] fix export ply scalar precision on texcoords --- wrap/io_trimesh/export_ply.h | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/wrap/io_trimesh/export_ply.h b/wrap/io_trimesh/export_ply.h index 4f1202376..3823c337c 100644 --- a/wrap/io_trimesh/export_ply.h +++ b/wrap/io_trimesh/export_ply.h @@ -104,7 +104,9 @@ class ExporterPLY const int DGTS = vcg::tri::io::Precision::digits(); const int DGTVQ = vcg::tri::io::Precision::digits(); const int DGTVR = vcg::tri::io::Precision::digits(); + const int DGTVT = vcg::tri::io::Precision::digits(); const int DGTFQ = vcg::tri::io::Precision::digits(); + const int DGTFT = vcg::tri::io::Precision::digits(); bool saveTexIndexFlag = false; if(binary) h=hbin; @@ -202,9 +204,11 @@ class ExporterPLY } if( ( HasPerVertexTexCoord(m) && pi.mask & Mask::IOM_VERTTEXCOORD ) ) { + const char* rdtp = vcg::tri::io::Precision::typeName(); fprintf(fpout, - "property float texture_u\n" - "property float texture_v\n"); + "property %s texture_u\n" + "property %s texture_v\n", + rdtp, rdtp); } for(size_t i=0;i::typeName(); fprintf(fpout, - "property list uchar float texcoord\n" ); + "property list uchar %s texcoord\n", rdtp ); } // The texture index information has to be saved for each face (if necessary) both for PerVert and PerWedg if( saveTexIndexFlag && @@ -493,10 +498,10 @@ class ExporterPLY fwrite(&r,sizeof(typename VertexType::RadiusType),1,fpout); } - if( HasPerVertexTexCoord(m) && (pi.mask & Mask::IOM_VERTTEXCOORD) ) - { - t = ScalarType(vp->T().u()); fwrite(&t,sizeof(ScalarType),1,fpout); - t = ScalarType(vp->T().v()); fwrite(&t,sizeof(ScalarType),1,fpout); + if( HasPerVertexTexCoord(m) && (pi.mask & Mask::IOM_VERTTEXCOORD) ){ + typename VertexType::TexCoordType::ScalarType t; + t = ScalarType(vp->T().u()); fwrite(&t,sizeof(typename VertexType::TexCoordType::ScalarType),1,fpout); + t = ScalarType(vp->T().v()); fwrite(&t,sizeof(typename VertexType::TexCoordType::ScalarType),1,fpout); } for(size_t i=0;iR()); if( HasPerVertexTexCoord(m) && (pi.mask & Mask::IOM_VERTTEXCOORD) ) - fprintf(fpout,"%f %f",vp->T().u(),vp->T().v()); + fprintf(fpout,"%.*g %.*g",DGTVT,vp->T().u(),vp->T().v()); for(size_t i=0;iV(k)->T().u(); t[k*2+1] = fp->V(k)->T().v(); } - fwrite(t,sizeof(float),6,fpout); + fwrite(t,sizeof(typename FaceType::TexCoordType::ScalarType),6,fpout); } else if( HasPerWedgeTexCoord(m) && (pi.mask & Mask::IOM_WEDGTEXCOORD) ) { fwrite(&b6char,sizeof(char),1,fpout); - float t[6]; + typename FaceType::TexCoordType::ScalarType t[6]; for(int k=0;k<3;++k) { t[k*2+0] = fp->WT(k).u(); t[k*2+1] = fp->WT(k).v(); } - fwrite(t,sizeof(float),6,fpout); + fwrite(t,sizeof(typename FaceType::TexCoordType::ScalarType),6,fpout); } if(saveTexIndexFlag) @@ -778,7 +783,8 @@ class ExporterPLY { fprintf(fpout,"%d ",fp->VN()*2); for(int k=0;kVN();++k) - fprintf(fpout,"%f %f " + fprintf(fpout,"%.*g %.*g " + ,DGTFT ,fp->V(k)->T().u() ,fp->V(k)->T().v() ); From 3bb6cfc71aa3081c4f8a30bce45df3bfcd0ce547 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Thu, 14 Oct 2021 17:06:30 +0200 Subject: [PATCH 29/56] missing include in complex/base.h --- vcg/complex/base.h | 1 + 1 file changed, 1 insertion(+) diff --git a/vcg/complex/base.h b/vcg/complex/base.h index 2656a3183..befda76c2 100644 --- a/vcg/complex/base.h +++ b/vcg/complex/base.h @@ -29,6 +29,7 @@ #include +#include "exception.h" #include "used_types.h" namespace vcg { From cdd0a520a981ed8f5662626ba98ecb47659b6452 Mon Sep 17 00:00:00 2001 From: Paolo Cignoni Date: Thu, 14 Oct 2021 23:02:13 +0200 Subject: [PATCH 30/56] Update curvature_fitting.h updated curvature local, added callback --- .../algorithms/update/curvature_fitting.h | 42 +++---------------- 1 file changed, 5 insertions(+), 37 deletions(-) diff --git a/vcg/complex/algorithms/update/curvature_fitting.h b/vcg/complex/algorithms/update/curvature_fitting.h index 44cd60e07..9de9fe3ee 100644 --- a/vcg/complex/algorithms/update/curvature_fitting.h +++ b/vcg/complex/algorithms/update/curvature_fitting.h @@ -619,9 +619,8 @@ class Quadric - static void updateCurvatureLocal (MeshType & mesh, float radiusSphere) + static void updateCurvatureLocal (MeshType & mesh, float radiusSphere, vcg::CallBackPos * cb = NULL) { - bool verbose = false; bool projectionPlaneCheck = true; int vertexesPerFit = 0; @@ -631,24 +630,16 @@ class Quadric { std::vector vv; std::vector vvtmp; - + if (cb && ((i%1024)==00)) { + (*cb)(int(100.0f * (float)i / (float)mesh.vn),"Vertices Analysis"); + } int count; - if (verbose && !((count = (vi - mesh.vert.begin())) % 1000)) - printf ("vertex %d of %d\n",count,mesh.vert.size()); - - // if (kRing != 0) - // expandRing (&*vi, kRing, 5, &vv); - // else expandSphereLocal (mesh, &*vi, radiusSphere, 5, &vv); assert (vv.size() >= 5); CoordType ppn; - // if (averageNormalMode) - // //ppn = (*vi).N(); getAverageNormal (&*vi, vv, &ppn); - // else - // getProjPlaneNormal (&*vi, vv, &ppn); if (projectionPlaneCheck) { @@ -659,33 +650,12 @@ class Quadric } vvtmp.clear(); - - // if (montecarloMaxVertexNum) - // { - // //printf ("P: %d\n", vv.size()); - // vvtmp.reserve (vv.size ()); - // //printf ("TP: %d\n", vvtmp.size()); - // applyMontecarlo (montecarloMaxVertexNum, vv, &vvtmp); - // //printf ("TD: %d\n", vvtmp.size()); - // vv = vvtmp; - // //printf ("D: %d\n", vv.size()); - // //printf ("\n"); - // } - assert (vv.size() >= 5); std::vector ref; computeReferenceFramesLocal (&*vi, ppn, &ref); - /* - printf ("%lf %lf %lf - %lf %lf %lf - %lf %lf %lf\n", - ref[0][0], ref[0][1], ref[0][2], - ref[1][0], ref[1][1], ref[1][2], - ref[2][0], ref[2][1], ref[2][2]); - */ - vertexesPerFit += vv.size(); - //printf ("size: %d\n", vv.size()); QuadricLocal q; fitQuadricLocal (&*vi, ref, vv, &q); @@ -694,9 +664,7 @@ class Quadric } - //if (verbose) - //printf ("average vertex num in each fit: %f, total %d, vn %d\n", ((float) vertexesPerFit) / mesh.vn, vertexesPerFit, mesh.vn); - if (verbose) + if (cb) printf ("average vertex num in each fit: %f\n", ((float) vertexesPerFit) / mesh.vn); } From 623f3600f3169e59114e9cf8ed11892ef7262153 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 19 Oct 2021 11:35:23 +0200 Subject: [PATCH 31/56] eigen copyright mozilla homepage link substitution --- eigenlib/Eigen/Cholesky | 2 +- eigenlib/Eigen/CholmodSupport | 2 +- eigenlib/Eigen/Core | 2 +- eigenlib/Eigen/Eigenvalues | 2 +- eigenlib/Eigen/Geometry | 2 +- eigenlib/Eigen/Householder | 2 +- eigenlib/Eigen/IterativeLinearSolvers | 2 +- eigenlib/Eigen/Jacobi | 2 +- eigenlib/Eigen/LU | 2 +- eigenlib/Eigen/MetisSupport | 2 +- eigenlib/Eigen/OrderingMethods | 2 +- eigenlib/Eigen/PaStiXSupport | 2 +- eigenlib/Eigen/PardisoSupport | 2 +- eigenlib/Eigen/QR | 2 +- eigenlib/Eigen/QtAlignedMalloc | 2 +- eigenlib/Eigen/SPQRSupport | 2 +- eigenlib/Eigen/SVD | 2 +- eigenlib/Eigen/Sparse | 2 +- eigenlib/Eigen/SparseCholesky | 2 +- eigenlib/Eigen/SparseCore | 2 +- eigenlib/Eigen/SparseLU | 2 +- eigenlib/Eigen/SparseQR | 2 +- eigenlib/Eigen/StdDeque | 2 +- eigenlib/Eigen/StdList | 2 +- eigenlib/Eigen/StdVector | 2 +- eigenlib/Eigen/SuperLUSupport | 2 +- eigenlib/Eigen/UmfPackSupport | 2 +- eigenlib/Eigen/src/Cholesky/LDLT.h | 2 +- eigenlib/Eigen/src/Cholesky/LLT.h | 2 +- eigenlib/Eigen/src/CholmodSupport/CholmodSupport.h | 2 +- eigenlib/Eigen/src/Core/Array.h | 2 +- eigenlib/Eigen/src/Core/ArrayBase.h | 2 +- eigenlib/Eigen/src/Core/ArrayWrapper.h | 2 +- eigenlib/Eigen/src/Core/Assign.h | 2 +- eigenlib/Eigen/src/Core/AssignEvaluator.h | 2 +- eigenlib/Eigen/src/Core/BandMatrix.h | 2 +- eigenlib/Eigen/src/Core/Block.h | 2 +- eigenlib/Eigen/src/Core/BooleanRedux.h | 2 +- eigenlib/Eigen/src/Core/CommaInitializer.h | 2 +- eigenlib/Eigen/src/Core/ConditionEstimator.h | 2 +- eigenlib/Eigen/src/Core/CoreEvaluators.h | 2 +- eigenlib/Eigen/src/Core/CoreIterators.h | 2 +- eigenlib/Eigen/src/Core/CwiseBinaryOp.h | 2 +- eigenlib/Eigen/src/Core/CwiseNullaryOp.h | 2 +- eigenlib/Eigen/src/Core/CwiseTernaryOp.h | 2 +- eigenlib/Eigen/src/Core/CwiseUnaryOp.h | 2 +- eigenlib/Eigen/src/Core/CwiseUnaryView.h | 2 +- eigenlib/Eigen/src/Core/DenseBase.h | 2 +- eigenlib/Eigen/src/Core/DenseCoeffsBase.h | 2 +- eigenlib/Eigen/src/Core/DenseStorage.h | 2 +- eigenlib/Eigen/src/Core/Diagonal.h | 2 +- eigenlib/Eigen/src/Core/DiagonalMatrix.h | 2 +- eigenlib/Eigen/src/Core/DiagonalProduct.h | 2 +- eigenlib/Eigen/src/Core/Dot.h | 2 +- eigenlib/Eigen/src/Core/EigenBase.h | 2 +- eigenlib/Eigen/src/Core/ForceAlignedAccess.h | 2 +- eigenlib/Eigen/src/Core/Fuzzy.h | 2 +- eigenlib/Eigen/src/Core/GeneralProduct.h | 2 +- eigenlib/Eigen/src/Core/GenericPacketMath.h | 2 +- eigenlib/Eigen/src/Core/GlobalFunctions.h | 2 +- eigenlib/Eigen/src/Core/IO.h | 2 +- eigenlib/Eigen/src/Core/Inverse.h | 2 +- eigenlib/Eigen/src/Core/Map.h | 2 +- eigenlib/Eigen/src/Core/MapBase.h | 2 +- eigenlib/Eigen/src/Core/MathFunctions.h | 2 +- eigenlib/Eigen/src/Core/MathFunctionsImpl.h | 2 +- eigenlib/Eigen/src/Core/Matrix.h | 2 +- eigenlib/Eigen/src/Core/MatrixBase.h | 2 +- eigenlib/Eigen/src/Core/NestByValue.h | 2 +- eigenlib/Eigen/src/Core/NoAlias.h | 2 +- eigenlib/Eigen/src/Core/NumTraits.h | 2 +- eigenlib/Eigen/src/Core/PermutationMatrix.h | 2 +- eigenlib/Eigen/src/Core/PlainObjectBase.h | 2 +- eigenlib/Eigen/src/Core/Product.h | 2 +- eigenlib/Eigen/src/Core/ProductEvaluators.h | 2 +- eigenlib/Eigen/src/Core/Random.h | 2 +- eigenlib/Eigen/src/Core/Redux.h | 2 +- eigenlib/Eigen/src/Core/Ref.h | 2 +- eigenlib/Eigen/src/Core/Replicate.h | 2 +- eigenlib/Eigen/src/Core/ReturnByValue.h | 2 +- eigenlib/Eigen/src/Core/Reverse.h | 2 +- eigenlib/Eigen/src/Core/Select.h | 2 +- eigenlib/Eigen/src/Core/SelfAdjointView.h | 2 +- eigenlib/Eigen/src/Core/SelfCwiseBinaryOp.h | 2 +- eigenlib/Eigen/src/Core/Solve.h | 2 +- eigenlib/Eigen/src/Core/SolveTriangular.h | 2 +- eigenlib/Eigen/src/Core/SolverBase.h | 2 +- eigenlib/Eigen/src/Core/StableNorm.h | 2 +- eigenlib/Eigen/src/Core/Stride.h | 2 +- eigenlib/Eigen/src/Core/Swap.h | 2 +- eigenlib/Eigen/src/Core/Transpose.h | 2 +- eigenlib/Eigen/src/Core/Transpositions.h | 2 +- eigenlib/Eigen/src/Core/TriangularMatrix.h | 2 +- eigenlib/Eigen/src/Core/VectorBlock.h | 2 +- eigenlib/Eigen/src/Core/VectorwiseOp.h | 2 +- eigenlib/Eigen/src/Core/Visitor.h | 2 +- eigenlib/Eigen/src/Core/arch/AVX/Complex.h | 2 +- eigenlib/Eigen/src/Core/arch/AVX/MathFunctions.h | 2 +- eigenlib/Eigen/src/Core/arch/AVX/PacketMath.h | 2 +- eigenlib/Eigen/src/Core/arch/AVX/TypeCasting.h | 2 +- eigenlib/Eigen/src/Core/arch/AVX512/MathFunctions.h | 2 +- eigenlib/Eigen/src/Core/arch/AVX512/PacketMath.h | 2 +- eigenlib/Eigen/src/Core/arch/AltiVec/Complex.h | 2 +- eigenlib/Eigen/src/Core/arch/AltiVec/MathFunctions.h | 2 +- eigenlib/Eigen/src/Core/arch/AltiVec/PacketMath.h | 2 +- eigenlib/Eigen/src/Core/arch/CUDA/Complex.h | 2 +- eigenlib/Eigen/src/Core/arch/CUDA/Half.h | 2 +- eigenlib/Eigen/src/Core/arch/CUDA/MathFunctions.h | 2 +- eigenlib/Eigen/src/Core/arch/CUDA/PacketMath.h | 2 +- eigenlib/Eigen/src/Core/arch/CUDA/PacketMathHalf.h | 2 +- eigenlib/Eigen/src/Core/arch/CUDA/TypeCasting.h | 2 +- eigenlib/Eigen/src/Core/arch/Default/ConjHelper.h | 2 +- eigenlib/Eigen/src/Core/arch/Default/Settings.h | 2 +- eigenlib/Eigen/src/Core/arch/NEON/Complex.h | 2 +- eigenlib/Eigen/src/Core/arch/NEON/MathFunctions.h | 2 +- eigenlib/Eigen/src/Core/arch/NEON/PacketMath.h | 2 +- eigenlib/Eigen/src/Core/arch/SSE/Complex.h | 2 +- eigenlib/Eigen/src/Core/arch/SSE/MathFunctions.h | 2 +- eigenlib/Eigen/src/Core/arch/SSE/PacketMath.h | 2 +- eigenlib/Eigen/src/Core/arch/SSE/TypeCasting.h | 2 +- eigenlib/Eigen/src/Core/arch/ZVector/Complex.h | 2 +- eigenlib/Eigen/src/Core/arch/ZVector/MathFunctions.h | 2 +- eigenlib/Eigen/src/Core/arch/ZVector/PacketMath.h | 2 +- eigenlib/Eigen/src/Core/functors/AssignmentFunctors.h | 2 +- eigenlib/Eigen/src/Core/functors/BinaryFunctors.h | 2 +- eigenlib/Eigen/src/Core/functors/NullaryFunctors.h | 2 +- eigenlib/Eigen/src/Core/functors/StlFunctors.h | 2 +- eigenlib/Eigen/src/Core/functors/TernaryFunctors.h | 2 +- eigenlib/Eigen/src/Core/functors/UnaryFunctors.h | 2 +- eigenlib/Eigen/src/Core/products/GeneralBlockPanelKernel.h | 2 +- eigenlib/Eigen/src/Core/products/GeneralMatrixMatrix.h | 2 +- .../Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h | 2 +- eigenlib/Eigen/src/Core/products/GeneralMatrixVector.h | 2 +- eigenlib/Eigen/src/Core/products/Parallelizer.h | 2 +- eigenlib/Eigen/src/Core/products/SelfadjointMatrixMatrix.h | 2 +- eigenlib/Eigen/src/Core/products/SelfadjointMatrixVector.h | 2 +- eigenlib/Eigen/src/Core/products/SelfadjointProduct.h | 2 +- eigenlib/Eigen/src/Core/products/SelfadjointRank2Update.h | 2 +- eigenlib/Eigen/src/Core/products/TriangularMatrixMatrix.h | 2 +- eigenlib/Eigen/src/Core/products/TriangularMatrixVector.h | 2 +- eigenlib/Eigen/src/Core/products/TriangularSolverMatrix.h | 2 +- eigenlib/Eigen/src/Core/products/TriangularSolverVector.h | 2 +- eigenlib/Eigen/src/Core/util/BlasUtil.h | 2 +- eigenlib/Eigen/src/Core/util/Constants.h | 2 +- eigenlib/Eigen/src/Core/util/ForwardDeclarations.h | 2 +- eigenlib/Eigen/src/Core/util/Macros.h | 2 +- eigenlib/Eigen/src/Core/util/Memory.h | 2 +- eigenlib/Eigen/src/Core/util/Meta.h | 2 +- eigenlib/Eigen/src/Core/util/StaticAssert.h | 2 +- eigenlib/Eigen/src/Core/util/XprHelper.h | 2 +- eigenlib/Eigen/src/Eigenvalues/ComplexEigenSolver.h | 2 +- eigenlib/Eigen/src/Eigenvalues/ComplexSchur.h | 2 +- eigenlib/Eigen/src/Eigenvalues/EigenSolver.h | 2 +- eigenlib/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h | 2 +- .../src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h | 2 +- eigenlib/Eigen/src/Eigenvalues/HessenbergDecomposition.h | 2 +- eigenlib/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h | 2 +- eigenlib/Eigen/src/Eigenvalues/RealQZ.h | 2 +- eigenlib/Eigen/src/Eigenvalues/RealSchur.h | 2 +- eigenlib/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h | 2 +- eigenlib/Eigen/src/Eigenvalues/Tridiagonalization.h | 2 +- eigenlib/Eigen/src/Geometry/AlignedBox.h | 2 +- eigenlib/Eigen/src/Geometry/AngleAxis.h | 2 +- eigenlib/Eigen/src/Geometry/EulerAngles.h | 2 +- eigenlib/Eigen/src/Geometry/Homogeneous.h | 2 +- eigenlib/Eigen/src/Geometry/Hyperplane.h | 2 +- eigenlib/Eigen/src/Geometry/OrthoMethods.h | 2 +- eigenlib/Eigen/src/Geometry/ParametrizedLine.h | 2 +- eigenlib/Eigen/src/Geometry/Quaternion.h | 2 +- eigenlib/Eigen/src/Geometry/Rotation2D.h | 2 +- eigenlib/Eigen/src/Geometry/RotationBase.h | 2 +- eigenlib/Eigen/src/Geometry/Scaling.h | 2 +- eigenlib/Eigen/src/Geometry/Transform.h | 2 +- eigenlib/Eigen/src/Geometry/Translation.h | 2 +- eigenlib/Eigen/src/Geometry/Umeyama.h | 2 +- eigenlib/Eigen/src/Geometry/arch/Geometry_SSE.h | 2 +- eigenlib/Eigen/src/Householder/BlockHouseholder.h | 2 +- eigenlib/Eigen/src/Householder/Householder.h | 2 +- eigenlib/Eigen/src/Householder/HouseholderSequence.h | 2 +- .../Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h | 2 +- eigenlib/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h | 2 +- .../Eigen/src/IterativeLinearSolvers/ConjugateGradient.h | 2 +- .../Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h | 2 +- eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h | 2 +- .../Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h | 2 +- .../IterativeLinearSolvers/LeastSquareConjugateGradient.h | 2 +- eigenlib/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h | 2 +- eigenlib/Eigen/src/Jacobi/Jacobi.h | 2 +- eigenlib/Eigen/src/LU/Determinant.h | 2 +- eigenlib/Eigen/src/LU/FullPivLU.h | 2 +- eigenlib/Eigen/src/LU/InverseImpl.h | 2 +- eigenlib/Eigen/src/LU/PartialPivLU.h | 2 +- eigenlib/Eigen/src/LU/arch/Inverse_SSE.h | 2 +- eigenlib/Eigen/src/MetisSupport/MetisSupport.h | 2 +- eigenlib/Eigen/src/OrderingMethods/Eigen_Colamd.h | 2 +- eigenlib/Eigen/src/OrderingMethods/Ordering.h | 2 +- eigenlib/Eigen/src/PaStiXSupport/PaStiXSupport.h | 2 +- eigenlib/Eigen/src/QR/ColPivHouseholderQR.h | 2 +- eigenlib/Eigen/src/QR/CompleteOrthogonalDecomposition.h | 2 +- eigenlib/Eigen/src/QR/FullPivHouseholderQR.h | 2 +- eigenlib/Eigen/src/QR/HouseholderQR.h | 2 +- eigenlib/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h | 2 +- eigenlib/Eigen/src/SVD/BDCSVD.h | 2 +- eigenlib/Eigen/src/SVD/JacobiSVD.h | 2 +- eigenlib/Eigen/src/SVD/SVDBase.h | 2 +- eigenlib/Eigen/src/SVD/UpperBidiagonalization.h | 2 +- eigenlib/Eigen/src/SparseCholesky/SimplicialCholesky.h | 2 +- eigenlib/Eigen/src/SparseCore/AmbiVector.h | 2 +- eigenlib/Eigen/src/SparseCore/CompressedStorage.h | 2 +- .../Eigen/src/SparseCore/ConservativeSparseSparseProduct.h | 2 +- eigenlib/Eigen/src/SparseCore/MappedSparseMatrix.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseAssign.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseBlock.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseColEtree.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseCompressedBase.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseCwiseBinaryOp.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseCwiseUnaryOp.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseDenseProduct.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseDiagonalProduct.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseDot.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseFuzzy.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseMap.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseMatrix.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseMatrixBase.h | 2 +- eigenlib/Eigen/src/SparseCore/SparsePermutation.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseProduct.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseRedux.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseRef.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseSelfAdjointView.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseSolverBase.h | 2 +- .../Eigen/src/SparseCore/SparseSparseProductWithPruning.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseTranspose.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseTriangularView.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseUtil.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseVector.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseView.h | 2 +- eigenlib/Eigen/src/SparseCore/TriangularSolver.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLUImpl.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU_Memory.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU_Structs.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU_Utils.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU_column_bmod.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU_column_dfs.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU_gemm_kernel.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU_kernel_bmod.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU_panel_bmod.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU_panel_dfs.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU_pivotL.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU_pruneL.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU_relax_snode.h | 2 +- eigenlib/Eigen/src/SparseQR/SparseQR.h | 2 +- eigenlib/Eigen/src/StlSupport/StdDeque.h | 2 +- eigenlib/Eigen/src/StlSupport/StdList.h | 2 +- eigenlib/Eigen/src/StlSupport/StdVector.h | 2 +- eigenlib/Eigen/src/StlSupport/details.h | 2 +- eigenlib/Eigen/src/SuperLUSupport/SuperLUSupport.h | 2 +- eigenlib/Eigen/src/UmfPackSupport/UmfPackSupport.h | 2 +- eigenlib/Eigen/src/misc/Image.h | 2 +- eigenlib/Eigen/src/misc/Kernel.h | 2 +- eigenlib/Eigen/src/misc/RealSvd2x2.h | 2 +- eigenlib/Eigen/src/plugins/BlockMethods.h | 2 +- eigenlib/Eigen/src/plugins/CommonCwiseBinaryOps.h | 2 +- eigenlib/Eigen/src/plugins/CommonCwiseUnaryOps.h | 2 +- eigenlib/Eigen/src/plugins/MatrixCwiseBinaryOps.h | 2 +- eigenlib/Eigen/src/plugins/MatrixCwiseUnaryOps.h | 2 +- eigenlib/howto.txt | 5 +++++ 270 files changed, 274 insertions(+), 269 deletions(-) diff --git a/eigenlib/Eigen/Cholesky b/eigenlib/Eigen/Cholesky index 1332b540d..b37dc4e41 100644 --- a/eigenlib/Eigen/Cholesky +++ b/eigenlib/Eigen/Cholesky @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_CHOLESKY_MODULE_H #define EIGEN_CHOLESKY_MODULE_H diff --git a/eigenlib/Eigen/CholmodSupport b/eigenlib/Eigen/CholmodSupport index bed8924d3..96cb4e4f7 100644 --- a/eigenlib/Eigen/CholmodSupport +++ b/eigenlib/Eigen/CholmodSupport @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_CHOLMODSUPPORT_MODULE_H #define EIGEN_CHOLMODSUPPORT_MODULE_H diff --git a/eigenlib/Eigen/Core b/eigenlib/Eigen/Core index ac7c5b300..c2808c5fd 100644 --- a/eigenlib/Eigen/Core +++ b/eigenlib/Eigen/Core @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_CORE_H #define EIGEN_CORE_H diff --git a/eigenlib/Eigen/Eigenvalues b/eigenlib/Eigen/Eigenvalues index 7d6ac787b..b740e0b6b 100644 --- a/eigenlib/Eigen/Eigenvalues +++ b/eigenlib/Eigen/Eigenvalues @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_EIGENVALUES_MODULE_H #define EIGEN_EIGENVALUES_MODULE_H diff --git a/eigenlib/Eigen/Geometry b/eigenlib/Eigen/Geometry index da88c03bb..b053d41b1 100644 --- a/eigenlib/Eigen/Geometry +++ b/eigenlib/Eigen/Geometry @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_GEOMETRY_MODULE_H #define EIGEN_GEOMETRY_MODULE_H diff --git a/eigenlib/Eigen/Householder b/eigenlib/Eigen/Householder index 89cd81b1a..18eec7473 100644 --- a/eigenlib/Eigen/Householder +++ b/eigenlib/Eigen/Householder @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_HOUSEHOLDER_MODULE_H #define EIGEN_HOUSEHOLDER_MODULE_H diff --git a/eigenlib/Eigen/IterativeLinearSolvers b/eigenlib/Eigen/IterativeLinearSolvers index 957d5750b..1865a38e1 100644 --- a/eigenlib/Eigen/IterativeLinearSolvers +++ b/eigenlib/Eigen/IterativeLinearSolvers @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ITERATIVELINEARSOLVERS_MODULE_H #define EIGEN_ITERATIVELINEARSOLVERS_MODULE_H diff --git a/eigenlib/Eigen/Jacobi b/eigenlib/Eigen/Jacobi index 17c1d785a..3116ea4ef 100644 --- a/eigenlib/Eigen/Jacobi +++ b/eigenlib/Eigen/Jacobi @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_JACOBI_MODULE_H #define EIGEN_JACOBI_MODULE_H diff --git a/eigenlib/Eigen/LU b/eigenlib/Eigen/LU index 6418a86e1..ec6aa837e 100644 --- a/eigenlib/Eigen/LU +++ b/eigenlib/Eigen/LU @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_LU_MODULE_H #define EIGEN_LU_MODULE_H diff --git a/eigenlib/Eigen/MetisSupport b/eigenlib/Eigen/MetisSupport index 85c41bf34..4e85d3d49 100644 --- a/eigenlib/Eigen/MetisSupport +++ b/eigenlib/Eigen/MetisSupport @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_METISSUPPORT_MODULE_H #define EIGEN_METISSUPPORT_MODULE_H diff --git a/eigenlib/Eigen/OrderingMethods b/eigenlib/Eigen/OrderingMethods index d8ea36193..14f718fe8 100644 --- a/eigenlib/Eigen/OrderingMethods +++ b/eigenlib/Eigen/OrderingMethods @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ORDERINGMETHODS_MODULE_H #define EIGEN_ORDERINGMETHODS_MODULE_H diff --git a/eigenlib/Eigen/PaStiXSupport b/eigenlib/Eigen/PaStiXSupport index de3a63b4d..307f6ece3 100644 --- a/eigenlib/Eigen/PaStiXSupport +++ b/eigenlib/Eigen/PaStiXSupport @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PASTIXSUPPORT_MODULE_H #define EIGEN_PASTIXSUPPORT_MODULE_H diff --git a/eigenlib/Eigen/PardisoSupport b/eigenlib/Eigen/PardisoSupport index 340edf51f..7d1a211d2 100755 --- a/eigenlib/Eigen/PardisoSupport +++ b/eigenlib/Eigen/PardisoSupport @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PARDISOSUPPORT_MODULE_H #define EIGEN_PARDISOSUPPORT_MODULE_H diff --git a/eigenlib/Eigen/QR b/eigenlib/Eigen/QR index 1be1863a1..a6ebbb908 100644 --- a/eigenlib/Eigen/QR +++ b/eigenlib/Eigen/QR @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_QR_MODULE_H #define EIGEN_QR_MODULE_H diff --git a/eigenlib/Eigen/QtAlignedMalloc b/eigenlib/Eigen/QtAlignedMalloc index 4f07df02a..f0e75efd6 100644 --- a/eigenlib/Eigen/QtAlignedMalloc +++ b/eigenlib/Eigen/QtAlignedMalloc @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_QTMALLOC_MODULE_H #define EIGEN_QTMALLOC_MODULE_H diff --git a/eigenlib/Eigen/SPQRSupport b/eigenlib/Eigen/SPQRSupport index f70390c17..db840f91a 100644 --- a/eigenlib/Eigen/SPQRSupport +++ b/eigenlib/Eigen/SPQRSupport @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPQRSUPPORT_MODULE_H #define EIGEN_SPQRSUPPORT_MODULE_H diff --git a/eigenlib/Eigen/SVD b/eigenlib/Eigen/SVD index 5d0e75f7f..541181d88 100644 --- a/eigenlib/Eigen/SVD +++ b/eigenlib/Eigen/SVD @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SVD_MODULE_H #define EIGEN_SVD_MODULE_H diff --git a/eigenlib/Eigen/Sparse b/eigenlib/Eigen/Sparse index 136e681a1..77d4fe838 100644 --- a/eigenlib/Eigen/Sparse +++ b/eigenlib/Eigen/Sparse @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSE_MODULE_H #define EIGEN_SPARSE_MODULE_H diff --git a/eigenlib/Eigen/SparseCholesky b/eigenlib/Eigen/SparseCholesky index b6a320c40..efa361263 100644 --- a/eigenlib/Eigen/SparseCholesky +++ b/eigenlib/Eigen/SparseCholesky @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSECHOLESKY_MODULE_H #define EIGEN_SPARSECHOLESKY_MODULE_H diff --git a/eigenlib/Eigen/SparseCore b/eigenlib/Eigen/SparseCore index 76966c4c4..83466e642 100644 --- a/eigenlib/Eigen/SparseCore +++ b/eigenlib/Eigen/SparseCore @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSECORE_MODULE_H #define EIGEN_SPARSECORE_MODULE_H diff --git a/eigenlib/Eigen/SparseLU b/eigenlib/Eigen/SparseLU index 38b38b531..782ce834c 100644 --- a/eigenlib/Eigen/SparseLU +++ b/eigenlib/Eigen/SparseLU @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSELU_MODULE_H #define EIGEN_SPARSELU_MODULE_H diff --git a/eigenlib/Eigen/SparseQR b/eigenlib/Eigen/SparseQR index f5fc5fa7f..dc1d7dc5f 100644 --- a/eigenlib/Eigen/SparseQR +++ b/eigenlib/Eigen/SparseQR @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSEQR_MODULE_H #define EIGEN_SPARSEQR_MODULE_H diff --git a/eigenlib/Eigen/StdDeque b/eigenlib/Eigen/StdDeque index bc68397be..0b9e253d2 100644 --- a/eigenlib/Eigen/StdDeque +++ b/eigenlib/Eigen/StdDeque @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_STDDEQUE_MODULE_H #define EIGEN_STDDEQUE_MODULE_H diff --git a/eigenlib/Eigen/StdList b/eigenlib/Eigen/StdList index 4c6262c08..aadb03432 100644 --- a/eigenlib/Eigen/StdList +++ b/eigenlib/Eigen/StdList @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_STDLIST_MODULE_H #define EIGEN_STDLIST_MODULE_H diff --git a/eigenlib/Eigen/StdVector b/eigenlib/Eigen/StdVector index 0c4697ad5..17f348d1c 100644 --- a/eigenlib/Eigen/StdVector +++ b/eigenlib/Eigen/StdVector @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_STDVECTOR_MODULE_H #define EIGEN_STDVECTOR_MODULE_H diff --git a/eigenlib/Eigen/SuperLUSupport b/eigenlib/Eigen/SuperLUSupport index 59312a82d..11b8bce56 100644 --- a/eigenlib/Eigen/SuperLUSupport +++ b/eigenlib/Eigen/SuperLUSupport @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SUPERLUSUPPORT_MODULE_H #define EIGEN_SUPERLUSUPPORT_MODULE_H diff --git a/eigenlib/Eigen/UmfPackSupport b/eigenlib/Eigen/UmfPackSupport index 00eec8087..fcc89a24d 100644 --- a/eigenlib/Eigen/UmfPackSupport +++ b/eigenlib/Eigen/UmfPackSupport @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_UMFPACKSUPPORT_MODULE_H #define EIGEN_UMFPACKSUPPORT_MODULE_H diff --git a/eigenlib/Eigen/src/Cholesky/LDLT.h b/eigenlib/Eigen/src/Cholesky/LDLT.h index 15ccf24f1..60d3e3867 100644 --- a/eigenlib/Eigen/src/Cholesky/LDLT.h +++ b/eigenlib/Eigen/src/Cholesky/LDLT.h @@ -8,7 +8,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_LDLT_H #define EIGEN_LDLT_H diff --git a/eigenlib/Eigen/src/Cholesky/LLT.h b/eigenlib/Eigen/src/Cholesky/LLT.h index e1624d21b..9dc23767e 100644 --- a/eigenlib/Eigen/src/Cholesky/LLT.h +++ b/eigenlib/Eigen/src/Cholesky/LLT.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_LLT_H #define EIGEN_LLT_H diff --git a/eigenlib/Eigen/src/CholmodSupport/CholmodSupport.h b/eigenlib/Eigen/src/CholmodSupport/CholmodSupport.h index 571972023..291c3a937 100644 --- a/eigenlib/Eigen/src/CholmodSupport/CholmodSupport.h +++ b/eigenlib/Eigen/src/CholmodSupport/CholmodSupport.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_CHOLMODSUPPORT_H #define EIGEN_CHOLMODSUPPORT_H diff --git a/eigenlib/Eigen/src/Core/Array.h b/eigenlib/Eigen/src/Core/Array.h index 16770fc7b..5a6513106 100644 --- a/eigenlib/Eigen/src/Core/Array.h +++ b/eigenlib/Eigen/src/Core/Array.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ARRAY_H #define EIGEN_ARRAY_H diff --git a/eigenlib/Eigen/src/Core/ArrayBase.h b/eigenlib/Eigen/src/Core/ArrayBase.h index 33f644e21..e32601b1e 100644 --- a/eigenlib/Eigen/src/Core/ArrayBase.h +++ b/eigenlib/Eigen/src/Core/ArrayBase.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ARRAYBASE_H #define EIGEN_ARRAYBASE_H diff --git a/eigenlib/Eigen/src/Core/ArrayWrapper.h b/eigenlib/Eigen/src/Core/ArrayWrapper.h index 688aadd62..e8e84190e 100644 --- a/eigenlib/Eigen/src/Core/ArrayWrapper.h +++ b/eigenlib/Eigen/src/Core/ArrayWrapper.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ARRAYWRAPPER_H #define EIGEN_ARRAYWRAPPER_H diff --git a/eigenlib/Eigen/src/Core/Assign.h b/eigenlib/Eigen/src/Core/Assign.h index 53806ba33..1bb3af644 100644 --- a/eigenlib/Eigen/src/Core/Assign.h +++ b/eigenlib/Eigen/src/Core/Assign.h @@ -7,7 +7,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ASSIGN_H #define EIGEN_ASSIGN_H diff --git a/eigenlib/Eigen/src/Core/AssignEvaluator.h b/eigenlib/Eigen/src/Core/AssignEvaluator.h index dbe435d86..67e284129 100644 --- a/eigenlib/Eigen/src/Core/AssignEvaluator.h +++ b/eigenlib/Eigen/src/Core/AssignEvaluator.h @@ -7,7 +7,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ASSIGN_EVALUATOR_H #define EIGEN_ASSIGN_EVALUATOR_H diff --git a/eigenlib/Eigen/src/Core/BandMatrix.h b/eigenlib/Eigen/src/Core/BandMatrix.h index 4978c9140..130fa2010 100644 --- a/eigenlib/Eigen/src/Core/BandMatrix.h +++ b/eigenlib/Eigen/src/Core/BandMatrix.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_BANDMATRIX_H #define EIGEN_BANDMATRIX_H diff --git a/eigenlib/Eigen/src/Core/Block.h b/eigenlib/Eigen/src/Core/Block.h index 11de45c2e..86028c61b 100644 --- a/eigenlib/Eigen/src/Core/Block.h +++ b/eigenlib/Eigen/src/Core/Block.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_BLOCK_H #define EIGEN_BLOCK_H diff --git a/eigenlib/Eigen/src/Core/BooleanRedux.h b/eigenlib/Eigen/src/Core/BooleanRedux.h index 8409d8749..23287ae0e 100644 --- a/eigenlib/Eigen/src/Core/BooleanRedux.h +++ b/eigenlib/Eigen/src/Core/BooleanRedux.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ALLANDANY_H #define EIGEN_ALLANDANY_H diff --git a/eigenlib/Eigen/src/Core/CommaInitializer.h b/eigenlib/Eigen/src/Core/CommaInitializer.h index d218e9814..cb89ed2a6 100644 --- a/eigenlib/Eigen/src/Core/CommaInitializer.h +++ b/eigenlib/Eigen/src/Core/CommaInitializer.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_COMMAINITIALIZER_H #define EIGEN_COMMAINITIALIZER_H diff --git a/eigenlib/Eigen/src/Core/ConditionEstimator.h b/eigenlib/Eigen/src/Core/ConditionEstimator.h index 51a2e5f1b..3424da522 100644 --- a/eigenlib/Eigen/src/Core/ConditionEstimator.h +++ b/eigenlib/Eigen/src/Core/ConditionEstimator.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_CONDITIONESTIMATOR_H #define EIGEN_CONDITIONESTIMATOR_H diff --git a/eigenlib/Eigen/src/Core/CoreEvaluators.h b/eigenlib/Eigen/src/Core/CoreEvaluators.h index 910889efa..3e12ad138 100644 --- a/eigenlib/Eigen/src/Core/CoreEvaluators.h +++ b/eigenlib/Eigen/src/Core/CoreEvaluators.h @@ -7,7 +7,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_COREEVALUATORS_H diff --git a/eigenlib/Eigen/src/Core/CoreIterators.h b/eigenlib/Eigen/src/Core/CoreIterators.h index 4eb42b93a..5b20e935b 100644 --- a/eigenlib/Eigen/src/Core/CoreIterators.h +++ b/eigenlib/Eigen/src/Core/CoreIterators.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_COREITERATORS_H #define EIGEN_COREITERATORS_H diff --git a/eigenlib/Eigen/src/Core/CwiseBinaryOp.h b/eigenlib/Eigen/src/Core/CwiseBinaryOp.h index a36765e39..6348a7f01 100644 --- a/eigenlib/Eigen/src/Core/CwiseBinaryOp.h +++ b/eigenlib/Eigen/src/Core/CwiseBinaryOp.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_CWISE_BINARY_OP_H #define EIGEN_CWISE_BINARY_OP_H diff --git a/eigenlib/Eigen/src/Core/CwiseNullaryOp.h b/eigenlib/Eigen/src/Core/CwiseNullaryOp.h index ddd607e38..98a6385ac 100644 --- a/eigenlib/Eigen/src/Core/CwiseNullaryOp.h +++ b/eigenlib/Eigen/src/Core/CwiseNullaryOp.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_CWISE_NULLARY_OP_H #define EIGEN_CWISE_NULLARY_OP_H diff --git a/eigenlib/Eigen/src/Core/CwiseTernaryOp.h b/eigenlib/Eigen/src/Core/CwiseTernaryOp.h index 9f3576fec..fef6e3c2d 100644 --- a/eigenlib/Eigen/src/Core/CwiseTernaryOp.h +++ b/eigenlib/Eigen/src/Core/CwiseTernaryOp.h @@ -7,7 +7,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_CWISE_TERNARY_OP_H #define EIGEN_CWISE_TERNARY_OP_H diff --git a/eigenlib/Eigen/src/Core/CwiseUnaryOp.h b/eigenlib/Eigen/src/Core/CwiseUnaryOp.h index 1d2dd19f2..269b139cc 100644 --- a/eigenlib/Eigen/src/Core/CwiseUnaryOp.h +++ b/eigenlib/Eigen/src/Core/CwiseUnaryOp.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_CWISE_UNARY_OP_H #define EIGEN_CWISE_UNARY_OP_H diff --git a/eigenlib/Eigen/src/Core/CwiseUnaryView.h b/eigenlib/Eigen/src/Core/CwiseUnaryView.h index 5a30fa8df..ab165ebe5 100644 --- a/eigenlib/Eigen/src/Core/CwiseUnaryView.h +++ b/eigenlib/Eigen/src/Core/CwiseUnaryView.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_CWISE_UNARY_VIEW_H #define EIGEN_CWISE_UNARY_VIEW_H diff --git a/eigenlib/Eigen/src/Core/DenseBase.h b/eigenlib/Eigen/src/Core/DenseBase.h index c55a68230..c568378ef 100644 --- a/eigenlib/Eigen/src/Core/DenseBase.h +++ b/eigenlib/Eigen/src/Core/DenseBase.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_DENSEBASE_H #define EIGEN_DENSEBASE_H diff --git a/eigenlib/Eigen/src/Core/DenseCoeffsBase.h b/eigenlib/Eigen/src/Core/DenseCoeffsBase.h index c4af48ab6..50269426a 100644 --- a/eigenlib/Eigen/src/Core/DenseCoeffsBase.h +++ b/eigenlib/Eigen/src/Core/DenseCoeffsBase.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_DENSECOEFFSBASE_H #define EIGEN_DENSECOEFFSBASE_H diff --git a/eigenlib/Eigen/src/Core/DenseStorage.h b/eigenlib/Eigen/src/Core/DenseStorage.h index 7d6d4e66d..45891dd33 100644 --- a/eigenlib/Eigen/src/Core/DenseStorage.h +++ b/eigenlib/Eigen/src/Core/DenseStorage.h @@ -7,7 +7,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_MATRIXSTORAGE_H #define EIGEN_MATRIXSTORAGE_H diff --git a/eigenlib/Eigen/src/Core/Diagonal.h b/eigenlib/Eigen/src/Core/Diagonal.h index afcaf3575..0eb8d458d 100644 --- a/eigenlib/Eigen/src/Core/Diagonal.h +++ b/eigenlib/Eigen/src/Core/Diagonal.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_DIAGONAL_H #define EIGEN_DIAGONAL_H diff --git a/eigenlib/Eigen/src/Core/DiagonalMatrix.h b/eigenlib/Eigen/src/Core/DiagonalMatrix.h index ecfdce8ef..98a2eac7b 100644 --- a/eigenlib/Eigen/src/Core/DiagonalMatrix.h +++ b/eigenlib/Eigen/src/Core/DiagonalMatrix.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_DIAGONALMATRIX_H #define EIGEN_DIAGONALMATRIX_H diff --git a/eigenlib/Eigen/src/Core/DiagonalProduct.h b/eigenlib/Eigen/src/Core/DiagonalProduct.h index d372b938f..aead5fec4 100644 --- a/eigenlib/Eigen/src/Core/DiagonalProduct.h +++ b/eigenlib/Eigen/src/Core/DiagonalProduct.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_DIAGONALPRODUCT_H #define EIGEN_DIAGONALPRODUCT_H diff --git a/eigenlib/Eigen/src/Core/Dot.h b/eigenlib/Eigen/src/Core/Dot.h index 1fe7a84a4..c8daa897e 100644 --- a/eigenlib/Eigen/src/Core/Dot.h +++ b/eigenlib/Eigen/src/Core/Dot.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_DOT_H #define EIGEN_DOT_H diff --git a/eigenlib/Eigen/src/Core/EigenBase.h b/eigenlib/Eigen/src/Core/EigenBase.h index b195506a9..f1e4f685a 100644 --- a/eigenlib/Eigen/src/Core/EigenBase.h +++ b/eigenlib/Eigen/src/Core/EigenBase.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_EIGENBASE_H #define EIGEN_EIGENBASE_H diff --git a/eigenlib/Eigen/src/Core/ForceAlignedAccess.h b/eigenlib/Eigen/src/Core/ForceAlignedAccess.h index 7b08b45e6..d1669b752 100644 --- a/eigenlib/Eigen/src/Core/ForceAlignedAccess.h +++ b/eigenlib/Eigen/src/Core/ForceAlignedAccess.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_FORCEALIGNEDACCESS_H #define EIGEN_FORCEALIGNEDACCESS_H diff --git a/eigenlib/Eigen/src/Core/Fuzzy.h b/eigenlib/Eigen/src/Core/Fuzzy.h index 3e403a09d..c5904f6b5 100644 --- a/eigenlib/Eigen/src/Core/Fuzzy.h +++ b/eigenlib/Eigen/src/Core/Fuzzy.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_FUZZY_H #define EIGEN_FUZZY_H diff --git a/eigenlib/Eigen/src/Core/GeneralProduct.h b/eigenlib/Eigen/src/Core/GeneralProduct.h index 6f0cc80e9..61401c965 100644 --- a/eigenlib/Eigen/src/Core/GeneralProduct.h +++ b/eigenlib/Eigen/src/Core/GeneralProduct.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_GENERAL_PRODUCT_H #define EIGEN_GENERAL_PRODUCT_H diff --git a/eigenlib/Eigen/src/Core/GenericPacketMath.h b/eigenlib/Eigen/src/Core/GenericPacketMath.h index e59443779..e7f1b283e 100644 --- a/eigenlib/Eigen/src/Core/GenericPacketMath.h +++ b/eigenlib/Eigen/src/Core/GenericPacketMath.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_GENERIC_PACKET_MATH_H #define EIGEN_GENERIC_PACKET_MATH_H diff --git a/eigenlib/Eigen/src/Core/GlobalFunctions.h b/eigenlib/Eigen/src/Core/GlobalFunctions.h index 769dc255c..ed9ea125e 100644 --- a/eigenlib/Eigen/src/Core/GlobalFunctions.h +++ b/eigenlib/Eigen/src/Core/GlobalFunctions.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_GLOBAL_FUNCTIONS_H #define EIGEN_GLOBAL_FUNCTIONS_H diff --git a/eigenlib/Eigen/src/Core/IO.h b/eigenlib/Eigen/src/Core/IO.h index da7fd6cce..ec72a1c56 100644 --- a/eigenlib/Eigen/src/Core/IO.h +++ b/eigenlib/Eigen/src/Core/IO.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_IO_H #define EIGEN_IO_H diff --git a/eigenlib/Eigen/src/Core/Inverse.h b/eigenlib/Eigen/src/Core/Inverse.h index b76f0439d..0f0787cfd 100644 --- a/eigenlib/Eigen/src/Core/Inverse.h +++ b/eigenlib/Eigen/src/Core/Inverse.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_INVERSE_H #define EIGEN_INVERSE_H diff --git a/eigenlib/Eigen/src/Core/Map.h b/eigenlib/Eigen/src/Core/Map.h index 548bf9a2d..166b61cc3 100644 --- a/eigenlib/Eigen/src/Core/Map.h +++ b/eigenlib/Eigen/src/Core/Map.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_MAP_H #define EIGEN_MAP_H diff --git a/eigenlib/Eigen/src/Core/MapBase.h b/eigenlib/Eigen/src/Core/MapBase.h index 92c3b2818..af0031164 100644 --- a/eigenlib/Eigen/src/Core/MapBase.h +++ b/eigenlib/Eigen/src/Core/MapBase.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_MAPBASE_H #define EIGEN_MAPBASE_H diff --git a/eigenlib/Eigen/src/Core/MathFunctions.h b/eigenlib/Eigen/src/Core/MathFunctions.h index 01736c2a0..a2dce17b3 100644 --- a/eigenlib/Eigen/src/Core/MathFunctions.h +++ b/eigenlib/Eigen/src/Core/MathFunctions.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_MATHFUNCTIONS_H #define EIGEN_MATHFUNCTIONS_H diff --git a/eigenlib/Eigen/src/Core/MathFunctionsImpl.h b/eigenlib/Eigen/src/Core/MathFunctionsImpl.h index 9c1ceb0eb..f5d8d7179 100644 --- a/eigenlib/Eigen/src/Core/MathFunctionsImpl.h +++ b/eigenlib/Eigen/src/Core/MathFunctionsImpl.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_MATHFUNCTIONSIMPL_H #define EIGEN_MATHFUNCTIONSIMPL_H diff --git a/eigenlib/Eigen/src/Core/Matrix.h b/eigenlib/Eigen/src/Core/Matrix.h index 7f4a7af93..b66a39588 100644 --- a/eigenlib/Eigen/src/Core/Matrix.h +++ b/eigenlib/Eigen/src/Core/Matrix.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_MATRIX_H #define EIGEN_MATRIX_H diff --git a/eigenlib/Eigen/src/Core/MatrixBase.h b/eigenlib/Eigen/src/Core/MatrixBase.h index f8bcc8c6f..8c5b93fcc 100644 --- a/eigenlib/Eigen/src/Core/MatrixBase.h +++ b/eigenlib/Eigen/src/Core/MatrixBase.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_MATRIXBASE_H #define EIGEN_MATRIXBASE_H diff --git a/eigenlib/Eigen/src/Core/NestByValue.h b/eigenlib/Eigen/src/Core/NestByValue.h index 13adf070e..a00255d4a 100644 --- a/eigenlib/Eigen/src/Core/NestByValue.h +++ b/eigenlib/Eigen/src/Core/NestByValue.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_NESTBYVALUE_H #define EIGEN_NESTBYVALUE_H diff --git a/eigenlib/Eigen/src/Core/NoAlias.h b/eigenlib/Eigen/src/Core/NoAlias.h index 33908010b..198792d4b 100644 --- a/eigenlib/Eigen/src/Core/NoAlias.h +++ b/eigenlib/Eigen/src/Core/NoAlias.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_NOALIAS_H #define EIGEN_NOALIAS_H diff --git a/eigenlib/Eigen/src/Core/NumTraits.h b/eigenlib/Eigen/src/Core/NumTraits.h index daf489878..45bb8e417 100644 --- a/eigenlib/Eigen/src/Core/NumTraits.h +++ b/eigenlib/Eigen/src/Core/NumTraits.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_NUMTRAITS_H #define EIGEN_NUMTRAITS_H diff --git a/eigenlib/Eigen/src/Core/PermutationMatrix.h b/eigenlib/Eigen/src/Core/PermutationMatrix.h index 47c06ba77..142a04ff9 100644 --- a/eigenlib/Eigen/src/Core/PermutationMatrix.h +++ b/eigenlib/Eigen/src/Core/PermutationMatrix.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PERMUTATIONMATRIX_H #define EIGEN_PERMUTATIONMATRIX_H diff --git a/eigenlib/Eigen/src/Core/PlainObjectBase.h b/eigenlib/Eigen/src/Core/PlainObjectBase.h index 0f3632cfd..c8dee155e 100644 --- a/eigenlib/Eigen/src/Core/PlainObjectBase.h +++ b/eigenlib/Eigen/src/Core/PlainObjectBase.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_DENSESTORAGEBASE_H #define EIGEN_DENSESTORAGEBASE_H diff --git a/eigenlib/Eigen/src/Core/Product.h b/eigenlib/Eigen/src/Core/Product.h index 676c48027..1ec2130e7 100644 --- a/eigenlib/Eigen/src/Core/Product.h +++ b/eigenlib/Eigen/src/Core/Product.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PRODUCT_H #define EIGEN_PRODUCT_H diff --git a/eigenlib/Eigen/src/Core/ProductEvaluators.h b/eigenlib/Eigen/src/Core/ProductEvaluators.h index bce1310c9..176e0ea35 100644 --- a/eigenlib/Eigen/src/Core/ProductEvaluators.h +++ b/eigenlib/Eigen/src/Core/ProductEvaluators.h @@ -7,7 +7,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PRODUCTEVALUATORS_H diff --git a/eigenlib/Eigen/src/Core/Random.h b/eigenlib/Eigen/src/Core/Random.h index 6faf789c7..ff1a8e676 100644 --- a/eigenlib/Eigen/src/Core/Random.h +++ b/eigenlib/Eigen/src/Core/Random.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_RANDOM_H #define EIGEN_RANDOM_H diff --git a/eigenlib/Eigen/src/Core/Redux.h b/eigenlib/Eigen/src/Core/Redux.h index 760e9f861..fc97f551c 100644 --- a/eigenlib/Eigen/src/Core/Redux.h +++ b/eigenlib/Eigen/src/Core/Redux.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_REDUX_H #define EIGEN_REDUX_H diff --git a/eigenlib/Eigen/src/Core/Ref.h b/eigenlib/Eigen/src/Core/Ref.h index 17a1496b8..0698b0119 100644 --- a/eigenlib/Eigen/src/Core/Ref.h +++ b/eigenlib/Eigen/src/Core/Ref.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_REF_H #define EIGEN_REF_H diff --git a/eigenlib/Eigen/src/Core/Replicate.h b/eigenlib/Eigen/src/Core/Replicate.h index 9960ef884..271bbf3a1 100644 --- a/eigenlib/Eigen/src/Core/Replicate.h +++ b/eigenlib/Eigen/src/Core/Replicate.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_REPLICATE_H #define EIGEN_REPLICATE_H diff --git a/eigenlib/Eigen/src/Core/ReturnByValue.h b/eigenlib/Eigen/src/Core/ReturnByValue.h index c44b7673b..89d77c629 100644 --- a/eigenlib/Eigen/src/Core/ReturnByValue.h +++ b/eigenlib/Eigen/src/Core/ReturnByValue.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_RETURNBYVALUE_H #define EIGEN_RETURNBYVALUE_H diff --git a/eigenlib/Eigen/src/Core/Reverse.h b/eigenlib/Eigen/src/Core/Reverse.h index 0640cda2a..597c047ad 100644 --- a/eigenlib/Eigen/src/Core/Reverse.h +++ b/eigenlib/Eigen/src/Core/Reverse.h @@ -7,7 +7,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_REVERSE_H #define EIGEN_REVERSE_H diff --git a/eigenlib/Eigen/src/Core/Select.h b/eigenlib/Eigen/src/Core/Select.h index 79eec1b5b..7cd3afb95 100644 --- a/eigenlib/Eigen/src/Core/Select.h +++ b/eigenlib/Eigen/src/Core/Select.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SELECT_H #define EIGEN_SELECT_H diff --git a/eigenlib/Eigen/src/Core/SelfAdjointView.h b/eigenlib/Eigen/src/Core/SelfAdjointView.h index b2e51f37a..c68a861e4 100644 --- a/eigenlib/Eigen/src/Core/SelfAdjointView.h +++ b/eigenlib/Eigen/src/Core/SelfAdjointView.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SELFADJOINTMATRIX_H #define EIGEN_SELFADJOINTMATRIX_H diff --git a/eigenlib/Eigen/src/Core/SelfCwiseBinaryOp.h b/eigenlib/Eigen/src/Core/SelfCwiseBinaryOp.h index 7c89c2e23..82d889552 100644 --- a/eigenlib/Eigen/src/Core/SelfCwiseBinaryOp.h +++ b/eigenlib/Eigen/src/Core/SelfCwiseBinaryOp.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SELFCWISEBINARYOP_H #define EIGEN_SELFCWISEBINARYOP_H diff --git a/eigenlib/Eigen/src/Core/Solve.h b/eigenlib/Eigen/src/Core/Solve.h index a8daea511..6195e3afd 100644 --- a/eigenlib/Eigen/src/Core/Solve.h +++ b/eigenlib/Eigen/src/Core/Solve.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SOLVE_H #define EIGEN_SOLVE_H diff --git a/eigenlib/Eigen/src/Core/SolveTriangular.h b/eigenlib/Eigen/src/Core/SolveTriangular.h index fd0acb1a5..d7f45e5f5 100644 --- a/eigenlib/Eigen/src/Core/SolveTriangular.h +++ b/eigenlib/Eigen/src/Core/SolveTriangular.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SOLVETRIANGULAR_H #define EIGEN_SOLVETRIANGULAR_H diff --git a/eigenlib/Eigen/src/Core/SolverBase.h b/eigenlib/Eigen/src/Core/SolverBase.h index 8a4adc229..a26930318 100644 --- a/eigenlib/Eigen/src/Core/SolverBase.h +++ b/eigenlib/Eigen/src/Core/SolverBase.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SOLVERBASE_H #define EIGEN_SOLVERBASE_H diff --git a/eigenlib/Eigen/src/Core/StableNorm.h b/eigenlib/Eigen/src/Core/StableNorm.h index 88c8d9890..e969d7fec 100644 --- a/eigenlib/Eigen/src/Core/StableNorm.h +++ b/eigenlib/Eigen/src/Core/StableNorm.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_STABLENORM_H #define EIGEN_STABLENORM_H diff --git a/eigenlib/Eigen/src/Core/Stride.h b/eigenlib/Eigen/src/Core/Stride.h index 513742f34..cac9a278e 100644 --- a/eigenlib/Eigen/src/Core/Stride.h +++ b/eigenlib/Eigen/src/Core/Stride.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_STRIDE_H #define EIGEN_STRIDE_H diff --git a/eigenlib/Eigen/src/Core/Swap.h b/eigenlib/Eigen/src/Core/Swap.h index d70200918..bb5f2c104 100644 --- a/eigenlib/Eigen/src/Core/Swap.h +++ b/eigenlib/Eigen/src/Core/Swap.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SWAP_H #define EIGEN_SWAP_H diff --git a/eigenlib/Eigen/src/Core/Transpose.h b/eigenlib/Eigen/src/Core/Transpose.h index 960dc4510..0b3c82724 100644 --- a/eigenlib/Eigen/src/Core/Transpose.h +++ b/eigenlib/Eigen/src/Core/Transpose.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_TRANSPOSE_H #define EIGEN_TRANSPOSE_H diff --git a/eigenlib/Eigen/src/Core/Transpositions.h b/eigenlib/Eigen/src/Core/Transpositions.h index 7718625e8..41e2da49c 100644 --- a/eigenlib/Eigen/src/Core/Transpositions.h +++ b/eigenlib/Eigen/src/Core/Transpositions.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_TRANSPOSITIONS_H #define EIGEN_TRANSPOSITIONS_H diff --git a/eigenlib/Eigen/src/Core/TriangularMatrix.h b/eigenlib/Eigen/src/Core/TriangularMatrix.h index 9abb7e31a..1f2d3a707 100644 --- a/eigenlib/Eigen/src/Core/TriangularMatrix.h +++ b/eigenlib/Eigen/src/Core/TriangularMatrix.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_TRIANGULARMATRIX_H #define EIGEN_TRIANGULARMATRIX_H diff --git a/eigenlib/Eigen/src/Core/VectorBlock.h b/eigenlib/Eigen/src/Core/VectorBlock.h index d72fbf7e9..96bea9a84 100644 --- a/eigenlib/Eigen/src/Core/VectorBlock.h +++ b/eigenlib/Eigen/src/Core/VectorBlock.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_VECTORBLOCK_H #define EIGEN_VECTORBLOCK_H diff --git a/eigenlib/Eigen/src/Core/VectorwiseOp.h b/eigenlib/Eigen/src/Core/VectorwiseOp.h index 4fe267e9f..0e167b9f1 100644 --- a/eigenlib/Eigen/src/Core/VectorwiseOp.h +++ b/eigenlib/Eigen/src/Core/VectorwiseOp.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PARTIAL_REDUX_H #define EIGEN_PARTIAL_REDUX_H diff --git a/eigenlib/Eigen/src/Core/Visitor.h b/eigenlib/Eigen/src/Core/Visitor.h index 54c1883d9..98cd67fbf 100644 --- a/eigenlib/Eigen/src/Core/Visitor.h +++ b/eigenlib/Eigen/src/Core/Visitor.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_VISITOR_H #define EIGEN_VISITOR_H diff --git a/eigenlib/Eigen/src/Core/arch/AVX/Complex.h b/eigenlib/Eigen/src/Core/arch/AVX/Complex.h index 7fa61969d..fed35e5b8 100644 --- a/eigenlib/Eigen/src/Core/arch/AVX/Complex.h +++ b/eigenlib/Eigen/src/Core/arch/AVX/Complex.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_COMPLEX_AVX_H #define EIGEN_COMPLEX_AVX_H diff --git a/eigenlib/Eigen/src/Core/arch/AVX/MathFunctions.h b/eigenlib/Eigen/src/Core/arch/AVX/MathFunctions.h index 6af67ce2d..c5f966b22 100644 --- a/eigenlib/Eigen/src/Core/arch/AVX/MathFunctions.h +++ b/eigenlib/Eigen/src/Core/arch/AVX/MathFunctions.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_MATH_FUNCTIONS_AVX_H #define EIGEN_MATH_FUNCTIONS_AVX_H diff --git a/eigenlib/Eigen/src/Core/arch/AVX/PacketMath.h b/eigenlib/Eigen/src/Core/arch/AVX/PacketMath.h index 923a124b2..9ab6dc9b6 100644 --- a/eigenlib/Eigen/src/Core/arch/AVX/PacketMath.h +++ b/eigenlib/Eigen/src/Core/arch/AVX/PacketMath.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PACKET_MATH_AVX_H #define EIGEN_PACKET_MATH_AVX_H diff --git a/eigenlib/Eigen/src/Core/arch/AVX/TypeCasting.h b/eigenlib/Eigen/src/Core/arch/AVX/TypeCasting.h index 83bfdc604..301eb4cba 100644 --- a/eigenlib/Eigen/src/Core/arch/AVX/TypeCasting.h +++ b/eigenlib/Eigen/src/Core/arch/AVX/TypeCasting.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_TYPE_CASTING_AVX_H #define EIGEN_TYPE_CASTING_AVX_H diff --git a/eigenlib/Eigen/src/Core/arch/AVX512/MathFunctions.h b/eigenlib/Eigen/src/Core/arch/AVX512/MathFunctions.h index b259c1e1f..f30f2a9e7 100644 --- a/eigenlib/Eigen/src/Core/arch/AVX512/MathFunctions.h +++ b/eigenlib/Eigen/src/Core/arch/AVX512/MathFunctions.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef THIRD_PARTY_EIGEN3_EIGEN_SRC_CORE_ARCH_AVX512_MATHFUNCTIONS_H_ #define THIRD_PARTY_EIGEN3_EIGEN_SRC_CORE_ARCH_AVX512_MATHFUNCTIONS_H_ diff --git a/eigenlib/Eigen/src/Core/arch/AVX512/PacketMath.h b/eigenlib/Eigen/src/Core/arch/AVX512/PacketMath.h index 000b7762f..b8b111531 100644 --- a/eigenlib/Eigen/src/Core/arch/AVX512/PacketMath.h +++ b/eigenlib/Eigen/src/Core/arch/AVX512/PacketMath.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PACKET_MATH_AVX512_H #define EIGEN_PACKET_MATH_AVX512_H diff --git a/eigenlib/Eigen/src/Core/arch/AltiVec/Complex.h b/eigenlib/Eigen/src/Core/arch/AltiVec/Complex.h index 3e665730c..32590a53b 100644 --- a/eigenlib/Eigen/src/Core/arch/AltiVec/Complex.h +++ b/eigenlib/Eigen/src/Core/arch/AltiVec/Complex.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_COMPLEX32_ALTIVEC_H #define EIGEN_COMPLEX32_ALTIVEC_H diff --git a/eigenlib/Eigen/src/Core/arch/AltiVec/MathFunctions.h b/eigenlib/Eigen/src/Core/arch/AltiVec/MathFunctions.h index c5e4bede7..74e766874 100644 --- a/eigenlib/Eigen/src/Core/arch/AltiVec/MathFunctions.h +++ b/eigenlib/Eigen/src/Core/arch/AltiVec/MathFunctions.h @@ -7,7 +7,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* The sin, cos, exp, and log functions of this file come from * Julien Pommier's sse math library: http://gruntthepeon.free.fr/ssemath/ diff --git a/eigenlib/Eigen/src/Core/arch/AltiVec/PacketMath.h b/eigenlib/Eigen/src/Core/arch/AltiVec/PacketMath.h index 08a27d153..e3d31bb52 100755 --- a/eigenlib/Eigen/src/Core/arch/AltiVec/PacketMath.h +++ b/eigenlib/Eigen/src/Core/arch/AltiVec/PacketMath.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PACKET_MATH_ALTIVEC_H #define EIGEN_PACKET_MATH_ALTIVEC_H diff --git a/eigenlib/Eigen/src/Core/arch/CUDA/Complex.h b/eigenlib/Eigen/src/Core/arch/CUDA/Complex.h index 9c2536509..e82b52fb0 100644 --- a/eigenlib/Eigen/src/Core/arch/CUDA/Complex.h +++ b/eigenlib/Eigen/src/Core/arch/CUDA/Complex.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_COMPLEX_CUDA_H #define EIGEN_COMPLEX_CUDA_H diff --git a/eigenlib/Eigen/src/Core/arch/CUDA/Half.h b/eigenlib/Eigen/src/Core/arch/CUDA/Half.h index 59717b4fe..52573bce5 100644 --- a/eigenlib/Eigen/src/Core/arch/CUDA/Half.h +++ b/eigenlib/Eigen/src/Core/arch/CUDA/Half.h @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page // // The conversion routines are Copyright (c) Fabian Giesen, 2016. // The original license follows: diff --git a/eigenlib/Eigen/src/Core/arch/CUDA/MathFunctions.h b/eigenlib/Eigen/src/Core/arch/CUDA/MathFunctions.h index 0348b41db..df229ce11 100644 --- a/eigenlib/Eigen/src/Core/arch/CUDA/MathFunctions.h +++ b/eigenlib/Eigen/src/Core/arch/CUDA/MathFunctions.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_MATH_FUNCTIONS_CUDA_H #define EIGEN_MATH_FUNCTIONS_CUDA_H diff --git a/eigenlib/Eigen/src/Core/arch/CUDA/PacketMath.h b/eigenlib/Eigen/src/Core/arch/CUDA/PacketMath.h index 4dda63188..b4c556557 100644 --- a/eigenlib/Eigen/src/Core/arch/CUDA/PacketMath.h +++ b/eigenlib/Eigen/src/Core/arch/CUDA/PacketMath.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PACKET_MATH_CUDA_H #define EIGEN_PACKET_MATH_CUDA_H diff --git a/eigenlib/Eigen/src/Core/arch/CUDA/PacketMathHalf.h b/eigenlib/Eigen/src/Core/arch/CUDA/PacketMathHalf.h index f749c573f..43378e231 100644 --- a/eigenlib/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +++ b/eigenlib/Eigen/src/Core/arch/CUDA/PacketMathHalf.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PACKET_MATH_HALF_CUDA_H #define EIGEN_PACKET_MATH_HALF_CUDA_H diff --git a/eigenlib/Eigen/src/Core/arch/CUDA/TypeCasting.h b/eigenlib/Eigen/src/Core/arch/CUDA/TypeCasting.h index aa5fbce8e..84c00611e 100644 --- a/eigenlib/Eigen/src/Core/arch/CUDA/TypeCasting.h +++ b/eigenlib/Eigen/src/Core/arch/CUDA/TypeCasting.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_TYPE_CASTING_CUDA_H #define EIGEN_TYPE_CASTING_CUDA_H diff --git a/eigenlib/Eigen/src/Core/arch/Default/ConjHelper.h b/eigenlib/Eigen/src/Core/arch/Default/ConjHelper.h index 4cfe34e05..279066e05 100644 --- a/eigenlib/Eigen/src/Core/arch/Default/ConjHelper.h +++ b/eigenlib/Eigen/src/Core/arch/Default/ConjHelper.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ARCH_CONJ_HELPER_H #define EIGEN_ARCH_CONJ_HELPER_H diff --git a/eigenlib/Eigen/src/Core/arch/Default/Settings.h b/eigenlib/Eigen/src/Core/arch/Default/Settings.h index 097373c84..2f2cf85de 100644 --- a/eigenlib/Eigen/src/Core/arch/Default/Settings.h +++ b/eigenlib/Eigen/src/Core/arch/Default/Settings.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* All the parameters defined in this file can be specialized in the diff --git a/eigenlib/Eigen/src/Core/arch/NEON/Complex.h b/eigenlib/Eigen/src/Core/arch/NEON/Complex.h index 306a309be..097b3bb23 100644 --- a/eigenlib/Eigen/src/Core/arch/NEON/Complex.h +++ b/eigenlib/Eigen/src/Core/arch/NEON/Complex.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_COMPLEX_NEON_H #define EIGEN_COMPLEX_NEON_H diff --git a/eigenlib/Eigen/src/Core/arch/NEON/MathFunctions.h b/eigenlib/Eigen/src/Core/arch/NEON/MathFunctions.h index 6bb05bb92..3e3fd4ff8 100644 --- a/eigenlib/Eigen/src/Core/arch/NEON/MathFunctions.h +++ b/eigenlib/Eigen/src/Core/arch/NEON/MathFunctions.h @@ -3,7 +3,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* The sin, cos, exp, and log functions of this file come from * Julien Pommier's sse math library: http://gruntthepeon.free.fr/ssemath/ diff --git a/eigenlib/Eigen/src/Core/arch/NEON/PacketMath.h b/eigenlib/Eigen/src/Core/arch/NEON/PacketMath.h index 3d5ed0d24..c7050a437 100644 --- a/eigenlib/Eigen/src/Core/arch/NEON/PacketMath.h +++ b/eigenlib/Eigen/src/Core/arch/NEON/PacketMath.h @@ -7,7 +7,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PACKET_MATH_NEON_H #define EIGEN_PACKET_MATH_NEON_H diff --git a/eigenlib/Eigen/src/Core/arch/SSE/Complex.h b/eigenlib/Eigen/src/Core/arch/SSE/Complex.h index d075043ce..0796ef30d 100644 --- a/eigenlib/Eigen/src/Core/arch/SSE/Complex.h +++ b/eigenlib/Eigen/src/Core/arch/SSE/Complex.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_COMPLEX_SSE_H #define EIGEN_COMPLEX_SSE_H diff --git a/eigenlib/Eigen/src/Core/arch/SSE/MathFunctions.h b/eigenlib/Eigen/src/Core/arch/SSE/MathFunctions.h index 7b5f948e1..24c842ee0 100644 --- a/eigenlib/Eigen/src/Core/arch/SSE/MathFunctions.h +++ b/eigenlib/Eigen/src/Core/arch/SSE/MathFunctions.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* The sin, cos, exp, and log functions of this file come from * Julien Pommier's sse math library: http://gruntthepeon.free.fr/ssemath/ diff --git a/eigenlib/Eigen/src/Core/arch/SSE/PacketMath.h b/eigenlib/Eigen/src/Core/arch/SSE/PacketMath.h index 60e2517e4..0fe51aea0 100755 --- a/eigenlib/Eigen/src/Core/arch/SSE/PacketMath.h +++ b/eigenlib/Eigen/src/Core/arch/SSE/PacketMath.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PACKET_MATH_SSE_H #define EIGEN_PACKET_MATH_SSE_H diff --git a/eigenlib/Eigen/src/Core/arch/SSE/TypeCasting.h b/eigenlib/Eigen/src/Core/arch/SSE/TypeCasting.h index c6ca8c716..81b5ba915 100644 --- a/eigenlib/Eigen/src/Core/arch/SSE/TypeCasting.h +++ b/eigenlib/Eigen/src/Core/arch/SSE/TypeCasting.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_TYPE_CASTING_SSE_H #define EIGEN_TYPE_CASTING_SSE_H diff --git a/eigenlib/Eigen/src/Core/arch/ZVector/Complex.h b/eigenlib/Eigen/src/Core/arch/ZVector/Complex.h index 1bfb73397..2a367b593 100644 --- a/eigenlib/Eigen/src/Core/arch/ZVector/Complex.h +++ b/eigenlib/Eigen/src/Core/arch/ZVector/Complex.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_COMPLEX32_ALTIVEC_H #define EIGEN_COMPLEX32_ALTIVEC_H diff --git a/eigenlib/Eigen/src/Core/arch/ZVector/MathFunctions.h b/eigenlib/Eigen/src/Core/arch/ZVector/MathFunctions.h index 5c7aa7256..ee5a3f436 100644 --- a/eigenlib/Eigen/src/Core/arch/ZVector/MathFunctions.h +++ b/eigenlib/Eigen/src/Core/arch/ZVector/MathFunctions.h @@ -7,7 +7,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* The sin, cos, exp, and log functions of this file come from * Julien Pommier's sse math library: http://gruntthepeon.free.fr/ssemath/ diff --git a/eigenlib/Eigen/src/Core/arch/ZVector/PacketMath.h b/eigenlib/Eigen/src/Core/arch/ZVector/PacketMath.h index 57b01fc63..34775cd77 100755 --- a/eigenlib/Eigen/src/Core/arch/ZVector/PacketMath.h +++ b/eigenlib/Eigen/src/Core/arch/ZVector/PacketMath.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PACKET_MATH_ZVECTOR_H #define EIGEN_PACKET_MATH_ZVECTOR_H diff --git a/eigenlib/Eigen/src/Core/functors/AssignmentFunctors.h b/eigenlib/Eigen/src/Core/functors/AssignmentFunctors.h index 4153b877c..9bf268daa 100644 --- a/eigenlib/Eigen/src/Core/functors/AssignmentFunctors.h +++ b/eigenlib/Eigen/src/Core/functors/AssignmentFunctors.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ASSIGNMENT_FUNCTORS_H #define EIGEN_ASSIGNMENT_FUNCTORS_H diff --git a/eigenlib/Eigen/src/Core/functors/BinaryFunctors.h b/eigenlib/Eigen/src/Core/functors/BinaryFunctors.h index 3eae6b8ca..b056cdd2e 100644 --- a/eigenlib/Eigen/src/Core/functors/BinaryFunctors.h +++ b/eigenlib/Eigen/src/Core/functors/BinaryFunctors.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_BINARY_FUNCTORS_H #define EIGEN_BINARY_FUNCTORS_H diff --git a/eigenlib/Eigen/src/Core/functors/NullaryFunctors.h b/eigenlib/Eigen/src/Core/functors/NullaryFunctors.h index b03be0269..ba84d9415 100644 --- a/eigenlib/Eigen/src/Core/functors/NullaryFunctors.h +++ b/eigenlib/Eigen/src/Core/functors/NullaryFunctors.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_NULLARY_FUNCTORS_H #define EIGEN_NULLARY_FUNCTORS_H diff --git a/eigenlib/Eigen/src/Core/functors/StlFunctors.h b/eigenlib/Eigen/src/Core/functors/StlFunctors.h index 9c1d75850..3ea133c7c 100644 --- a/eigenlib/Eigen/src/Core/functors/StlFunctors.h +++ b/eigenlib/Eigen/src/Core/functors/StlFunctors.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_STL_FUNCTORS_H #define EIGEN_STL_FUNCTORS_H diff --git a/eigenlib/Eigen/src/Core/functors/TernaryFunctors.h b/eigenlib/Eigen/src/Core/functors/TernaryFunctors.h index b254e96c6..e6ae4ce0b 100644 --- a/eigenlib/Eigen/src/Core/functors/TernaryFunctors.h +++ b/eigenlib/Eigen/src/Core/functors/TernaryFunctors.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_TERNARY_FUNCTORS_H #define EIGEN_TERNARY_FUNCTORS_H diff --git a/eigenlib/Eigen/src/Core/functors/UnaryFunctors.h b/eigenlib/Eigen/src/Core/functors/UnaryFunctors.h index b56e7afd2..fcd8e7b5a 100644 --- a/eigenlib/Eigen/src/Core/functors/UnaryFunctors.h +++ b/eigenlib/Eigen/src/Core/functors/UnaryFunctors.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_UNARY_FUNCTORS_H #define EIGEN_UNARY_FUNCTORS_H diff --git a/eigenlib/Eigen/src/Core/products/GeneralBlockPanelKernel.h b/eigenlib/Eigen/src/Core/products/GeneralBlockPanelKernel.h index 681451cc3..3a6d29aa4 100644 --- a/eigenlib/Eigen/src/Core/products/GeneralBlockPanelKernel.h +++ b/eigenlib/Eigen/src/Core/products/GeneralBlockPanelKernel.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_GENERAL_BLOCK_PANEL_H #define EIGEN_GENERAL_BLOCK_PANEL_H diff --git a/eigenlib/Eigen/src/Core/products/GeneralMatrixMatrix.h b/eigenlib/Eigen/src/Core/products/GeneralMatrixMatrix.h index ed6234c37..2bb0815ce 100644 --- a/eigenlib/Eigen/src/Core/products/GeneralMatrixMatrix.h +++ b/eigenlib/Eigen/src/Core/products/GeneralMatrixMatrix.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_GENERAL_MATRIX_MATRIX_H #define EIGEN_GENERAL_MATRIX_MATRIX_H diff --git a/eigenlib/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h b/eigenlib/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h index d68d2f965..cc8697cbb 100644 --- a/eigenlib/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +++ b/eigenlib/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_H #define EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_H diff --git a/eigenlib/Eigen/src/Core/products/GeneralMatrixVector.h b/eigenlib/Eigen/src/Core/products/GeneralMatrixVector.h index a597c1f4e..ab8d96e46 100644 --- a/eigenlib/Eigen/src/Core/products/GeneralMatrixVector.h +++ b/eigenlib/Eigen/src/Core/products/GeneralMatrixVector.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_GENERAL_MATRIX_VECTOR_H #define EIGEN_GENERAL_MATRIX_VECTOR_H diff --git a/eigenlib/Eigen/src/Core/products/Parallelizer.h b/eigenlib/Eigen/src/Core/products/Parallelizer.h index a3cc05b77..02d53a839 100644 --- a/eigenlib/Eigen/src/Core/products/Parallelizer.h +++ b/eigenlib/Eigen/src/Core/products/Parallelizer.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PARALLELIZER_H #define EIGEN_PARALLELIZER_H diff --git a/eigenlib/Eigen/src/Core/products/SelfadjointMatrixMatrix.h b/eigenlib/Eigen/src/Core/products/SelfadjointMatrixMatrix.h index 04c933480..576c986ed 100644 --- a/eigenlib/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +++ b/eigenlib/Eigen/src/Core/products/SelfadjointMatrixMatrix.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SELFADJOINT_MATRIX_MATRIX_H #define EIGEN_SELFADJOINT_MATRIX_MATRIX_H diff --git a/eigenlib/Eigen/src/Core/products/SelfadjointMatrixVector.h b/eigenlib/Eigen/src/Core/products/SelfadjointMatrixVector.h index 3fd180e6c..c16dc61fe 100644 --- a/eigenlib/Eigen/src/Core/products/SelfadjointMatrixVector.h +++ b/eigenlib/Eigen/src/Core/products/SelfadjointMatrixVector.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SELFADJOINT_MATRIX_VECTOR_H #define EIGEN_SELFADJOINT_MATRIX_VECTOR_H diff --git a/eigenlib/Eigen/src/Core/products/SelfadjointProduct.h b/eigenlib/Eigen/src/Core/products/SelfadjointProduct.h index ef12c98f6..0fcc7f1d3 100644 --- a/eigenlib/Eigen/src/Core/products/SelfadjointProduct.h +++ b/eigenlib/Eigen/src/Core/products/SelfadjointProduct.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SELFADJOINT_PRODUCT_H #define EIGEN_SELFADJOINT_PRODUCT_H diff --git a/eigenlib/Eigen/src/Core/products/SelfadjointRank2Update.h b/eigenlib/Eigen/src/Core/products/SelfadjointRank2Update.h index 2ae364111..f1de17854 100644 --- a/eigenlib/Eigen/src/Core/products/SelfadjointRank2Update.h +++ b/eigenlib/Eigen/src/Core/products/SelfadjointRank2Update.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SELFADJOINTRANK2UPTADE_H #define EIGEN_SELFADJOINTRANK2UPTADE_H diff --git a/eigenlib/Eigen/src/Core/products/TriangularMatrixMatrix.h b/eigenlib/Eigen/src/Core/products/TriangularMatrixMatrix.h index 2fb408d1d..cbe49fbd3 100644 --- a/eigenlib/Eigen/src/Core/products/TriangularMatrixMatrix.h +++ b/eigenlib/Eigen/src/Core/products/TriangularMatrixMatrix.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_TRIANGULAR_MATRIX_MATRIX_H #define EIGEN_TRIANGULAR_MATRIX_MATRIX_H diff --git a/eigenlib/Eigen/src/Core/products/TriangularMatrixVector.h b/eigenlib/Eigen/src/Core/products/TriangularMatrixVector.h index 76bfa159c..0a7c6ee32 100644 --- a/eigenlib/Eigen/src/Core/products/TriangularMatrixVector.h +++ b/eigenlib/Eigen/src/Core/products/TriangularMatrixVector.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_TRIANGULARMATRIXVECTOR_H #define EIGEN_TRIANGULARMATRIXVECTOR_H diff --git a/eigenlib/Eigen/src/Core/products/TriangularSolverMatrix.h b/eigenlib/Eigen/src/Core/products/TriangularSolverMatrix.h index e3ed2cd19..c165ac73a 100644 --- a/eigenlib/Eigen/src/Core/products/TriangularSolverMatrix.h +++ b/eigenlib/Eigen/src/Core/products/TriangularSolverMatrix.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_TRIANGULAR_SOLVER_MATRIX_H #define EIGEN_TRIANGULAR_SOLVER_MATRIX_H diff --git a/eigenlib/Eigen/src/Core/products/TriangularSolverVector.h b/eigenlib/Eigen/src/Core/products/TriangularSolverVector.h index b994759b2..185a2084b 100644 --- a/eigenlib/Eigen/src/Core/products/TriangularSolverVector.h +++ b/eigenlib/Eigen/src/Core/products/TriangularSolverVector.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_TRIANGULAR_SOLVER_VECTOR_H #define EIGEN_TRIANGULAR_SOLVER_VECTOR_H diff --git a/eigenlib/Eigen/src/Core/util/BlasUtil.h b/eigenlib/Eigen/src/Core/util/BlasUtil.h index 3dff9bc9b..cc99967fe 100755 --- a/eigenlib/Eigen/src/Core/util/BlasUtil.h +++ b/eigenlib/Eigen/src/Core/util/BlasUtil.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_BLASUTIL_H #define EIGEN_BLASUTIL_H diff --git a/eigenlib/Eigen/src/Core/util/Constants.h b/eigenlib/Eigen/src/Core/util/Constants.h index 7587d6842..5beb0ba2d 100644 --- a/eigenlib/Eigen/src/Core/util/Constants.h +++ b/eigenlib/Eigen/src/Core/util/Constants.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_CONSTANTS_H #define EIGEN_CONSTANTS_H diff --git a/eigenlib/Eigen/src/Core/util/ForwardDeclarations.h b/eigenlib/Eigen/src/Core/util/ForwardDeclarations.h index 134544f96..f6bbee782 100644 --- a/eigenlib/Eigen/src/Core/util/ForwardDeclarations.h +++ b/eigenlib/Eigen/src/Core/util/ForwardDeclarations.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_FORWARDDECLARATIONS_H #define EIGEN_FORWARDDECLARATIONS_H diff --git a/eigenlib/Eigen/src/Core/util/Macros.h b/eigenlib/Eigen/src/Core/util/Macros.h index 6b0399ebc..ba1e95400 100644 --- a/eigenlib/Eigen/src/Core/util/Macros.h +++ b/eigenlib/Eigen/src/Core/util/Macros.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_MACROS_H #define EIGEN_MACROS_H diff --git a/eigenlib/Eigen/src/Core/util/Memory.h b/eigenlib/Eigen/src/Core/util/Memory.h index 291383c58..3cc0f9bec 100644 --- a/eigenlib/Eigen/src/Core/util/Memory.h +++ b/eigenlib/Eigen/src/Core/util/Memory.h @@ -10,7 +10,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /***************************************************************************** diff --git a/eigenlib/Eigen/src/Core/util/Meta.h b/eigenlib/Eigen/src/Core/util/Meta.h index 9b61ff037..72e02b035 100755 --- a/eigenlib/Eigen/src/Core/util/Meta.h +++ b/eigenlib/Eigen/src/Core/util/Meta.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_META_H #define EIGEN_META_H diff --git a/eigenlib/Eigen/src/Core/util/StaticAssert.h b/eigenlib/Eigen/src/Core/util/StaticAssert.h index 500e47792..9d8bfd334 100644 --- a/eigenlib/Eigen/src/Core/util/StaticAssert.h +++ b/eigenlib/Eigen/src/Core/util/StaticAssert.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_STATIC_ASSERT_H #define EIGEN_STATIC_ASSERT_H diff --git a/eigenlib/Eigen/src/Core/util/XprHelper.h b/eigenlib/Eigen/src/Core/util/XprHelper.h index 6bb497082..80c0cb473 100644 --- a/eigenlib/Eigen/src/Core/util/XprHelper.h +++ b/eigenlib/Eigen/src/Core/util/XprHelper.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_XPRHELPER_H #define EIGEN_XPRHELPER_H diff --git a/eigenlib/Eigen/src/Eigenvalues/ComplexEigenSolver.h b/eigenlib/Eigen/src/Eigenvalues/ComplexEigenSolver.h index dc5fae06a..fb11b600d 100644 --- a/eigenlib/Eigen/src/Eigenvalues/ComplexEigenSolver.h +++ b/eigenlib/Eigen/src/Eigenvalues/ComplexEigenSolver.h @@ -7,7 +7,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_COMPLEX_EIGEN_SOLVER_H #define EIGEN_COMPLEX_EIGEN_SOLVER_H diff --git a/eigenlib/Eigen/src/Eigenvalues/ComplexSchur.h b/eigenlib/Eigen/src/Eigenvalues/ComplexSchur.h index 4354e4018..dba70e5c1 100644 --- a/eigenlib/Eigen/src/Eigenvalues/ComplexSchur.h +++ b/eigenlib/Eigen/src/Eigenvalues/ComplexSchur.h @@ -7,7 +7,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_COMPLEX_SCHUR_H #define EIGEN_COMPLEX_SCHUR_H diff --git a/eigenlib/Eigen/src/Eigenvalues/EigenSolver.h b/eigenlib/Eigen/src/Eigenvalues/EigenSolver.h index f205b185d..aec9b7da1 100644 --- a/eigenlib/Eigen/src/Eigenvalues/EigenSolver.h +++ b/eigenlib/Eigen/src/Eigenvalues/EigenSolver.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_EIGENSOLVER_H #define EIGEN_EIGENSOLVER_H diff --git a/eigenlib/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h b/eigenlib/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h index 87d789b3f..94d643cfc 100644 --- a/eigenlib/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +++ b/eigenlib/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h @@ -7,7 +7,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_GENERALIZEDEIGENSOLVER_H #define EIGEN_GENERALIZEDEIGENSOLVER_H diff --git a/eigenlib/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h b/eigenlib/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h index 5f6bb8289..41871709b 100644 --- a/eigenlib/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +++ b/eigenlib/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_GENERALIZEDSELFADJOINTEIGENSOLVER_H #define EIGEN_GENERALIZEDSELFADJOINTEIGENSOLVER_H diff --git a/eigenlib/Eigen/src/Eigenvalues/HessenbergDecomposition.h b/eigenlib/Eigen/src/Eigenvalues/HessenbergDecomposition.h index f647f69b0..e712b019d 100644 --- a/eigenlib/Eigen/src/Eigenvalues/HessenbergDecomposition.h +++ b/eigenlib/Eigen/src/Eigenvalues/HessenbergDecomposition.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_HESSENBERGDECOMPOSITION_H #define EIGEN_HESSENBERGDECOMPOSITION_H diff --git a/eigenlib/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h b/eigenlib/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h index e4e426071..633d76e92 100644 --- a/eigenlib/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +++ b/eigenlib/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_MATRIXBASEEIGENVALUES_H #define EIGEN_MATRIXBASEEIGENVALUES_H diff --git a/eigenlib/Eigen/src/Eigenvalues/RealQZ.h b/eigenlib/Eigen/src/Eigenvalues/RealQZ.h index b3a910dd9..3d332d381 100644 --- a/eigenlib/Eigen/src/Eigenvalues/RealQZ.h +++ b/eigenlib/Eigen/src/Eigenvalues/RealQZ.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_REAL_QZ_H #define EIGEN_REAL_QZ_H diff --git a/eigenlib/Eigen/src/Eigenvalues/RealSchur.h b/eigenlib/Eigen/src/Eigenvalues/RealSchur.h index 9191519ab..ec1375f53 100644 --- a/eigenlib/Eigen/src/Eigenvalues/RealSchur.h +++ b/eigenlib/Eigen/src/Eigenvalues/RealSchur.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_REAL_SCHUR_H #define EIGEN_REAL_SCHUR_H diff --git a/eigenlib/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h b/eigenlib/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h index d37656fa2..350d4648f 100644 --- a/eigenlib/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +++ b/eigenlib/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SELFADJOINTEIGENSOLVER_H #define EIGEN_SELFADJOINTEIGENSOLVER_H diff --git a/eigenlib/Eigen/src/Eigenvalues/Tridiagonalization.h b/eigenlib/Eigen/src/Eigenvalues/Tridiagonalization.h index 1d102c17b..116f53e3f 100644 --- a/eigenlib/Eigen/src/Eigenvalues/Tridiagonalization.h +++ b/eigenlib/Eigen/src/Eigenvalues/Tridiagonalization.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_TRIDIAGONALIZATION_H #define EIGEN_TRIDIAGONALIZATION_H diff --git a/eigenlib/Eigen/src/Geometry/AlignedBox.h b/eigenlib/Eigen/src/Geometry/AlignedBox.h index 066eae4f9..e46fa8720 100644 --- a/eigenlib/Eigen/src/Geometry/AlignedBox.h +++ b/eigenlib/Eigen/src/Geometry/AlignedBox.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ALIGNEDBOX_H #define EIGEN_ALIGNEDBOX_H diff --git a/eigenlib/Eigen/src/Geometry/AngleAxis.h b/eigenlib/Eigen/src/Geometry/AngleAxis.h index 83ee1be46..1f92ba7ea 100644 --- a/eigenlib/Eigen/src/Geometry/AngleAxis.h +++ b/eigenlib/Eigen/src/Geometry/AngleAxis.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ANGLEAXIS_H #define EIGEN_ANGLEAXIS_H diff --git a/eigenlib/Eigen/src/Geometry/EulerAngles.h b/eigenlib/Eigen/src/Geometry/EulerAngles.h index c633268af..26d782d8d 100644 --- a/eigenlib/Eigen/src/Geometry/EulerAngles.h +++ b/eigenlib/Eigen/src/Geometry/EulerAngles.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_EULERANGLES_H #define EIGEN_EULERANGLES_H diff --git a/eigenlib/Eigen/src/Geometry/Homogeneous.h b/eigenlib/Eigen/src/Geometry/Homogeneous.h index 5f0da1a9e..040a1973e 100644 --- a/eigenlib/Eigen/src/Geometry/Homogeneous.h +++ b/eigenlib/Eigen/src/Geometry/Homogeneous.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_HOMOGENEOUS_H #define EIGEN_HOMOGENEOUS_H diff --git a/eigenlib/Eigen/src/Geometry/Hyperplane.h b/eigenlib/Eigen/src/Geometry/Hyperplane.h index 05929b299..d46c61384 100644 --- a/eigenlib/Eigen/src/Geometry/Hyperplane.h +++ b/eigenlib/Eigen/src/Geometry/Hyperplane.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_HYPERPLANE_H #define EIGEN_HYPERPLANE_H diff --git a/eigenlib/Eigen/src/Geometry/OrthoMethods.h b/eigenlib/Eigen/src/Geometry/OrthoMethods.h index a035e6310..42cc46ae5 100644 --- a/eigenlib/Eigen/src/Geometry/OrthoMethods.h +++ b/eigenlib/Eigen/src/Geometry/OrthoMethods.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ORTHOMETHODS_H #define EIGEN_ORTHOMETHODS_H diff --git a/eigenlib/Eigen/src/Geometry/ParametrizedLine.h b/eigenlib/Eigen/src/Geometry/ParametrizedLine.h index 1e985d8cd..e7b203611 100644 --- a/eigenlib/Eigen/src/Geometry/ParametrizedLine.h +++ b/eigenlib/Eigen/src/Geometry/ParametrizedLine.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PARAMETRIZEDLINE_H #define EIGEN_PARAMETRIZEDLINE_H diff --git a/eigenlib/Eigen/src/Geometry/Quaternion.h b/eigenlib/Eigen/src/Geometry/Quaternion.h index b81820656..025328c7f 100644 --- a/eigenlib/Eigen/src/Geometry/Quaternion.h +++ b/eigenlib/Eigen/src/Geometry/Quaternion.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_QUATERNION_H #define EIGEN_QUATERNION_H diff --git a/eigenlib/Eigen/src/Geometry/Rotation2D.h b/eigenlib/Eigen/src/Geometry/Rotation2D.h index 884b7d0ee..f62b0e74d 100644 --- a/eigenlib/Eigen/src/Geometry/Rotation2D.h +++ b/eigenlib/Eigen/src/Geometry/Rotation2D.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ROTATION2D_H #define EIGEN_ROTATION2D_H diff --git a/eigenlib/Eigen/src/Geometry/RotationBase.h b/eigenlib/Eigen/src/Geometry/RotationBase.h index f0ee0bd03..f59d2ddc9 100644 --- a/eigenlib/Eigen/src/Geometry/RotationBase.h +++ b/eigenlib/Eigen/src/Geometry/RotationBase.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ROTATIONBASE_H #define EIGEN_ROTATIONBASE_H diff --git a/eigenlib/Eigen/src/Geometry/Scaling.h b/eigenlib/Eigen/src/Geometry/Scaling.h index 33eabd81a..3372508dd 100644 --- a/eigenlib/Eigen/src/Geometry/Scaling.h +++ b/eigenlib/Eigen/src/Geometry/Scaling.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SCALING_H #define EIGEN_SCALING_H diff --git a/eigenlib/Eigen/src/Geometry/Transform.h b/eigenlib/Eigen/src/Geometry/Transform.h index c21d9e550..45a71815f 100644 --- a/eigenlib/Eigen/src/Geometry/Transform.h +++ b/eigenlib/Eigen/src/Geometry/Transform.h @@ -7,7 +7,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_TRANSFORM_H #define EIGEN_TRANSFORM_H diff --git a/eigenlib/Eigen/src/Geometry/Translation.h b/eigenlib/Eigen/src/Geometry/Translation.h index 0e99ce68e..c6cbb1d41 100644 --- a/eigenlib/Eigen/src/Geometry/Translation.h +++ b/eigenlib/Eigen/src/Geometry/Translation.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_TRANSLATION_H #define EIGEN_TRANSLATION_H diff --git a/eigenlib/Eigen/src/Geometry/Umeyama.h b/eigenlib/Eigen/src/Geometry/Umeyama.h index 6b755008f..566b824cc 100644 --- a/eigenlib/Eigen/src/Geometry/Umeyama.h +++ b/eigenlib/Eigen/src/Geometry/Umeyama.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_UMEYAMA_H #define EIGEN_UMEYAMA_H diff --git a/eigenlib/Eigen/src/Geometry/arch/Geometry_SSE.h b/eigenlib/Eigen/src/Geometry/arch/Geometry_SSE.h index f68cab583..625ee0a00 100644 --- a/eigenlib/Eigen/src/Geometry/arch/Geometry_SSE.h +++ b/eigenlib/Eigen/src/Geometry/arch/Geometry_SSE.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_GEOMETRY_SSE_H #define EIGEN_GEOMETRY_SSE_H diff --git a/eigenlib/Eigen/src/Householder/BlockHouseholder.h b/eigenlib/Eigen/src/Householder/BlockHouseholder.h index 01a7ed188..17a661c5c 100644 --- a/eigenlib/Eigen/src/Householder/BlockHouseholder.h +++ b/eigenlib/Eigen/src/Householder/BlockHouseholder.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_BLOCK_HOUSEHOLDER_H #define EIGEN_BLOCK_HOUSEHOLDER_H diff --git a/eigenlib/Eigen/src/Householder/Householder.h b/eigenlib/Eigen/src/Householder/Householder.h index 80de2c305..c6133f6bb 100644 --- a/eigenlib/Eigen/src/Householder/Householder.h +++ b/eigenlib/Eigen/src/Householder/Householder.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_HOUSEHOLDER_H #define EIGEN_HOUSEHOLDER_H diff --git a/eigenlib/Eigen/src/Householder/HouseholderSequence.h b/eigenlib/Eigen/src/Householder/HouseholderSequence.h index 3ce0a693d..bfd542446 100644 --- a/eigenlib/Eigen/src/Householder/HouseholderSequence.h +++ b/eigenlib/Eigen/src/Householder/HouseholderSequence.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_HOUSEHOLDER_SEQUENCE_H #define EIGEN_HOUSEHOLDER_SEQUENCE_H diff --git a/eigenlib/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h b/eigenlib/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h index f66c846ef..835b5feb6 100644 --- a/eigenlib/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +++ b/eigenlib/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_BASIC_PRECONDITIONERS_H #define EIGEN_BASIC_PRECONDITIONERS_H diff --git a/eigenlib/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h b/eigenlib/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h index 454f46814..dc8485f77 100644 --- a/eigenlib/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +++ b/eigenlib/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_BICGSTAB_H #define EIGEN_BICGSTAB_H diff --git a/eigenlib/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h b/eigenlib/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h index f7ce47134..6d55f5cfe 100644 --- a/eigenlib/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +++ b/eigenlib/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_CONJUGATE_GRADIENT_H #define EIGEN_CONJUGATE_GRADIENT_H diff --git a/eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h b/eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h index e45c272b4..4caab13e3 100644 --- a/eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +++ b/eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_INCOMPLETE_CHOlESKY_H #define EIGEN_INCOMPLETE_CHOlESKY_H diff --git a/eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h b/eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h index 338e6f10a..a86f4d419 100644 --- a/eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +++ b/eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_INCOMPLETE_LUT_H #define EIGEN_INCOMPLETE_LUT_H diff --git a/eigenlib/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h b/eigenlib/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h index 7c2326eb7..07a0a51dd 100644 --- a/eigenlib/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +++ b/eigenlib/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ITERATIVE_SOLVER_BASE_H #define EIGEN_ITERATIVE_SOLVER_BASE_H diff --git a/eigenlib/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h b/eigenlib/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h index 0aea0e099..6062e8dc9 100644 --- a/eigenlib/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +++ b/eigenlib/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_LEAST_SQUARE_CONJUGATE_GRADIENT_H #define EIGEN_LEAST_SQUARE_CONJUGATE_GRADIENT_H diff --git a/eigenlib/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h b/eigenlib/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h index 0ace45177..6677f4fc1 100644 --- a/eigenlib/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +++ b/eigenlib/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SOLVEWITHGUESS_H #define EIGEN_SOLVEWITHGUESS_H diff --git a/eigenlib/Eigen/src/Jacobi/Jacobi.h b/eigenlib/Eigen/src/Jacobi/Jacobi.h index 1998c6322..2129b64be 100644 --- a/eigenlib/Eigen/src/Jacobi/Jacobi.h +++ b/eigenlib/Eigen/src/Jacobi/Jacobi.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_JACOBI_H #define EIGEN_JACOBI_H diff --git a/eigenlib/Eigen/src/LU/Determinant.h b/eigenlib/Eigen/src/LU/Determinant.h index d6a3c1e5a..516583b6e 100644 --- a/eigenlib/Eigen/src/LU/Determinant.h +++ b/eigenlib/Eigen/src/LU/Determinant.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_DETERMINANT_H #define EIGEN_DETERMINANT_H diff --git a/eigenlib/Eigen/src/LU/FullPivLU.h b/eigenlib/Eigen/src/LU/FullPivLU.h index 03b6af706..69e7c249b 100644 --- a/eigenlib/Eigen/src/LU/FullPivLU.h +++ b/eigenlib/Eigen/src/LU/FullPivLU.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_LU_H #define EIGEN_LU_H diff --git a/eigenlib/Eigen/src/LU/InverseImpl.h b/eigenlib/Eigen/src/LU/InverseImpl.h index f49f23360..68166e858 100644 --- a/eigenlib/Eigen/src/LU/InverseImpl.h +++ b/eigenlib/Eigen/src/LU/InverseImpl.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_INVERSE_IMPL_H #define EIGEN_INVERSE_IMPL_H diff --git a/eigenlib/Eigen/src/LU/PartialPivLU.h b/eigenlib/Eigen/src/LU/PartialPivLU.h index 6b10f39fa..935adbccb 100644 --- a/eigenlib/Eigen/src/LU/PartialPivLU.h +++ b/eigenlib/Eigen/src/LU/PartialPivLU.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PARTIALLU_H #define EIGEN_PARTIALLU_H diff --git a/eigenlib/Eigen/src/LU/arch/Inverse_SSE.h b/eigenlib/Eigen/src/LU/arch/Inverse_SSE.h index 4dce2ef20..89227a2a1 100644 --- a/eigenlib/Eigen/src/LU/arch/Inverse_SSE.h +++ b/eigenlib/Eigen/src/LU/arch/Inverse_SSE.h @@ -7,7 +7,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page // The SSE code for the 4x4 float and double matrix inverse in this file // comes from the following Intel's library: diff --git a/eigenlib/Eigen/src/MetisSupport/MetisSupport.h b/eigenlib/Eigen/src/MetisSupport/MetisSupport.h index 4c15304ad..cbed964ce 100644 --- a/eigenlib/Eigen/src/MetisSupport/MetisSupport.h +++ b/eigenlib/Eigen/src/MetisSupport/MetisSupport.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef METIS_SUPPORT_H #define METIS_SUPPORT_H diff --git a/eigenlib/Eigen/src/OrderingMethods/Eigen_Colamd.h b/eigenlib/Eigen/src/OrderingMethods/Eigen_Colamd.h index da85b4d6e..19c87d021 100644 --- a/eigenlib/Eigen/src/OrderingMethods/Eigen_Colamd.h +++ b/eigenlib/Eigen/src/OrderingMethods/Eigen_Colamd.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page // This file is modified from the colamd/symamd library. The copyright is below diff --git a/eigenlib/Eigen/src/OrderingMethods/Ordering.h b/eigenlib/Eigen/src/OrderingMethods/Ordering.h index 7ea9b14d7..d3c74f776 100644 --- a/eigenlib/Eigen/src/OrderingMethods/Ordering.h +++ b/eigenlib/Eigen/src/OrderingMethods/Ordering.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_ORDERING_H #define EIGEN_ORDERING_H diff --git a/eigenlib/Eigen/src/PaStiXSupport/PaStiXSupport.h b/eigenlib/Eigen/src/PaStiXSupport/PaStiXSupport.h index 160d8a523..91df321d6 100644 --- a/eigenlib/Eigen/src/PaStiXSupport/PaStiXSupport.h +++ b/eigenlib/Eigen/src/PaStiXSupport/PaStiXSupport.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PASTIXSUPPORT_H #define EIGEN_PASTIXSUPPORT_H diff --git a/eigenlib/Eigen/src/QR/ColPivHouseholderQR.h b/eigenlib/Eigen/src/QR/ColPivHouseholderQR.h index a7b47d55d..1c0e43604 100644 --- a/eigenlib/Eigen/src/QR/ColPivHouseholderQR.h +++ b/eigenlib/Eigen/src/QR/ColPivHouseholderQR.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_COLPIVOTINGHOUSEHOLDERQR_H #define EIGEN_COLPIVOTINGHOUSEHOLDERQR_H diff --git a/eigenlib/Eigen/src/QR/CompleteOrthogonalDecomposition.h b/eigenlib/Eigen/src/QR/CompleteOrthogonalDecomposition.h index 34c637b70..13b260d71 100644 --- a/eigenlib/Eigen/src/QR/CompleteOrthogonalDecomposition.h +++ b/eigenlib/Eigen/src/QR/CompleteOrthogonalDecomposition.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_COMPLETEORTHOGONALDECOMPOSITION_H #define EIGEN_COMPLETEORTHOGONALDECOMPOSITION_H diff --git a/eigenlib/Eigen/src/QR/FullPivHouseholderQR.h b/eigenlib/Eigen/src/QR/FullPivHouseholderQR.h index e489bddc2..a44377950 100644 --- a/eigenlib/Eigen/src/QR/FullPivHouseholderQR.h +++ b/eigenlib/Eigen/src/QR/FullPivHouseholderQR.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H #define EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H diff --git a/eigenlib/Eigen/src/QR/HouseholderQR.h b/eigenlib/Eigen/src/QR/HouseholderQR.h index 3513d995c..e4e94280c 100644 --- a/eigenlib/Eigen/src/QR/HouseholderQR.h +++ b/eigenlib/Eigen/src/QR/HouseholderQR.h @@ -7,7 +7,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_QR_H #define EIGEN_QR_H diff --git a/eigenlib/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h b/eigenlib/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h index 953d57c9d..2237e0b35 100644 --- a/eigenlib/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +++ b/eigenlib/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SUITESPARSEQRSUPPORT_H #define EIGEN_SUITESPARSEQRSUPPORT_H diff --git a/eigenlib/Eigen/src/SVD/BDCSVD.h b/eigenlib/Eigen/src/SVD/BDCSVD.h index a5b73f8f2..82fdccc57 100644 --- a/eigenlib/Eigen/src/SVD/BDCSVD.h +++ b/eigenlib/Eigen/src/SVD/BDCSVD.h @@ -15,7 +15,7 @@ // // Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_BDCSVD_H #define EIGEN_BDCSVD_H diff --git a/eigenlib/Eigen/src/SVD/JacobiSVD.h b/eigenlib/Eigen/src/SVD/JacobiSVD.h index 43488b1e0..a36bd85e2 100644 --- a/eigenlib/Eigen/src/SVD/JacobiSVD.h +++ b/eigenlib/Eigen/src/SVD/JacobiSVD.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_JACOBISVD_H #define EIGEN_JACOBISVD_H diff --git a/eigenlib/Eigen/src/SVD/SVDBase.h b/eigenlib/Eigen/src/SVD/SVDBase.h index 53da28488..9c6577c32 100644 --- a/eigenlib/Eigen/src/SVD/SVDBase.h +++ b/eigenlib/Eigen/src/SVD/SVDBase.h @@ -11,7 +11,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SVDBASE_H #define EIGEN_SVDBASE_H diff --git a/eigenlib/Eigen/src/SVD/UpperBidiagonalization.h b/eigenlib/Eigen/src/SVD/UpperBidiagonalization.h index 11ac847e1..22c74c6df 100644 --- a/eigenlib/Eigen/src/SVD/UpperBidiagonalization.h +++ b/eigenlib/Eigen/src/SVD/UpperBidiagonalization.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_BIDIAGONALIZATION_H #define EIGEN_BIDIAGONALIZATION_H diff --git a/eigenlib/Eigen/src/SparseCholesky/SimplicialCholesky.h b/eigenlib/Eigen/src/SparseCholesky/SimplicialCholesky.h index 369e6804a..60e7252ed 100644 --- a/eigenlib/Eigen/src/SparseCholesky/SimplicialCholesky.h +++ b/eigenlib/Eigen/src/SparseCholesky/SimplicialCholesky.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SIMPLICIAL_CHOLESKY_H #define EIGEN_SIMPLICIAL_CHOLESKY_H diff --git a/eigenlib/Eigen/src/SparseCore/AmbiVector.h b/eigenlib/Eigen/src/SparseCore/AmbiVector.h index 2cb7747cc..471c83be9 100644 --- a/eigenlib/Eigen/src/SparseCore/AmbiVector.h +++ b/eigenlib/Eigen/src/SparseCore/AmbiVector.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_AMBIVECTOR_H #define EIGEN_AMBIVECTOR_H diff --git a/eigenlib/Eigen/src/SparseCore/CompressedStorage.h b/eigenlib/Eigen/src/SparseCore/CompressedStorage.h index d89fa0dae..fbe1be96f 100644 --- a/eigenlib/Eigen/src/SparseCore/CompressedStorage.h +++ b/eigenlib/Eigen/src/SparseCore/CompressedStorage.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_COMPRESSED_STORAGE_H #define EIGEN_COMPRESSED_STORAGE_H diff --git a/eigenlib/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h b/eigenlib/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h index 9db119b67..a0ee6db21 100644 --- a/eigenlib/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +++ b/eigenlib/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H #define EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H diff --git a/eigenlib/Eigen/src/SparseCore/MappedSparseMatrix.h b/eigenlib/Eigen/src/SparseCore/MappedSparseMatrix.h index 67718c85b..70bd1f2f7 100644 --- a/eigenlib/Eigen/src/SparseCore/MappedSparseMatrix.h +++ b/eigenlib/Eigen/src/SparseCore/MappedSparseMatrix.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_MAPPED_SPARSEMATRIX_H #define EIGEN_MAPPED_SPARSEMATRIX_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseAssign.h b/eigenlib/Eigen/src/SparseCore/SparseAssign.h index 18352a847..93fdbedff 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseAssign.h +++ b/eigenlib/Eigen/src/SparseCore/SparseAssign.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSEASSIGN_H #define EIGEN_SPARSEASSIGN_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseBlock.h b/eigenlib/Eigen/src/SparseCore/SparseBlock.h index 511e92b2f..ee9489274 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseBlock.h +++ b/eigenlib/Eigen/src/SparseCore/SparseBlock.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSE_BLOCK_H #define EIGEN_SPARSE_BLOCK_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseColEtree.h b/eigenlib/Eigen/src/SparseCore/SparseColEtree.h index ebe02d1ab..caa95511c 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseColEtree.h +++ b/eigenlib/Eigen/src/SparseCore/SparseColEtree.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* diff --git a/eigenlib/Eigen/src/SparseCore/SparseCompressedBase.h b/eigenlib/Eigen/src/SparseCore/SparseCompressedBase.h index 5ccb46656..bf34f95c9 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseCompressedBase.h +++ b/eigenlib/Eigen/src/SparseCore/SparseCompressedBase.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSE_COMPRESSED_BASE_H #define EIGEN_SPARSE_COMPRESSED_BASE_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseCwiseBinaryOp.h b/eigenlib/Eigen/src/SparseCore/SparseCwiseBinaryOp.h index e315e3550..10f24a3de 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +++ b/eigenlib/Eigen/src/SparseCore/SparseCwiseBinaryOp.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSE_CWISE_BINARY_OP_H #define EIGEN_SPARSE_CWISE_BINARY_OP_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseCwiseUnaryOp.h b/eigenlib/Eigen/src/SparseCore/SparseCwiseUnaryOp.h index df6c28d2b..6dd1d872f 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +++ b/eigenlib/Eigen/src/SparseCore/SparseCwiseUnaryOp.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSE_CWISE_UNARY_OP_H #define EIGEN_SPARSE_CWISE_UNARY_OP_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseDenseProduct.h b/eigenlib/Eigen/src/SparseCore/SparseDenseProduct.h index 0547db596..dc836bd68 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseDenseProduct.h +++ b/eigenlib/Eigen/src/SparseCore/SparseDenseProduct.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSEDENSEPRODUCT_H #define EIGEN_SPARSEDENSEPRODUCT_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseDiagonalProduct.h b/eigenlib/Eigen/src/SparseCore/SparseDiagonalProduct.h index 941c03be3..192beba52 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseDiagonalProduct.h +++ b/eigenlib/Eigen/src/SparseCore/SparseDiagonalProduct.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSE_DIAGONAL_PRODUCT_H #define EIGEN_SPARSE_DIAGONAL_PRODUCT_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseDot.h b/eigenlib/Eigen/src/SparseCore/SparseDot.h index 38bc4aa9e..72c05593f 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseDot.h +++ b/eigenlib/Eigen/src/SparseCore/SparseDot.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSE_DOT_H #define EIGEN_SPARSE_DOT_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseFuzzy.h b/eigenlib/Eigen/src/SparseCore/SparseFuzzy.h index 7d47eb94d..0d0c3eb78 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseFuzzy.h +++ b/eigenlib/Eigen/src/SparseCore/SparseFuzzy.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSE_FUZZY_H #define EIGEN_SPARSE_FUZZY_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseMap.h b/eigenlib/Eigen/src/SparseCore/SparseMap.h index f99be3379..e199e2620 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseMap.h +++ b/eigenlib/Eigen/src/SparseCore/SparseMap.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSE_MAP_H #define EIGEN_SPARSE_MAP_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseMatrix.h b/eigenlib/Eigen/src/SparseCore/SparseMatrix.h index a5396538b..0f590cc13 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseMatrix.h +++ b/eigenlib/Eigen/src/SparseCore/SparseMatrix.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSEMATRIX_H #define EIGEN_SPARSEMATRIX_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseMatrixBase.h b/eigenlib/Eigen/src/SparseCore/SparseMatrixBase.h index c6b548f11..021cedc06 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseMatrixBase.h +++ b/eigenlib/Eigen/src/SparseCore/SparseMatrixBase.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSEMATRIXBASE_H #define EIGEN_SPARSEMATRIXBASE_H diff --git a/eigenlib/Eigen/src/SparseCore/SparsePermutation.h b/eigenlib/Eigen/src/SparseCore/SparsePermutation.h index ef38357ae..41df5bed2 100644 --- a/eigenlib/Eigen/src/SparseCore/SparsePermutation.h +++ b/eigenlib/Eigen/src/SparseCore/SparsePermutation.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSE_PERMUTATION_H #define EIGEN_SPARSE_PERMUTATION_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseProduct.h b/eigenlib/Eigen/src/SparseCore/SparseProduct.h index 4cbf68781..73e042c99 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseProduct.h +++ b/eigenlib/Eigen/src/SparseCore/SparseProduct.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSEPRODUCT_H #define EIGEN_SPARSEPRODUCT_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseRedux.h b/eigenlib/Eigen/src/SparseCore/SparseRedux.h index 458774962..6ea90b57f 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseRedux.h +++ b/eigenlib/Eigen/src/SparseCore/SparseRedux.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSEREDUX_H #define EIGEN_SPARSEREDUX_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseRef.h b/eigenlib/Eigen/src/SparseCore/SparseRef.h index d91f38f97..58388bfcd 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseRef.h +++ b/eigenlib/Eigen/src/SparseCore/SparseRef.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSE_REF_H #define EIGEN_SPARSE_REF_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseSelfAdjointView.h b/eigenlib/Eigen/src/SparseCore/SparseSelfAdjointView.h index 76117a010..70ed2f0b1 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseSelfAdjointView.h +++ b/eigenlib/Eigen/src/SparseCore/SparseSelfAdjointView.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSE_SELFADJOINTVIEW_H #define EIGEN_SPARSE_SELFADJOINTVIEW_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseSolverBase.h b/eigenlib/Eigen/src/SparseCore/SparseSolverBase.h index b4c9a422f..6ac6fcc62 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseSolverBase.h +++ b/eigenlib/Eigen/src/SparseCore/SparseSolverBase.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSESOLVERBASE_H #define EIGEN_SPARSESOLVERBASE_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseSparseProductWithPruning.h b/eigenlib/Eigen/src/SparseCore/SparseSparseProductWithPruning.h index 88820a48f..c8c289b81 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +++ b/eigenlib/Eigen/src/SparseCore/SparseSparseProductWithPruning.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSESPARSEPRODUCTWITHPRUNING_H #define EIGEN_SPARSESPARSEPRODUCTWITHPRUNING_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseTranspose.h b/eigenlib/Eigen/src/SparseCore/SparseTranspose.h index 3757d4c6b..3a3169a6e 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseTranspose.h +++ b/eigenlib/Eigen/src/SparseCore/SparseTranspose.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSETRANSPOSE_H #define EIGEN_SPARSETRANSPOSE_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseTriangularView.h b/eigenlib/Eigen/src/SparseCore/SparseTriangularView.h index 9ac120266..84145809d 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseTriangularView.h +++ b/eigenlib/Eigen/src/SparseCore/SparseTriangularView.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSE_TRIANGULARVIEW_H #define EIGEN_SPARSE_TRIANGULARVIEW_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseUtil.h b/eigenlib/Eigen/src/SparseCore/SparseUtil.h index 74df0d496..6daddd8ff 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseUtil.h +++ b/eigenlib/Eigen/src/SparseCore/SparseUtil.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSEUTIL_H #define EIGEN_SPARSEUTIL_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseVector.h b/eigenlib/Eigen/src/SparseCore/SparseVector.h index 19b0fbc9d..f48aed456 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseVector.h +++ b/eigenlib/Eigen/src/SparseCore/SparseVector.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSEVECTOR_H #define EIGEN_SPARSEVECTOR_H diff --git a/eigenlib/Eigen/src/SparseCore/SparseView.h b/eigenlib/Eigen/src/SparseCore/SparseView.h index 92b3d1f7b..72cad92a3 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseView.h +++ b/eigenlib/Eigen/src/SparseCore/SparseView.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSEVIEW_H #define EIGEN_SPARSEVIEW_H diff --git a/eigenlib/Eigen/src/SparseCore/TriangularSolver.h b/eigenlib/Eigen/src/SparseCore/TriangularSolver.h index f9c56ba79..5e5c20c70 100644 --- a/eigenlib/Eigen/src/SparseCore/TriangularSolver.h +++ b/eigenlib/Eigen/src/SparseCore/TriangularSolver.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSETRIANGULARSOLVER_H #define EIGEN_SPARSETRIANGULARSOLVER_H diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU.h b/eigenlib/Eigen/src/SparseLU/SparseLU.h index 87f0efe37..754974cf4 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSE_LU_H diff --git a/eigenlib/Eigen/src/SparseLU/SparseLUImpl.h b/eigenlib/Eigen/src/SparseLU/SparseLUImpl.h index fc0cfc4de..60360ee50 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLUImpl.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLUImpl.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef SPARSELU_IMPL_H #define SPARSELU_IMPL_H diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU_Memory.h b/eigenlib/Eigen/src/SparseLU/SparseLU_Memory.h index 4dc42e87b..b96d76f4e 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU_Memory.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU_Memory.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU_Structs.h b/eigenlib/Eigen/src/SparseLU/SparseLU_Structs.h index cf5ec449b..117016290 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU_Structs.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU_Structs.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* * NOTE: This file comes from a partly modified version of files slu_[s,d,c,z]defs.h diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h b/eigenlib/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h index 721e1883b..c3340fb40 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSELU_SUPERNODAL_MATRIX_H #define EIGEN_SPARSELU_SUPERNODAL_MATRIX_H diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU_Utils.h b/eigenlib/Eigen/src/SparseLU/SparseLU_Utils.h index 9e3dab44d..f06c903cc 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU_Utils.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU_Utils.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSELU_UTILS_H diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU_column_bmod.h b/eigenlib/Eigen/src/SparseLU/SparseLU_column_bmod.h index b57f06802..57f05ca5c 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU_column_bmod.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU_column_bmod.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU_column_dfs.h b/eigenlib/Eigen/src/SparseLU/SparseLU_column_dfs.h index c98b30e32..4f672baa8 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU_column_dfs.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU_column_dfs.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h b/eigenlib/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h index c32d8d8b1..fa54bd4ac 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* * NOTE: This file is the modified version of [s,d,c,z]copy_to_ucol.c file in SuperLU diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU_gemm_kernel.h b/eigenlib/Eigen/src/SparseLU/SparseLU_gemm_kernel.h index 95ba7413f..a521692f6 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU_gemm_kernel.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSELU_GEMM_KERNEL_H #define EIGEN_SPARSELU_GEMM_KERNEL_H diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h b/eigenlib/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h index 6f75d500e..3c0fe279e 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* This file is a modified version of heap_relax_snode.c file in SuperLU * -- SuperLU routine (version 3.0) -- diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU_kernel_bmod.h b/eigenlib/Eigen/src/SparseLU/SparseLU_kernel_bmod.h index 8c1b3e8bc..c7420989a 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU_kernel_bmod.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef SPARSELU_KERNEL_BMOD_H #define SPARSELU_KERNEL_BMOD_H diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU_panel_bmod.h b/eigenlib/Eigen/src/SparseLU/SparseLU_panel_bmod.h index 822cf32c3..934b5bb0e 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU_panel_bmod.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU_panel_bmod.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU_panel_dfs.h b/eigenlib/Eigen/src/SparseLU/SparseLU_panel_dfs.h index 155df7336..bcb2aea62 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU_panel_dfs.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU_panel_dfs.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU_pivotL.h b/eigenlib/Eigen/src/SparseLU/SparseLU_pivotL.h index a86dac93f..08d5dbe7c 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU_pivotL.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU_pivotL.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU_pruneL.h b/eigenlib/Eigen/src/SparseLU/SparseLU_pruneL.h index ad32fed5e..6506e3e40 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU_pruneL.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU_pruneL.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU_relax_snode.h b/eigenlib/Eigen/src/SparseLU/SparseLU_relax_snode.h index c408d01b4..a5ca46bdb 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU_relax_snode.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU_relax_snode.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page /* This file is a modified version of heap_relax_snode.c file in SuperLU * -- SuperLU routine (version 3.0) -- diff --git a/eigenlib/Eigen/src/SparseQR/SparseQR.h b/eigenlib/Eigen/src/SparseQR/SparseQR.h index 7409fcae9..fce3ee5c8 100644 --- a/eigenlib/Eigen/src/SparseQR/SparseQR.h +++ b/eigenlib/Eigen/src/SparseQR/SparseQR.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SPARSE_QR_H #define EIGEN_SPARSE_QR_H diff --git a/eigenlib/Eigen/src/StlSupport/StdDeque.h b/eigenlib/Eigen/src/StlSupport/StdDeque.h index af158f425..563d04640 100644 --- a/eigenlib/Eigen/src/StlSupport/StdDeque.h +++ b/eigenlib/Eigen/src/StlSupport/StdDeque.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_STDDEQUE_H #define EIGEN_STDDEQUE_H diff --git a/eigenlib/Eigen/src/StlSupport/StdList.h b/eigenlib/Eigen/src/StlSupport/StdList.h index e1eba4985..3fbc53f40 100644 --- a/eigenlib/Eigen/src/StlSupport/StdList.h +++ b/eigenlib/Eigen/src/StlSupport/StdList.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_STDLIST_H #define EIGEN_STDLIST_H diff --git a/eigenlib/Eigen/src/StlSupport/StdVector.h b/eigenlib/Eigen/src/StlSupport/StdVector.h index ec22821d2..da36f8e04 100644 --- a/eigenlib/Eigen/src/StlSupport/StdVector.h +++ b/eigenlib/Eigen/src/StlSupport/StdVector.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_STDVECTOR_H #define EIGEN_STDVECTOR_H diff --git a/eigenlib/Eigen/src/StlSupport/details.h b/eigenlib/Eigen/src/StlSupport/details.h index 2cfd13e03..d60c28b81 100644 --- a/eigenlib/Eigen/src/StlSupport/details.h +++ b/eigenlib/Eigen/src/StlSupport/details.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_STL_DETAILS_H #define EIGEN_STL_DETAILS_H diff --git a/eigenlib/Eigen/src/SuperLUSupport/SuperLUSupport.h b/eigenlib/Eigen/src/SuperLUSupport/SuperLUSupport.h index 7261c7d0f..38739c675 100644 --- a/eigenlib/Eigen/src/SuperLUSupport/SuperLUSupport.h +++ b/eigenlib/Eigen/src/SuperLUSupport/SuperLUSupport.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_SUPERLUSUPPORT_H #define EIGEN_SUPERLUSUPPORT_H diff --git a/eigenlib/Eigen/src/UmfPackSupport/UmfPackSupport.h b/eigenlib/Eigen/src/UmfPackSupport/UmfPackSupport.h index 91c09ab13..25ace727a 100644 --- a/eigenlib/Eigen/src/UmfPackSupport/UmfPackSupport.h +++ b/eigenlib/Eigen/src/UmfPackSupport/UmfPackSupport.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_UMFPACKSUPPORT_H #define EIGEN_UMFPACKSUPPORT_H diff --git a/eigenlib/Eigen/src/misc/Image.h b/eigenlib/Eigen/src/misc/Image.h index b8b8a0455..4d880a520 100644 --- a/eigenlib/Eigen/src/misc/Image.h +++ b/eigenlib/Eigen/src/misc/Image.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_MISC_IMAGE_H #define EIGEN_MISC_IMAGE_H diff --git a/eigenlib/Eigen/src/misc/Kernel.h b/eigenlib/Eigen/src/misc/Kernel.h index bef5d6ff5..054afc674 100644 --- a/eigenlib/Eigen/src/misc/Kernel.h +++ b/eigenlib/Eigen/src/misc/Kernel.h @@ -5,7 +5,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_MISC_KERNEL_H #define EIGEN_MISC_KERNEL_H diff --git a/eigenlib/Eigen/src/misc/RealSvd2x2.h b/eigenlib/Eigen/src/misc/RealSvd2x2.h index abb4d3c2f..843fe4794 100644 --- a/eigenlib/Eigen/src/misc/RealSvd2x2.h +++ b/eigenlib/Eigen/src/misc/RealSvd2x2.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_REALSVD2X2_H #define EIGEN_REALSVD2X2_H diff --git a/eigenlib/Eigen/src/plugins/BlockMethods.h b/eigenlib/Eigen/src/plugins/BlockMethods.h index ac35a0086..39055dc09 100644 --- a/eigenlib/Eigen/src/plugins/BlockMethods.h +++ b/eigenlib/Eigen/src/plugins/BlockMethods.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page #ifndef EIGEN_PARSED_BY_DOXYGEN diff --git a/eigenlib/Eigen/src/plugins/CommonCwiseBinaryOps.h b/eigenlib/Eigen/src/plugins/CommonCwiseBinaryOps.h index 8b6730ede..11084ec58 100644 --- a/eigenlib/Eigen/src/plugins/CommonCwiseBinaryOps.h +++ b/eigenlib/Eigen/src/plugins/CommonCwiseBinaryOps.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page // This file is a base class plugin containing common coefficient wise functions. diff --git a/eigenlib/Eigen/src/plugins/CommonCwiseUnaryOps.h b/eigenlib/Eigen/src/plugins/CommonCwiseUnaryOps.h index 89f4faaac..a71c4bcf9 100644 --- a/eigenlib/Eigen/src/plugins/CommonCwiseUnaryOps.h +++ b/eigenlib/Eigen/src/plugins/CommonCwiseUnaryOps.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page // This file is a base class plugin containing common coefficient wise functions. diff --git a/eigenlib/Eigen/src/plugins/MatrixCwiseBinaryOps.h b/eigenlib/Eigen/src/plugins/MatrixCwiseBinaryOps.h index f1084abef..f937d43df 100644 --- a/eigenlib/Eigen/src/plugins/MatrixCwiseBinaryOps.h +++ b/eigenlib/Eigen/src/plugins/MatrixCwiseBinaryOps.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page // This file is a base class plugin containing matrix specifics coefficient wise functions. diff --git a/eigenlib/Eigen/src/plugins/MatrixCwiseUnaryOps.h b/eigenlib/Eigen/src/plugins/MatrixCwiseUnaryOps.h index b1be3d566..fa75838d4 100644 --- a/eigenlib/Eigen/src/plugins/MatrixCwiseUnaryOps.h +++ b/eigenlib/Eigen/src/plugins/MatrixCwiseUnaryOps.h @@ -6,7 +6,7 @@ // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// with this file, You can obtain one at the mozilla.org home page // This file is included into the body of the base classes supporting matrix specific coefficient-wise functions. // This include MatrixBase and SparseMatrixBase. diff --git a/eigenlib/howto.txt b/eigenlib/howto.txt index 99b206826..d88199d55 100644 --- a/eigenlib/howto.txt +++ b/eigenlib/howto.txt @@ -9,6 +9,11 @@ To update the lib: - download Eigen - unzip it somewhere - delete (in the filesystem) the content of the folder eigenlib/Eigen - copy the folders 'Eigen' there +- execute the two following shell commands in the folder Eigen + + grep -RiIl 'http://mozilla.org/MPL/2.0/.' * | xargs sed -i 's/http:\/\/mozilla.org\/MPL\/2.0\/./the mozilla.org home page/g' + grep -RiIl 'http' * | xargs sed -i 's/http/xxxp/g' + - check the git status. - update this file - commit everything From ca59ed7c8d60584842ac75aa9f0356f5082f4eb1 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 19 Oct 2021 11:38:36 +0200 Subject: [PATCH 32/56] modify links into eigen --- eigenlib/Eigen/CholmodSupport | 2 +- eigenlib/Eigen/Core | 6 +++--- eigenlib/Eigen/MetisSupport | 2 +- eigenlib/Eigen/PaStiXSupport | 2 +- eigenlib/Eigen/SPQRSupport | 2 +- eigenlib/Eigen/SuperLUSupport | 2 +- eigenlib/Eigen/UmfPackSupport | 2 +- eigenlib/Eigen/src/Core/ConditionEstimator.h | 2 +- eigenlib/Eigen/src/Core/DenseStorage.h | 6 +++--- eigenlib/Eigen/src/Core/Dot.h | 2 +- eigenlib/Eigen/src/Core/MathFunctions.h | 2 +- eigenlib/Eigen/src/Core/MathFunctionsImpl.h | 2 +- eigenlib/Eigen/src/Core/NumTraits.h | 4 ++-- eigenlib/Eigen/src/Core/PlainObjectBase.h | 2 +- eigenlib/Eigen/src/Core/arch/AVX/MathFunctions.h | 4 ++-- eigenlib/Eigen/src/Core/arch/AltiVec/MathFunctions.h | 4 ++-- eigenlib/Eigen/src/Core/arch/AltiVec/PacketMath.h | 10 +++++----- eigenlib/Eigen/src/Core/arch/CUDA/Half.h | 6 +++--- eigenlib/Eigen/src/Core/arch/NEON/MathFunctions.h | 2 +- eigenlib/Eigen/src/Core/arch/NEON/PacketMath.h | 12 ++++++------ eigenlib/Eigen/src/Core/arch/SSE/MathFunctions.h | 6 +++--- eigenlib/Eigen/src/Core/arch/ZVector/MathFunctions.h | 2 +- eigenlib/Eigen/src/Core/arch/ZVector/PacketMath.h | 2 +- eigenlib/Eigen/src/Core/util/DisableStupidWarnings.h | 2 +- eigenlib/Eigen/src/Core/util/Macros.h | 2 +- eigenlib/Eigen/src/Core/util/Memory.h | 10 +++++----- eigenlib/Eigen/src/Eigenvalues/ComplexSchur.h | 2 +- eigenlib/Eigen/src/Eigenvalues/EigenSolver.h | 2 +- eigenlib/Eigen/src/Eigenvalues/RealSchur.h | 2 +- eigenlib/Eigen/src/Geometry/OrthoMethods.h | 2 +- eigenlib/Eigen/src/Geometry/Quaternion.h | 4 ++-- .../src/IterativeLinearSolvers/IncompleteCholesky.h | 2 +- .../Eigen/src/IterativeLinearSolvers/IncompleteLUT.h | 6 +++--- eigenlib/Eigen/src/LU/arch/Inverse_SSE.h | 2 +- eigenlib/Eigen/src/OrderingMethods/Amd.h | 2 +- eigenlib/Eigen/src/OrderingMethods/Eigen_Colamd.h | 2 +- eigenlib/Eigen/src/QR/ColPivHouseholderQR.h | 4 ++-- eigenlib/Eigen/src/SVD/BDCSVD.h | 2 +- eigenlib/Eigen/src/SparseCore/MappedSparseMatrix.h | 2 +- eigenlib/Eigen/src/SparseCore/SparseVector.h | 2 +- eigenlib/Eigen/src/SparseLU/SparseLU.h | 2 +- 41 files changed, 69 insertions(+), 69 deletions(-) diff --git a/eigenlib/Eigen/CholmodSupport b/eigenlib/Eigen/CholmodSupport index 96cb4e4f7..88913ad85 100644 --- a/eigenlib/Eigen/CholmodSupport +++ b/eigenlib/Eigen/CholmodSupport @@ -19,7 +19,7 @@ extern "C" { /** \ingroup Support_modules * \defgroup CholmodSupport_Module CholmodSupport module * - * This module provides an interface to the Cholmod library which is part of the suitesparse package. + * This module provides an interface to the Cholmod library which is part of the suitesparse package. * It provides the two following main factorization classes: * - 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). diff --git a/eigenlib/Eigen/Core b/eigenlib/Eigen/Core index c2808c5fd..3a202c7aa 100644 --- a/eigenlib/Eigen/Core +++ b/eigenlib/Eigen/Core @@ -88,7 +88,7 @@ #include "src/Core/util/Macros.h" // 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) #pragma GCC optimize ("-fno-ipa-cp-clone") #endif @@ -179,7 +179,7 @@ // include files // 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). // 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; @@ -340,7 +340,7 @@ 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 // 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 namespace Eigen { diff --git a/eigenlib/Eigen/MetisSupport b/eigenlib/Eigen/MetisSupport index 4e85d3d49..8ced5fff5 100644 --- a/eigenlib/Eigen/MetisSupport +++ b/eigenlib/Eigen/MetisSupport @@ -23,7 +23,7 @@ extern "C" { * \code * #include * \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 */ diff --git a/eigenlib/Eigen/PaStiXSupport b/eigenlib/Eigen/PaStiXSupport index 307f6ece3..90429aa48 100644 --- a/eigenlib/Eigen/PaStiXSupport +++ b/eigenlib/Eigen/PaStiXSupport @@ -24,7 +24,7 @@ extern "C" { /** \ingroup Support_modules * \defgroup PaStiXSupport_Module PaStiXSupport module * - * This module provides an interface to the PaSTiX library. + * This module provides an interface to the PaSTiX library. * PaSTiX is a general \b supernodal, \b parallel and \b opensource sparse solver. * It provides the two following main factorization classes: * - class PastixLLT : a supernodal, parallel LLt Cholesky factorization. diff --git a/eigenlib/Eigen/SPQRSupport b/eigenlib/Eigen/SPQRSupport index db840f91a..eb83920a2 100644 --- a/eigenlib/Eigen/SPQRSupport +++ b/eigenlib/Eigen/SPQRSupport @@ -17,7 +17,7 @@ /** \ingroup Support_modules * \defgroup SPQRSupport_Module SuiteSparseQR module * - * This module provides an interface to the SPQR library, which is part of the suitesparse package. + * This module provides an interface to the SPQR library, which is part of the suitesparse package. * * \code * #include diff --git a/eigenlib/Eigen/SuperLUSupport b/eigenlib/Eigen/SuperLUSupport index 11b8bce56..296c953b8 100644 --- a/eigenlib/Eigen/SuperLUSupport +++ b/eigenlib/Eigen/SuperLUSupport @@ -38,7 +38,7 @@ namespace Eigen { struct SluMatrix; } /** \ingroup Support_modules * \defgroup SuperLUSupport_Module SuperLUSupport module * - * This module provides an interface to the SuperLU library. + * This module provides an interface to the SuperLU library. * It provides the following factorization class: * - class SuperLU: a supernodal sequential LU factorization. * - class SuperILU: a supernodal sequential incomplete LU factorization (to be used as a preconditioner for iterative methods). diff --git a/eigenlib/Eigen/UmfPackSupport b/eigenlib/Eigen/UmfPackSupport index fcc89a24d..5dcec6d7c 100644 --- a/eigenlib/Eigen/UmfPackSupport +++ b/eigenlib/Eigen/UmfPackSupport @@ -19,7 +19,7 @@ extern "C" { /** \ingroup Support_modules * \defgroup UmfPackSupport_Module UmfPackSupport module * - * This module provides an interface to the UmfPack library which is part of the suitesparse package. + * This module provides an interface to the UmfPack library which is part of the suitesparse package. * It provides the following factorization class: * - class UmfPackLU: a multifrontal sequential LU factorization. * diff --git a/eigenlib/Eigen/src/Core/ConditionEstimator.h b/eigenlib/Eigen/src/Core/ConditionEstimator.h index 3424da522..e93a5568a 100644 --- a/eigenlib/Eigen/src/Core/ConditionEstimator.h +++ b/eigenlib/Eigen/src/Core/ConditionEstimator.h @@ -37,7 +37,7 @@ struct rcond_compute_sign { * \a matrix that implements .solve() and .adjoint().solve() methods. * * 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 * 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) diff --git a/eigenlib/Eigen/src/Core/DenseStorage.h b/eigenlib/Eigen/src/Core/DenseStorage.h index 45891dd33..191be5393 100644 --- a/eigenlib/Eigen/src/Core/DenseStorage.h +++ b/eigenlib/Eigen/src/Core/DenseStorage.h @@ -62,20 +62,20 @@ struct plain_array #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) #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. - // 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: template EIGEN_ALWAYS_INLINE PtrType eigen_unaligned_array_assert_workaround_gcc47(PtrType array) { return array; } #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \ eigen_assert((internal::UIntPtr(eigen_unaligned_array_assert_workaround_gcc47(array)) & (sizemask)) == 0 \ && "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 !!! ****"); #else #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \ eigen_assert((internal::UIntPtr(array) & (sizemask)) == 0 \ && "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 !!! ****"); #endif diff --git a/eigenlib/Eigen/src/Core/Dot.h b/eigenlib/Eigen/src/Core/Dot.h index c8daa897e..d170aa09d 100644 --- a/eigenlib/Eigen/src/Core/Dot.h +++ b/eigenlib/Eigen/src/Core/Dot.h @@ -253,7 +253,7 @@ struct lpNorm_selector * * In all cases, if \c *this is empty, then the value 0 is returned. * - * \note For matrices, this function does not compute the operator-norm. 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 operator-norm. 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() */ diff --git a/eigenlib/Eigen/src/Core/MathFunctions.h b/eigenlib/Eigen/src/Core/MathFunctions.h index a2dce17b3..c262ede9b 100644 --- a/eigenlib/Eigen/src/Core/MathFunctions.h +++ b/eigenlib/Eigen/src/Core/MathFunctions.h @@ -10,7 +10,7 @@ #ifndef 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 #define EIGEN_PI 3.141592653589793238462643383279502884197169399375105820974944592307816406L diff --git a/eigenlib/Eigen/src/Core/MathFunctionsImpl.h b/eigenlib/Eigen/src/Core/MathFunctionsImpl.h index f5d8d7179..42da1d6df 100644 --- a/eigenlib/Eigen/src/Core/MathFunctionsImpl.h +++ b/eigenlib/Eigen/src/Core/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, // and tanh will return 1 or -1 instead of nan. // 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)); // The monomial coefficients of the numerator polynomial (odd). const T alpha_1 = pset1(4.89352455891786e-03f); diff --git a/eigenlib/Eigen/src/Core/NumTraits.h b/eigenlib/Eigen/src/Core/NumTraits.h index 45bb8e417..c811ea6a2 100644 --- a/eigenlib/Eigen/src/Core/NumTraits.h +++ b/eigenlib/Eigen/src/Core/NumTraits.h @@ -75,13 +75,13 @@ struct default_digits10_impl // 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 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. - * \li An epsilon() function which, unlike std::numeric_limits::epsilon(), + * \li An epsilon() function which, unlike std::numeric_limits::epsilon(), * 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 * value by the fuzzy comparison operators. * \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 - * the analogue of std::numeric_limits::digits10 + * the analogue of std::numeric_limits::digits10 * which is used as the default implementation if specialized. */ diff --git a/eigenlib/Eigen/src/Core/PlainObjectBase.h b/eigenlib/Eigen/src/Core/PlainObjectBase.h index c8dee155e..4559e823b 100644 --- a/eigenlib/Eigen/src/Core/PlainObjectBase.h +++ b/eigenlib/Eigen/src/Core/PlainObjectBase.h @@ -39,7 +39,7 @@ template<> struct check_rows_cols_for_overflow { EIGEN_DEVICE_FUNC 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 Index max_index = (std::size_t(1) << (8 * sizeof(Index) - 1)) - 1; // assume Index is signed bool error = (rows == 0 || cols == 0) ? false diff --git a/eigenlib/Eigen/src/Core/arch/AVX/MathFunctions.h b/eigenlib/Eigen/src/Core/arch/AVX/MathFunctions.h index c5f966b22..aa90a6df3 100644 --- a/eigenlib/Eigen/src/Core/arch/AVX/MathFunctions.h +++ b/eigenlib/Eigen/src/Core/arch/AVX/MathFunctions.h @@ -11,7 +11,7 @@ #define EIGEN_MATH_FUNCTIONS_AVX_H /* The sin, cos, exp, and log functions of this file are loosely derived from - * Julien Pommier's sse math library: http://gruntthepeon.free.fr/ssemath/ + * Julien Pommier's sse math library: xxxp://gruntthepeon.free.fr/ssemath/ */ namespace Eigen { @@ -359,7 +359,7 @@ pexp(const Packet4d& _x) { // The main advantage of this approach is not just speed, but also the fact that // it can be inlined and pipelined with other computations, further reducing its // effective latency. This is similar to Quake3's fast inverse square root. -// For detail see here: http://www.beyond3d.com/content/articles/8/ +// For detail see here: xxxp://www.beyond3d.com/content/articles/8/ #if EIGEN_FAST_MATH template <> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet8f diff --git a/eigenlib/Eigen/src/Core/arch/AltiVec/MathFunctions.h b/eigenlib/Eigen/src/Core/arch/AltiVec/MathFunctions.h index 74e766874..e2c4ece20 100644 --- a/eigenlib/Eigen/src/Core/arch/AltiVec/MathFunctions.h +++ b/eigenlib/Eigen/src/Core/arch/AltiVec/MathFunctions.h @@ -10,7 +10,7 @@ // with this file, You can obtain one at the mozilla.org home page /* The sin, cos, exp, and log functions of this file come from - * Julien Pommier's sse math library: http://gruntthepeon.free.fr/ssemath/ + * Julien Pommier's sse math library: xxxp://gruntthepeon.free.fr/ssemath/ */ #ifndef EIGEN_MATH_FUNCTIONS_ALTIVEC_H @@ -230,7 +230,7 @@ Packet2d psqrt(const Packet2d& x) // vec_cts to efficiently convert Packet2d to Packet2l. Otherwise, use // a slow version that works with older compilers. // Update: apparently vec_cts/vec_ctf intrinsics for 64-bit doubles -// are buggy, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70963 +// are buggy, xxxps://gcc.gnu.org/bugzilla/show_bug.cgi?id=70963 static inline Packet2l ConvertToPacket2l(const Packet2d& x) { #if EIGEN_GNUC_AT_LEAST(5, 4) || \ (EIGEN_GNUC_AT(6, 1) && __GNUC_PATCHLEVEL__ >= 1) diff --git a/eigenlib/Eigen/src/Core/arch/AltiVec/PacketMath.h b/eigenlib/Eigen/src/Core/arch/AltiVec/PacketMath.h index e3d31bb52..ccf3bc150 100755 --- a/eigenlib/Eigen/src/Core/arch/AltiVec/PacketMath.h +++ b/eigenlib/Eigen/src/Core/arch/AltiVec/PacketMath.h @@ -443,7 +443,7 @@ template<> EIGEN_STRONG_INLINE Packet4f ploadu(const float* from) template<> EIGEN_STRONG_INLINE Packet4i ploadu(const int* from) { EIGEN_DEBUG_ALIGNED_LOAD - // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html + // Taken from xxxp://developer.apple.com/hardwaredrivers/ve/alignment.html Packet16uc MSQ, LSQ; Packet16uc mask; MSQ = vec_ld(0, (unsigned char *)from); // most significant quadword @@ -484,7 +484,7 @@ template<> EIGEN_STRONG_INLINE Packet4i ploaddup(const int* from) template<> EIGEN_STRONG_INLINE void pstoreu(float* to, const Packet4f& from) { EIGEN_DEBUG_UNALIGNED_STORE - // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html + // Taken from xxxp://developer.apple.com/hardwaredrivers/ve/alignment.html // Warning: not thread safe! Packet16uc MSQ, LSQ, edges; Packet16uc edgeAlign, align; @@ -502,7 +502,7 @@ template<> EIGEN_STRONG_INLINE void pstoreu(float* to, const Packet4f& f template<> EIGEN_STRONG_INLINE void pstoreu(int* to, const Packet4i& from) { EIGEN_DEBUG_UNALIGNED_STORE - // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html + // Taken from xxxp://developer.apple.com/hardwaredrivers/ve/alignment.html // Warning: not thread safe! Packet16uc MSQ, LSQ, edges; Packet16uc edgeAlign, align; @@ -563,7 +563,7 @@ template<> EIGEN_STRONG_INLINE Packet4f preduxp(const Packet4f* vecs) Packet4f v[4], sum[4]; // It's easier and faster to transpose then add as columns - // Check: http://www.freevec.org/function/matrix_4x4_transpose_floats for explanation + // Check: xxxp://www.freevec.org/function/matrix_4x4_transpose_floats for explanation // Do the transpose, first set of moves v[0] = vec_mergeh(vecs[0], vecs[2]); v[1] = vec_mergel(vecs[0], vecs[2]); @@ -603,7 +603,7 @@ template<> EIGEN_STRONG_INLINE Packet4i preduxp(const Packet4i* vecs) Packet4i v[4], sum[4]; // It's easier and faster to transpose then add as columns - // Check: http://www.freevec.org/function/matrix_4x4_transpose_floats for explanation + // Check: xxxp://www.freevec.org/function/matrix_4x4_transpose_floats for explanation // Do the transpose, first set of moves v[0] = vec_mergeh(vecs[0], vecs[2]); v[1] = vec_mergel(vecs[0], vecs[2]); diff --git a/eigenlib/Eigen/src/Core/arch/CUDA/Half.h b/eigenlib/Eigen/src/Core/arch/CUDA/Half.h index 52573bce5..436f15d34 100644 --- a/eigenlib/Eigen/src/Core/arch/CUDA/Half.h +++ b/eigenlib/Eigen/src/Core/arch/CUDA/Half.h @@ -165,8 +165,8 @@ struct numeric_limits { static const bool is_bounded = false; static const bool is_modulo = false; static const int digits = 11; - static const int digits10 = 3; // according to http://half.sourceforge.net/structstd_1_1numeric__limits_3_01half__float_1_1half_01_4.html - static const int max_digits10 = 5; // according to http://half.sourceforge.net/structstd_1_1numeric__limits_3_01half__float_1_1half_01_4.html + static const int digits10 = 3; // according to xxxp://half.sourceforge.net/structstd_1_1numeric__limits_3_01half__float_1_1half_01_4.html + static const int max_digits10 = 5; // according to xxxp://half.sourceforge.net/structstd_1_1numeric__limits_3_01half__float_1_1half_01_4.html static const int radix = 2; static const int min_exponent = -13; static const int min_exponent10 = -4; @@ -189,7 +189,7 @@ struct numeric_limits { // If std::numeric_limits is specialized, should also specialize // std::numeric_limits, std::numeric_limits, and // std::numeric_limits -// https://stackoverflow.com/a/16519653/ +// xxxps://stackoverflow.com/a/16519653/ template<> struct numeric_limits : numeric_limits {}; template<> diff --git a/eigenlib/Eigen/src/Core/arch/NEON/MathFunctions.h b/eigenlib/Eigen/src/Core/arch/NEON/MathFunctions.h index 3e3fd4ff8..89f16fe89 100644 --- a/eigenlib/Eigen/src/Core/arch/NEON/MathFunctions.h +++ b/eigenlib/Eigen/src/Core/arch/NEON/MathFunctions.h @@ -6,7 +6,7 @@ // with this file, You can obtain one at the mozilla.org home page /* The sin, cos, exp, and log functions of this file come from - * Julien Pommier's sse math library: http://gruntthepeon.free.fr/ssemath/ + * Julien Pommier's sse math library: xxxp://gruntthepeon.free.fr/ssemath/ */ #ifndef EIGEN_MATH_FUNCTIONS_NEON_H diff --git a/eigenlib/Eigen/src/Core/arch/NEON/PacketMath.h b/eigenlib/Eigen/src/Core/arch/NEON/PacketMath.h index c7050a437..89ae2b83d 100644 --- a/eigenlib/Eigen/src/Core/arch/NEON/PacketMath.h +++ b/eigenlib/Eigen/src/Core/arch/NEON/PacketMath.h @@ -207,7 +207,7 @@ template<> EIGEN_STRONG_INLINE Packet4i pdiv(const Packet4i& /*a*/, co // Clang/ARM wrongly advertises __ARM_FEATURE_FMA even when it's not available, // then implements a slow software scalar fallback calling fmaf()! // Filed LLVM bug: -// https://llvm.org/bugs/show_bug.cgi?id=27216 +// xxxps://llvm.org/bugs/show_bug.cgi?id=27216 #if (defined __ARM_FEATURE_FMA) && !(EIGEN_COMP_CLANG && EIGEN_ARCH_ARM) // See bug 936. // FMA is available on VFPv4 i.e. when compiling with -mfpu=neon-vfpv4. @@ -223,9 +223,9 @@ template<> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& // at least -mcpu=cortex-a8 and -mcpu=cortex-a7. Since the former is the default on // -march=armv7-a, that is a very common case. // See e.g. this thread: - // http://lists.llvm.org/pipermail/llvm-dev/2013-December/068806.html + // xxxp://lists.llvm.org/pipermail/llvm-dev/2013-December/068806.html // Filed LLVM bug: - // https://llvm.org/bugs/show_bug.cgi?id=27219 + // xxxps://llvm.org/bugs/show_bug.cgi?id=27219 Packet4f r = c; asm volatile( "vmla.f32 %q[r], %q[a], %q[b]" @@ -508,7 +508,7 @@ template<> EIGEN_STRONG_INLINE int32_t predux_max(const Packet4i& a) } // this PALIGN_NEON business is to work around a bug in LLVM Clang 3.0 causing incorrect compilation errors, -// see bug 347 and this LLVM bug: http://llvm.org/bugs/show_bug.cgi?id=11074 +// see bug 347 and this LLVM bug: xxxp://llvm.org/bugs/show_bug.cgi?id=11074 #define PALIGN_NEON(Offset,Type,Command) \ template<>\ struct palign_impl\ @@ -558,7 +558,7 @@ ptranspose(PacketBlock& kernel) { // Confirmed at least with __apple_build_version__ = 6000054. #ifdef __apple_build_version__ // Let's hope that by the time __apple_build_version__ hits the 601* range, the bug will be fixed. -// https://gist.github.com/yamaya/2924292 suggests that the 3 first digits are only updated with +// xxxps://gist.github.com/yamaya/2924292 suggests that the 3 first digits are only updated with // major toolchain updates. #define EIGEN_APPLE_DOUBLE_NEON_BUG (__apple_build_version__ < 6010000) #else @@ -727,7 +727,7 @@ template<> EIGEN_STRONG_INLINE double predux_min(const Packet2d& a) { template<> EIGEN_STRONG_INLINE double predux_max(const Packet2d& a) { return vgetq_lane_f64(vpmaxq_f64(a, a), 0); } // this PALIGN_NEON business is to work around a bug in LLVM Clang 3.0 causing incorrect compilation errors, -// see bug 347 and this LLVM bug: http://llvm.org/bugs/show_bug.cgi?id=11074 +// see bug 347 and this LLVM bug: xxxp://llvm.org/bugs/show_bug.cgi?id=11074 #define PALIGN_NEON(Offset,Type,Command) \ template<>\ struct palign_impl\ diff --git a/eigenlib/Eigen/src/Core/arch/SSE/MathFunctions.h b/eigenlib/Eigen/src/Core/arch/SSE/MathFunctions.h index 24c842ee0..53da97e23 100644 --- a/eigenlib/Eigen/src/Core/arch/SSE/MathFunctions.h +++ b/eigenlib/Eigen/src/Core/arch/SSE/MathFunctions.h @@ -9,7 +9,7 @@ // with this file, You can obtain one at the mozilla.org home page /* The sin, cos, exp, and log functions of this file come from - * Julien Pommier's sse math library: http://gruntthepeon.free.fr/ssemath/ + * Julien Pommier's sse math library: xxxp://gruntthepeon.free.fr/ssemath/ */ #ifndef EIGEN_MATH_FUNCTIONS_SSE_H @@ -451,7 +451,7 @@ Packet4f pcos(const Packet4f& _x) // The main advantage of this approach is not just speed, but also the fact that // it can be inlined and pipelined with other computations, further reducing its // effective latency. This is similar to Quake3's fast inverse square root. -// For detail see here: http://www.beyond3d.com/content/articles/8/ +// For detail see here: xxxp://www.beyond3d.com/content/articles/8/ template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet4f psqrt(const Packet4f& _x) { @@ -548,7 +548,7 @@ double sqrt(const double &x) { #if EIGEN_COMP_GNUC_STRICT // This works around a GCC bug generating poor code for _mm_sqrt_pd - // See https://bitbucket.org/eigen/eigen/commits/14f468dba4d350d7c19c9b93072e19f7b3df563b + // See xxxps://bitbucket.org/eigen/eigen/commits/14f468dba4d350d7c19c9b93072e19f7b3df563b return internal::pfirst(internal::Packet2d(__builtin_ia32_sqrtsd(_mm_set_sd(x)))); #else return internal::pfirst(internal::Packet2d(_mm_sqrt_pd(_mm_set_sd(x)))); diff --git a/eigenlib/Eigen/src/Core/arch/ZVector/MathFunctions.h b/eigenlib/Eigen/src/Core/arch/ZVector/MathFunctions.h index ee5a3f436..25d529505 100644 --- a/eigenlib/Eigen/src/Core/arch/ZVector/MathFunctions.h +++ b/eigenlib/Eigen/src/Core/arch/ZVector/MathFunctions.h @@ -10,7 +10,7 @@ // with this file, You can obtain one at the mozilla.org home page /* The sin, cos, exp, and log functions of this file come from - * Julien Pommier's sse math library: http://gruntthepeon.free.fr/ssemath/ + * Julien Pommier's sse math library: xxxp://gruntthepeon.free.fr/ssemath/ */ #ifndef EIGEN_MATH_FUNCTIONS_ALTIVEC_H diff --git a/eigenlib/Eigen/src/Core/arch/ZVector/PacketMath.h b/eigenlib/Eigen/src/Core/arch/ZVector/PacketMath.h index 34775cd77..34878a8ba 100755 --- a/eigenlib/Eigen/src/Core/arch/ZVector/PacketMath.h +++ b/eigenlib/Eigen/src/Core/arch/ZVector/PacketMath.h @@ -743,7 +743,7 @@ template<> EIGEN_STRONG_INLINE Packet4i preduxp(const Packet4i* vecs) Packet4i v[4], sum[4]; // It's easier and faster to transpose then add as columns - // Check: http://www.freevec.org/function/matrix_4x4_transpose_floats for explanation + // Check: xxxp://www.freevec.org/function/matrix_4x4_transpose_floats for explanation // Do the transpose, first set of moves v[0] = vec_mergeh(vecs[0], vecs[2]); v[1] = vec_mergel(vecs[0], vecs[2]); diff --git a/eigenlib/Eigen/src/Core/util/DisableStupidWarnings.h b/eigenlib/Eigen/src/Core/util/DisableStupidWarnings.h index 74f74cc42..3127053c5 100755 --- a/eigenlib/Eigen/src/Core/util/DisableStupidWarnings.h +++ b/eigenlib/Eigen/src/Core/util/DisableStupidWarnings.h @@ -58,7 +58,7 @@ #pragma GCC diagnostic ignored "-Wignored-attributes" #endif #if __GNUC__==7 - // See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89325 + // See: xxxps://gcc.gnu.org/bugzilla/show_bug.cgi?id=89325 #pragma GCC diagnostic ignored "-Wattributes" #endif #endif diff --git a/eigenlib/Eigen/src/Core/util/Macros.h b/eigenlib/Eigen/src/Core/util/Macros.h index ba1e95400..1595da9f7 100644 --- a/eigenlib/Eigen/src/Core/util/Macros.h +++ b/eigenlib/Eigen/src/Core/util/Macros.h @@ -833,7 +833,7 @@ namespace Eigen { // for older MSVC versions, as well as 1900 && CUDA 8, using the base operator is sufficient (cf Bugs 1000, 1324) #define EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \ using Base::operator =; -#elif EIGEN_COMP_CLANG // workaround clang bug (see http://forum.kde.org/viewtopic.php?f=74&t=102653) +#elif EIGEN_COMP_CLANG // workaround clang bug (see xxxp://forum.kde.org/viewtopic.php?f=74&t=102653) #define EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \ using Base::operator =; \ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const Derived& other) { Base::operator=(other); return *this; } \ diff --git a/eigenlib/Eigen/src/Core/util/Memory.h b/eigenlib/Eigen/src/Core/util/Memory.h index 3cc0f9bec..9368e97ce 100644 --- a/eigenlib/Eigen/src/Core/util/Memory.h +++ b/eigenlib/Eigen/src/Core/util/Memory.h @@ -25,10 +25,10 @@ // Try to determine automatically if malloc is already aligned. // On 64-bit systems, glibc's malloc returns 16-byte-aligned pointers, see: -// http://www.gnu.org/s/libc/manual/html_node/Aligned-Memory-Blocks.html +// xxxp://www.gnu.org/s/libc/manual/html_node/Aligned-Memory-Blocks.html // This is true at least since glibc 2.8. // This leaves the question how to detect 64-bit. According to this document, -// http://gcc.fyxm.net/summit/2003/Porting%20to%2064%20bit.pdf +// xxxp://gcc.fyxm.net/summit/2003/Porting%20to%2064%20bit.pdf // page 114, "[The] LP64 model [...] is used by all 64-bit UNIX ports" so it's indeed // quite safe, at least within the context of glibc, to equate 64-bit with LP64. #if defined(__GLIBC__) && ((__GLIBC__>=2 && __GLIBC_MINOR__ >= 8) || __GLIBC__>2) \ @@ -39,9 +39,9 @@ #endif // FreeBSD 6 seems to have 16-byte aligned malloc -// See http://svn.freebsd.org/viewvc/base/stable/6/lib/libc/stdlib/malloc.c?view=markup +// See xxxp://svn.freebsd.org/viewvc/base/stable/6/lib/libc/stdlib/malloc.c?view=markup // FreeBSD 7 seems to have 16-byte aligned malloc except on ARM and MIPS architectures -// See http://svn.freebsd.org/viewvc/base/stable/7/lib/libc/stdlib/malloc.c?view=markup +// See xxxp://svn.freebsd.org/viewvc/base/stable/7/lib/libc/stdlib/malloc.c?view=markup #if defined(__FreeBSD__) && !(EIGEN_ARCH_ARM || EIGEN_ARCH_MIPS) && (EIGEN_DEFAULT_ALIGN_BYTES == 16) #define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 1 #else @@ -749,7 +749,7 @@ class aligned_allocator : public std::allocator internal::check_size_for_overflow(num); size_type size = num * sizeof(T); #if EIGEN_COMP_GNUC_STRICT && EIGEN_GNUC_AT_LEAST(7,0) - // workaround gcc bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87544 + // workaround gcc bug xxxps://gcc.gnu.org/bugzilla/show_bug.cgi?id=87544 // It triggered eigen/Eigen/src/Core/util/Memory.h:189:12: warning: argument 1 value '18446744073709551612' exceeds maximum object size 9223372036854775807 if(size>=std::size_t((std::numeric_limits::max)())) return 0; diff --git a/eigenlib/Eigen/src/Eigenvalues/ComplexSchur.h b/eigenlib/Eigen/src/Eigenvalues/ComplexSchur.h index dba70e5c1..baefac7e9 100644 --- a/eigenlib/Eigen/src/Eigenvalues/ComplexSchur.h +++ b/eigenlib/Eigen/src/Eigenvalues/ComplexSchur.h @@ -283,7 +283,7 @@ typename ComplexSchur::ComplexScalar ComplexSchur::compu using std::abs; if (iter == 10 || iter == 20) { - // exceptional shift, taken from http://www.netlib.org/eispack/comqr.f + // exceptional shift, taken from xxxp://www.netlib.org/eispack/comqr.f return abs(numext::real(m_matT.coeff(iu,iu-1))) + abs(numext::real(m_matT.coeff(iu-1,iu-2))); } diff --git a/eigenlib/Eigen/src/Eigenvalues/EigenSolver.h b/eigenlib/Eigen/src/Eigenvalues/EigenSolver.h index aec9b7da1..141b6ae9f 100644 --- a/eigenlib/Eigen/src/Eigenvalues/EigenSolver.h +++ b/eigenlib/Eigen/src/Eigenvalues/EigenSolver.h @@ -56,7 +56,7 @@ namespace Eigen { * example of the typical use of this class. * * \note The implementation is adapted from - * JAMA (public domain). + * JAMA (public domain). * Their code is based on EISPACK. * * \sa MatrixBase::eigenvalues(), class ComplexEigenSolver, class SelfAdjointEigenSolver diff --git a/eigenlib/Eigen/src/Eigenvalues/RealSchur.h b/eigenlib/Eigen/src/Eigenvalues/RealSchur.h index ec1375f53..3d96b6bd5 100644 --- a/eigenlib/Eigen/src/Eigenvalues/RealSchur.h +++ b/eigenlib/Eigen/src/Eigenvalues/RealSchur.h @@ -46,7 +46,7 @@ namespace Eigen { * of the typical use of this class. * * \note The implementation is adapted from - * JAMA (public domain). + * JAMA (public domain). * Their code is based on EISPACK. * * \sa class ComplexSchur, class EigenSolver, class ComplexEigenSolver diff --git a/eigenlib/Eigen/src/Geometry/OrthoMethods.h b/eigenlib/Eigen/src/Geometry/OrthoMethods.h index 42cc46ae5..6ef333144 100644 --- a/eigenlib/Eigen/src/Geometry/OrthoMethods.h +++ b/eigenlib/Eigen/src/Geometry/OrthoMethods.h @@ -17,7 +17,7 @@ namespace Eigen { * * \returns the cross product of \c *this and \a other * - * Here is a very good explanation of cross-product: http://xkcd.com/199/ + * Here is a very good explanation of cross-product: xxxp://xkcd.com/199/ * * With complex numbers, the cross product is implemented as * \f$ (\mathbf{a}+i\mathbf{b}) \times (\mathbf{c}+i\mathbf{d}) = (\mathbf{a} \times \mathbf{c} - \mathbf{b} \times \mathbf{d}) - i(\mathbf{a} \times \mathbf{d} - \mathbf{b} \times \mathbf{c})\f$ diff --git a/eigenlib/Eigen/src/Geometry/Quaternion.h b/eigenlib/Eigen/src/Geometry/Quaternion.h index 025328c7f..503ed3227 100644 --- a/eigenlib/Eigen/src/Geometry/Quaternion.h +++ b/eigenlib/Eigen/src/Geometry/Quaternion.h @@ -635,7 +635,7 @@ EIGEN_DEVICE_FUNC inline Derived& QuaternionBase::setFromTwoVectors(con /** \returns a random unit quaternion following a uniform distribution law on SO(3) * - * \note The implementation is based on http://planning.cs.uiuc.edu/node198.html + * \note The implementation is based on xxxp://planning.cs.uiuc.edu/node198.html */ template EIGEN_DEVICE_FUNC Quaternion Quaternion::UnitRandom() @@ -736,7 +736,7 @@ QuaternionBase::angularDistance(const QuaternionBase& oth * \c *this and \a other at the parameter \a t in [0;1]. * * This represents an interpolation for a constant motion between \c *this and \a other, - * see also http://en.wikipedia.org/wiki/Slerp. + * see also xxxp://en.wikipedia.org/wiki/Slerp. */ template template diff --git a/eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h b/eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h index 4caab13e3..57651e583 100644 --- a/eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +++ b/eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h @@ -190,7 +190,7 @@ class IncompleteCholesky : public SparseSolverBase template void IncompleteCholesky::factorize(const _MatrixType& mat) diff --git a/eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h b/eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h index a86f4d419..56aa1db44 100644 --- a/eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +++ b/eigenlib/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h @@ -88,12 +88,12 @@ Index QuickSplit(VectorV &row, VectorI &ind, Index ncut) * NOTE : The following implementation is derived from the ILUT implementation * in the SPARSKIT package, Copyright (C) 2005, the Regents of the University of Minnesota * released under the terms of the GNU LGPL: - * http://www-users.cs.umn.edu/~saad/software/SPARSKIT/README + * xxxp://www-users.cs.umn.edu/~saad/software/SPARSKIT/README * However, Yousef Saad gave us permission to relicense his ILUT code to MPL2. * See the Eigen mailing list archive, thread: ILUT, date: July 8, 2012: - * http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2012/07/msg00064.html + * xxxp://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2012/07/msg00064.html * alternatively, on GMANE: - * http://comments.gmane.org/gmane.comp.lib.eigen/3302 + * xxxp://comments.gmane.org/gmane.comp.lib.eigen/3302 */ template class IncompleteLUT : public SparseSolverBase > diff --git a/eigenlib/Eigen/src/LU/arch/Inverse_SSE.h b/eigenlib/Eigen/src/LU/arch/Inverse_SSE.h index 89227a2a1..11f4018c8 100644 --- a/eigenlib/Eigen/src/LU/arch/Inverse_SSE.h +++ b/eigenlib/Eigen/src/LU/arch/Inverse_SSE.h @@ -11,7 +11,7 @@ // The SSE code for the 4x4 float and double matrix inverse in this file // comes from the following Intel's library: -// http://software.intel.com/en-us/articles/optimized-matrix-library-for-use-with-the-intel-pentiumr-4-processors-sse2-instructions/ +// xxxp://software.intel.com/en-us/articles/optimized-matrix-library-for-use-with-the-intel-pentiumr-4-processors-sse2-instructions/ // // Here is the respective copyright and license statement: // diff --git a/eigenlib/Eigen/src/OrderingMethods/Amd.h b/eigenlib/Eigen/src/OrderingMethods/Amd.h index f91ecb24e..208e8e5b2 100644 --- a/eigenlib/Eigen/src/OrderingMethods/Amd.h +++ b/eigenlib/Eigen/src/OrderingMethods/Amd.h @@ -8,7 +8,7 @@ NOTE: this routine has been adapted from the CSparse library: Copyright (c) 2006, Timothy A. Davis. -http://www.suitesparse.com +xxxp://www.suitesparse.com CSparse is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/eigenlib/Eigen/src/OrderingMethods/Eigen_Colamd.h b/eigenlib/Eigen/src/OrderingMethods/Eigen_Colamd.h index 19c87d021..50cd9dcc0 100644 --- a/eigenlib/Eigen/src/OrderingMethods/Eigen_Colamd.h +++ b/eigenlib/Eigen/src/OrderingMethods/Eigen_Colamd.h @@ -41,7 +41,7 @@ // // The colamd/symamd library is available at // -// http://www.suitesparse.com +// xxxp://www.suitesparse.com #ifndef EIGEN_COLAMD_H diff --git a/eigenlib/Eigen/src/QR/ColPivHouseholderQR.h b/eigenlib/Eigen/src/QR/ColPivHouseholderQR.h index 1c0e43604..b6b39f363 100644 --- a/eigenlib/Eigen/src/QR/ColPivHouseholderQR.h +++ b/eigenlib/Eigen/src/QR/ColPivHouseholderQR.h @@ -550,9 +550,9 @@ void ColPivHouseholderQR::computeInPlace() // update our table of norms of the columns for (Index j = k + 1; j < cols; ++j) { // The following implements the stable norm downgrade step discussed in - // http://www.netlib.org/lapack/lawnspdf/lawn176.pdf + // xxxp://www.netlib.org/lapack/lawnspdf/lawn176.pdf // and used in LAPACK routines xGEQPF and xGEQP3. - // See lines 278-297 in http://www.netlib.org/lapack/explore-html/dc/df4/sgeqpf_8f_source.html + // See lines 278-297 in xxxp://www.netlib.org/lapack/explore-html/dc/df4/sgeqpf_8f_source.html if (m_colNormsUpdated.coeffRef(j) != RealScalar(0)) { RealScalar temp = abs(m_qr.coeffRef(k, j)) / m_colNormsUpdated.coeffRef(j); temp = (RealScalar(1) + temp) * (RealScalar(1) - temp); diff --git a/eigenlib/Eigen/src/SVD/BDCSVD.h b/eigenlib/Eigen/src/SVD/BDCSVD.h index 82fdccc57..d451f61fa 100644 --- a/eigenlib/Eigen/src/SVD/BDCSVD.h +++ b/eigenlib/Eigen/src/SVD/BDCSVD.h @@ -566,7 +566,7 @@ void BDCSVD::divide (Index firstCol, Index lastCol, Index firstRowW, // // TODO Opportunities for optimization: better root finding algo, better stopping criterion, better // handling of round-off errors, be consistent in ordering -// For instance, to solve the secular equation using FMM, see http://www.stat.uchicago.edu/~lekheng/courses/302/classics/greengard-rokhlin.pdf +// For instance, to solve the secular equation using FMM, see xxxp://www.stat.uchicago.edu/~lekheng/courses/302/classics/greengard-rokhlin.pdf template void BDCSVD::computeSVDofM(Index firstCol, Index n, MatrixXr& U, VectorType& singVals, MatrixXr& V) { diff --git a/eigenlib/Eigen/src/SparseCore/MappedSparseMatrix.h b/eigenlib/Eigen/src/SparseCore/MappedSparseMatrix.h index 70bd1f2f7..c6a0f2af9 100644 --- a/eigenlib/Eigen/src/SparseCore/MappedSparseMatrix.h +++ b/eigenlib/Eigen/src/SparseCore/MappedSparseMatrix.h @@ -19,7 +19,7 @@ namespace Eigen { * * \param _Scalar the scalar type, i.e. the type of the coefficients * - * See http://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme. + * See xxxp://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme. * */ namespace internal { diff --git a/eigenlib/Eigen/src/SparseCore/SparseVector.h b/eigenlib/Eigen/src/SparseCore/SparseVector.h index f48aed456..35c70092e 100644 --- a/eigenlib/Eigen/src/SparseCore/SparseVector.h +++ b/eigenlib/Eigen/src/SparseCore/SparseVector.h @@ -19,7 +19,7 @@ namespace Eigen { * * \tparam _Scalar the scalar type, i.e. the type of the coefficients * - * See http://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme. + * See xxxp://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme. * * This class can be extended with the help of the plugin mechanism described on the page * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_SPARSEVECTOR_PLUGIN. diff --git a/eigenlib/Eigen/src/SparseLU/SparseLU.h b/eigenlib/Eigen/src/SparseLU/SparseLU.h index 754974cf4..7b921fbd8 100644 --- a/eigenlib/Eigen/src/SparseLU/SparseLU.h +++ b/eigenlib/Eigen/src/SparseLU/SparseLU.h @@ -25,7 +25,7 @@ template struct SparseLUMatrixURetu * * This class implements the supernodal LU factorization for general matrices. * It uses the main techniques from the sequential SuperLU package - * (http://crd-legacy.lbl.gov/~xiaoye/SuperLU/). It handles transparently real + * (xxxp://crd-legacy.lbl.gov/~xiaoye/SuperLU/). It handles transparently real * and complex arithmetics with single and double precision, depending on the * scalar type of your input matrix. * The code has been optimized to provide BLAS-3 operations during supernode-panel updates. From 70ac3d8248c8c51816fdd736566e2bb9af91407f Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 19 Oct 2021 11:57:02 +0200 Subject: [PATCH 33/56] remove memset from align_pair.h and marching_cubes.h --- vcg/complex/algorithms/align_pair.h | 27 +++++++++---------- .../algorithms/create/marching_cubes.h | 6 +++-- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/vcg/complex/algorithms/align_pair.h b/vcg/complex/algorithms/align_pair.h index 284e5ac0a..6b71a2356 100644 --- a/vcg/complex/algorithms/align_pair.h +++ b/vcg/complex/algorithms/align_pair.h @@ -128,22 +128,21 @@ class AlignPair { public: IterInfo() { - memset ( (void *) this, 0, sizeof(IterInfo)); } - double MinDistAbs; - int DistanceDiscarded; - int AngleDiscarded; - int BorderDiscarded; - int SampleTested; // how many points have been tested - int SampleUsed; // how many points have been actually used to compute the transformation - double pcl50; - double pclhi; - double AVG; - double RMS; - double StdDev; - int Time; // Ending time of this iteration - + double MinDistAbs = 0; + int DistanceDiscarded = 0; + int AngleDiscarded = 0; + int BorderDiscarded = 0; + int SampleTested = 0; // how many points have been tested + // how many points have been actually used to compute the transformation + int SampleUsed = 0; + double pcl50 = 0; + double pclhi = 0; + double AVG = 0; + double RMS = 0; + double StdDev = 0; + int Time = 0; // Ending time of this iteration }; std::vector I; diff --git a/vcg/complex/algorithms/create/marching_cubes.h b/vcg/complex/algorithms/create/marching_cubes.h index 830e0e1d8..43e31cba6 100644 --- a/vcg/complex/algorithms/create/marching_cubes.h +++ b/vcg/complex/algorithms/create/marching_cubes.h @@ -26,6 +26,7 @@ #define __VCG_MARCHING_CUBES #include "mc_lookup_table.h" +#include namespace vcg { @@ -665,14 +666,15 @@ namespace vcg VertexPointer vp = NULL; size_t face_idx = _mesh->face.size(); size_t v12_idx = -1; - size_t vertices_idx[3]; + std::array vertices_idx; if (v12 != NULL) v12_idx = v12 - &_mesh->vert[0]; AllocatorType::AddFaces(*_mesh, (int) n); for (int trig=0; trig<3*n; face_idx++ ) { vp = NULL; - memset(vertices_idx, -1, 3*sizeof(size_t)); + vertices_idx.fill(-1); + //memset(vertices_idx, -1, 3*sizeof(size_t)); for (int vert=0; vert<3; vert++, trig++) //ok { From 5e17997b37dc8075f9c6ef68efcc6ba5d4032b57 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 19 Oct 2021 12:14:31 +0200 Subject: [PATCH 34/56] remove memset from meshtree.h --- vcg/complex/algorithms/meshtree.h | 388 +++++++++++++++++------------- 1 file changed, 215 insertions(+), 173 deletions(-) diff --git a/vcg/complex/algorithms/meshtree.h b/vcg/complex/algorithms/meshtree.h index 13d0d3a98..de9f12a89 100644 --- a/vcg/complex/algorithms/meshtree.h +++ b/vcg/complex/algorithms/meshtree.h @@ -125,189 +125,231 @@ namespace vcg { return count; } - void Process(vcg::AlignPair::Param &ap, MeshTree::Param &mtp) { - - char buf[1024]; - std::sprintf(buf, "Starting Processing of %i glued meshes out of %zu meshes\n", gluedNum(), nodeMap.size()); - cb(0, buf); - - /******* Occupancy Grid Computation *************/ - std::memset(buf, '\0', 1024); - std::sprintf(buf, "Computing Overlaps %i glued meshes...\n", gluedNum()); - cb(0, buf); - - OG.Init(static_cast(nodeMap.size()), vcg::Box3::Construct(gluedBBox()), mtp.OGSize); - - for (auto& ni : nodeMap) { - MeshTree::MeshNode *mn = ni.second; - if (mn->glued) { - OG.AddMesh(mn->m->cm, vcg::Matrix44::Construct(mn->tr()), mn->Id()); - } - } - - OG.Compute(); - OG.Dump(stdout); - // Note: the s and t of the OG translate into fix and mov, respectively. - - /*************** The long loop of arc computing **************/ - - // count existing arcs within current error threshold - float percentileThr = 0; - if (!resultList.empty()) { - - vcg::Distribution H; - for (auto& li : resultList) { - H.Add(li.err); - } - - percentileThr = H.Percentile(1.0f - mtp.recalcThreshold); - } - - std::size_t totalArcNum = 0; - int preservedArcNum = 0, recalcArcNum = 0; - - while(totalArcNum < OG.SVA.size() && OG.SVA[totalArcNum].norm_area > mtp.arcThreshold) - { - AlignPair::Result *curResult = findResult(OG.SVA[totalArcNum].s, OG.SVA[totalArcNum].t); - if (curResult) { - if (curResult->err < percentileThr) { - ++preservedArcNum; - } - else { - ++recalcArcNum; - } - } - else { - resultList.push_back(AlignPair::Result()); - resultList.back().FixName = OG.SVA[totalArcNum].s; - resultList.back().MovName = OG.SVA[totalArcNum].t; - resultList.back().err = std::numeric_limits::max(); - } - ++totalArcNum; - } - - //if there are no arcs at all complain and return - if (totalArcNum == 0) { - std::memset(buf, '\0', 1024); - std::sprintf(buf, "\n Failure. There are no overlapping meshes?\n No candidate alignment arcs. Nothing Done.\n"); - cb(0, buf); - return; - } - - int num_max_thread = 1; + void Process(vcg::AlignPair::Param& ap, MeshTree::Param& mtp) + { + std::array buf; + std::sprintf( + buf.data(), + "Starting Processing of %i glued meshes out of %zu meshes\n", + gluedNum(), + nodeMap.size()); + cb(0, buf.data()); + + /******* Occupancy Grid Computation *************/ + buf.fill('\0'); + std::sprintf(buf.data(), "Computing Overlaps %i glued meshes...\n", gluedNum()); + cb(0, buf.data()); + + OG.Init( + static_cast(nodeMap.size()), + vcg::Box3::Construct(gluedBBox()), + mtp.OGSize); + + for (auto& ni : nodeMap) { + MeshTree::MeshNode* mn = ni.second; + if (mn->glued) { + OG.AddMesh(mn->m->cm, vcg::Matrix44::Construct(mn->tr()), mn->Id()); + } + } + + OG.Compute(); + OG.Dump(stdout); + // Note: the s and t of the OG translate into fix and mov, respectively. + + /*************** The long loop of arc computing **************/ + + // count existing arcs within current error threshold + float percentileThr = 0; + if (!resultList.empty()) { + vcg::Distribution H; + for (auto& li : resultList) { + H.Add(li.err); + } + + percentileThr = H.Percentile(1.0f - mtp.recalcThreshold); + } + + std::size_t totalArcNum = 0; + int preservedArcNum = 0, recalcArcNum = 0; + + while (totalArcNum < OG.SVA.size() && + OG.SVA[totalArcNum].norm_area > mtp.arcThreshold) { + AlignPair::Result* curResult = + findResult(OG.SVA[totalArcNum].s, OG.SVA[totalArcNum].t); + if (curResult) { + if (curResult->err < percentileThr) { + ++preservedArcNum; + } + else { + ++recalcArcNum; + } + } + else { + resultList.push_back(AlignPair::Result()); + resultList.back().FixName = OG.SVA[totalArcNum].s; + resultList.back().MovName = OG.SVA[totalArcNum].t; + resultList.back().err = std::numeric_limits::max(); + } + ++totalArcNum; + } + + // if there are no arcs at all complain and return + if (totalArcNum == 0) { + buf.fill('\0'); + std::sprintf( + buf.data(), + "\n Failure. There are no overlapping meshes?\n No candidate alignment arcs. " + "Nothing Done.\n"); + cb(0, buf.data()); + return; + } + + int num_max_thread = 1; #ifdef _OPENMP - if (totalArcNum > 32) num_max_thread = omp_get_max_threads(); + if (totalArcNum > 32) + num_max_thread = omp_get_max_threads(); #endif - std::memset(buf, '\0', 1024); - std::sprintf(buf, "Arc with good overlap %6zu (on %6zu)\n", totalArcNum, OG.SVA.size()); - cb(0, buf); + buf.fill('\0'); + std::sprintf( + buf.data(), "Arc with good overlap %6zu (on %6zu)\n", totalArcNum, OG.SVA.size()); + cb(0, buf.data()); - std::memset(buf, '\0', 1024); - std::sprintf(buf, " %6i preserved %i Recalc \n", preservedArcNum, recalcArcNum); - cb(0, buf); + buf.fill('\0'); + std::sprintf(buf.data(), " %6i preserved %i Recalc \n", preservedArcNum, recalcArcNum); + cb(0, buf.data()); - bool hasValidAlign = false; + bool hasValidAlign = false; #pragma omp parallel for schedule(dynamic, 1) num_threads(num_max_thread) - // on windows, omp does not support unsigned types for indices on cycles - for (int i = 0 ;i < static_cast(totalArcNum); ++i) { - - std::fprintf(stdout,"%4i -> %4i Area:%5i NormArea:%5.3f\n",OG.SVA[i].s,OG.SVA[i].t,OG.SVA[i].area,OG.SVA[i].norm_area); - AlignPair::Result *curResult = findResult(OG.SVA[i].s,OG.SVA[i].t); - - // // missing arc and arc with great error must be recomputed. - if (curResult->err >= percentileThr) { - - ProcessArc(OG.SVA[i].s, OG.SVA[i].t, *curResult, ap); - curResult->area = OG.SVA[i].norm_area; - - if (curResult->isValid()) { - hasValidAlign = true; - std::pair dd = curResult->computeAvgErr(); + // on windows, omp does not support unsigned types for indices on cycles + for (int i = 0; i < static_cast(totalArcNum); ++i) { + std::fprintf( + stdout, + "%4i -> %4i Area:%5i NormArea:%5.3f\n", + OG.SVA[i].s, + OG.SVA[i].t, + OG.SVA[i].area, + OG.SVA[i].norm_area); + AlignPair::Result* curResult = findResult(OG.SVA[i].s, OG.SVA[i].t); + + // // missing arc and arc with great error must be recomputed. + if (curResult->err >= percentileThr) { + ProcessArc(OG.SVA[i].s, OG.SVA[i].t, *curResult, ap); + curResult->area = OG.SVA[i].norm_area; + + if (curResult->isValid()) { + hasValidAlign = true; + std::pair dd = curResult->computeAvgErr(); #pragma omp critical - std::memset(buf, '\0', 1024); - std::sprintf(buf, "(%3i/%3zu) %2i -> %2i Aligned AvgErr dd=%f -> dd=%f \n", i+1,totalArcNum,OG.SVA[i].s,OG.SVA[i].t,dd.first,dd.second); - cb(0, buf); - } - else { + buf.fill('\0'); + std::sprintf( + buf.data(), + "(%3i/%3zu) %2i -> %2i Aligned AvgErr dd=%f -> dd=%f \n", + i + 1, + totalArcNum, + OG.SVA[i].s, + OG.SVA[i].t, + dd.first, + dd.second); + cb(0, buf.data()); + } + else { #pragma omp critical - std::memset(buf, '\0', 1024); - std::sprintf(buf, "(%3i/%3zu) %2i -> %2i Failed Alignment of one arc %s\n",i+1,totalArcNum,OG.SVA[i].s,OG.SVA[i].t,vcg::AlignPair::errorMsg(curResult->status)); - cb(0, buf); - } - } - } - - //if there are no valid arcs complain and return - if (!hasValidAlign) { - std::memset(buf, '\0', 1024); - std::sprintf(buf, "\n Failure. No successful arc among candidate Alignment arcs. Nothing Done.\n"); - cb(0, buf); - return; - } - - vcg::Distribution H; // stat for printing - for (auto& li : resultList) { - if (li.isValid()) H.Add(li.err); - } - - std::memset(buf, '\0', 1024); - std::sprintf(buf, "Completed Mesh-Mesh Alignment: Avg Err %5.3f; Median %5.3f; 90%% %5.3f\n", H.Avg(), H.Percentile(0.5f), H.Percentile(0.9f)); - cb(0, buf); - - ProcessGlobal(ap); - } - - void ProcessGlobal(vcg::AlignPair::Param &ap) { - - char buff[1024]; - std::memset(buff, '\0', 1024); - - /************** Preparing Matrices for global alignment *************/ - std::vector GluedIdVec; - std::vector GluedTrVec; - - std::map names; - - for (auto& ni : nodeMap) { - - MeshTree::MeshNode *mn = ni.second; - if (mn->glued) { - GluedIdVec.push_back(mn->Id()); - GluedTrVec.push_back(vcg::Matrix44d::Construct(mn->tr())); - names[mn->Id()] = qUtf8Printable(mn->m->label()); - } - } - - vcg::AlignGlobal AG; - std::vector ResVecPtr; - for (auto& li : resultList) { - if (li.isValid()) { - ResVecPtr.push_back(&li); - } - } - - AG.BuildGraph(ResVecPtr, GluedTrVec, GluedIdVec); - - float StartGlobErr = 0.001f; - while (!AG.GlobalAlign(names, StartGlobErr, 100, ap.MatchMode == vcg::AlignPair::Param::MMRigid, stdout, cb)) { - StartGlobErr *= 2; - AG.BuildGraph(ResVecPtr,GluedTrVec, GluedIdVec); - } - - std::vector GluedTrVecOut(GluedTrVec.size()); - AG.GetMatrixVector(GluedTrVecOut,GluedIdVec); - - // Now get back the results! - for (std::size_t ii = 0; ii < GluedTrVecOut.size(); ++ii) { - MM(GluedIdVec[ii])->cm.Tr.Import(GluedTrVecOut[ii]); - } - - std::sprintf(buff, "Completed Global Alignment (error bound %6.4f)\n", StartGlobErr); - cb(0, buff); - } + buf.fill('\0'); + std::sprintf( + buf.data(), + "(%3i/%3zu) %2i -> %2i Failed Alignment of one arc %s\n", + i + 1, + totalArcNum, + OG.SVA[i].s, + OG.SVA[i].t, + vcg::AlignPair::errorMsg(curResult->status)); + cb(0, buf.data()); + } + } + } + + // if there are no valid arcs complain and return + if (!hasValidAlign) { + buf.fill('\0'); + std::sprintf( + buf.data(), + "\n Failure. No successful arc among candidate Alignment arcs. Nothing " + "Done.\n"); + cb(0, buf.data()); + return; + } + + vcg::Distribution H; // stat for printing + for (auto& li : resultList) { + if (li.isValid()) + H.Add(li.err); + } + + buf.fill('\0'); + std::sprintf( + buf.data(), + "Completed Mesh-Mesh Alignment: Avg Err %5.3f; Median %5.3f; 90%% %5.3f\n", + H.Avg(), + H.Percentile(0.5f), + H.Percentile(0.9f)); + cb(0, buf.data()); + + ProcessGlobal(ap); + } + + void ProcessGlobal(vcg::AlignPair::Param& ap) + { + /************** Preparing Matrices for global alignment *************/ + std::vector GluedIdVec; + std::vector GluedTrVec; + + std::map names; + + for (auto& ni : nodeMap) { + MeshTree::MeshNode* mn = ni.second; + if (mn->glued) { + GluedIdVec.push_back(mn->Id()); + GluedTrVec.push_back(vcg::Matrix44d::Construct(mn->tr())); + names[mn->Id()] = qUtf8Printable(mn->m->label()); + } + } + + vcg::AlignGlobal AG; + std::vector ResVecPtr; + for (auto& li : resultList) { + if (li.isValid()) { + ResVecPtr.push_back(&li); + } + } + + AG.BuildGraph(ResVecPtr, GluedTrVec, GluedIdVec); + + float StartGlobErr = 0.001f; + while (!AG.GlobalAlign( + names, + StartGlobErr, + 100, + ap.MatchMode == vcg::AlignPair::Param::MMRigid, + stdout, + cb)) { + StartGlobErr *= 2; + AG.BuildGraph(ResVecPtr, GluedTrVec, GluedIdVec); + } + + std::vector GluedTrVecOut(GluedTrVec.size()); + AG.GetMatrixVector(GluedTrVecOut, GluedIdVec); + + // Now get back the results! + for (std::size_t ii = 0; ii < GluedTrVecOut.size(); ++ii) { + MM(GluedIdVec[ii])->cm.Tr.Import(GluedTrVecOut[ii]); + } + std::string str = + "Completed Global Alignment (error bound " + std::to_string(StartGlobErr) + ")\n"; + cb(0, str.c_str()); + } void ProcessArc(int fixId, int movId, vcg::AlignPair::Result &result, vcg::AlignPair::Param ap) { From da77800d0214c9c78ef9f71abe7ce43b42cd9dc3 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 19 Oct 2021 12:45:05 +0200 Subject: [PATCH 35/56] remove memset from simple_temporary_data and matrix44, remove old_matrix --- CMakeLists.txt | 5 - .../algorithms/create/marching_cubes.h | 1 - vcg/container/simple_temporary_data.h | 23 +- vcg/math/matrix44.h | 16 +- vcg/math/old_deprecated_matrix.h | 786 ------------------ vcg/math/old_lin_algebra.h | 634 -------------- vcg/math/old_matrix.h | 184 ---- vcg/math/old_matrix33.h | 298 ------- vcg/math/old_matrix44.h | 493 ----------- 9 files changed, 21 insertions(+), 2419 deletions(-) delete mode 100644 vcg/math/old_deprecated_matrix.h delete mode 100644 vcg/math/old_lin_algebra.h delete mode 100644 vcg/math/old_matrix.h delete mode 100644 vcg/math/old_matrix33.h delete mode 100644 vcg/math/old_matrix44.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a4f6c76d4..e48b68163 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -232,18 +232,13 @@ set(VCG_HEADERS vcg/math/linear.h vcg/math/matrix44.h vcg/math/eigen.h - vcg/math/old_lin_algebra.h vcg/math/similarity2.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/base.h vcg/math/histogram.h vcg/math/legendre.h vcg/math/matrix33.h - vcg/math/old_matrix.h vcg/simplex/edge/distance.h vcg/simplex/edge/topology.h vcg/simplex/edge/pos.h diff --git a/vcg/complex/algorithms/create/marching_cubes.h b/vcg/complex/algorithms/create/marching_cubes.h index 43e31cba6..cbc8f5ddd 100644 --- a/vcg/complex/algorithms/create/marching_cubes.h +++ b/vcg/complex/algorithms/create/marching_cubes.h @@ -674,7 +674,6 @@ namespace vcg { vp = NULL; vertices_idx.fill(-1); - //memset(vertices_idx, -1, 3*sizeof(size_t)); for (int vert=0; vert<3; vert++, trig++) //ok { diff --git a/vcg/container/simple_temporary_data.h b/vcg/container/simple_temporary_data.h index 9b175faf2..13db925e7 100644 --- a/vcg/container/simple_temporary_data.h +++ b/vcg/container/simple_temporary_data.h @@ -79,17 +79,18 @@ class VectorNBW datareserve = sz; } - void resize(size_t sz) - { - int oldDatasize = datasize; - if ((int)sz <= oldDatasize) - return; - if (sz > datareserve) - reserve(sz); - datasize = sz; - memset(&booldata[oldDatasize], 0, datasize - oldDatasize); - } - void push_back(const bool &v) + void resize(size_t sz) + { + int oldDatasize = datasize; + if ((int) sz <= oldDatasize) + return; + if (sz > datareserve) + reserve(sz); + datasize = sz; + for (unsigned int i = oldDatasize; i < datasize; ++i) + booldata[i] = false; + } + void push_back(const bool &v) { resize(datasize + 1); booldata[datasize] = v; diff --git a/vcg/math/matrix44.h b/vcg/math/matrix44.h index 11d228d99..bd9d3a699 100644 --- a/vcg/math/matrix44.h +++ b/vcg/math/matrix44.h @@ -73,7 +73,7 @@ for 'column' vectors. */ template class Matrix44 { protected: - T _a[16]; + std::array _a; public: typedef T ScalarType; @@ -258,7 +258,9 @@ typedef Matrix44 Matrix44d; //} template Matrix44::Matrix44(const T v[]) { - memcpy((T *)_a, v, 16 * sizeof(T)); +// memcpy((T *)_a, v, 16 * sizeof(T)); + for (unsigned int i = 0; i < 16; ++i) + _a[i] = v[i]; } template T &Matrix44::ElementAt(const int row, const int col) { @@ -284,15 +286,15 @@ template T Matrix44::ElementAt(const int row, const int col) const //} template T *Matrix44::operator[](const int i) { assert(i >= 0 && i < 4); - return _a+i*4; + return &_a[i*4]; } template const T *Matrix44::operator[](const int i) const { assert(i >= 0 && i < 4); - return _a+i*4; + return &_a[i*4]; } -template T *Matrix44::V() { return _a;} -template const T *Matrix44::V() const { return _a;} +template T *Matrix44::V() { return _a.data();} +template const T *Matrix44::V() const { return _a.data();} template Matrix44 Matrix44::operator+(const Matrix44 &m) const { @@ -421,7 +423,7 @@ void Matrix44::FromEulerAngles(T alpha, T beta, T gamma) } template void Matrix44::SetZero() { - memset((T *)_a, 0, 16 * sizeof(T)); + _a.fill(0); } template void Matrix44::SetIdentity() { diff --git a/vcg/math/old_deprecated_matrix.h b/vcg/math/old_deprecated_matrix.h deleted file mode 100644 index b0f232e10..000000000 --- a/vcg/math/old_deprecated_matrix.h +++ /dev/null @@ -1,786 +0,0 @@ -/**************************************************************************** -* VCGLib o o * -* Visual and Computer Graphics Library o o * -* _ O _ * -* Copyright(C) 2004-2016 \/)\/ * -* Visual Computing Lab /\/| * -* ISTI - Italian National Research Council | * -* \ * -* All rights reserved. * -* * -* This program is free software; you can redistribute it and/or modify * -* it under the terms of the GNU General Public License as published by * -* the Free Software Foundation; either version 2 of the License, or * -* (at your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * -* for more details. * -* * -****************************************************************************/ -/*************************************************************************** -$Log: not supported by cvs2svn $ -Revision 1.9 2006/09/11 16:11:39 marfr960 -Added const to declarations of the overloaded (operators *). -Otherwise the * operator would always attempt to convert any type of data passed as an argument to Point3 - -Revision 1.8 2006/08/23 15:24:45 marfr960 -Copy constructor : faster memcpy instead of slow 'for' cycle -empty constructor - -Revision 1.7 2006/04/29 10:26:04 fiorin -Added some utility methods (swapping of columns and rows, matrix-vector multiplication) - -Revision 1.6 2006/04/11 08:09:35 zifnab1974 -changes necessary for gcc 3.4.5 on linux 64bit. Please take note of case-sensitivity of filenames - -Revision 1.5 2005/12/12 11:25:00 ganovelli -added diagonal matrix, outer produce and namespace - -***************************************************************************/ - -#ifndef MATRIX_VCGLIB -#define MATRIX_VCGLIB - -#include -#include -#include -#include -#include -#include - -namespace vcg{ - namespace ndim{ - - /** \addtogroup math */ - /* @{ */ - - /*! - * This class represent a diagonal m�m matrix. - */ - - class MatrixDiagBase{public: - virtual const int & Dimension()const =0; - virtual float operator[](const int & i)const = 0; - }; - template - class MatrixDiag: public Point, public MatrixDiagBase{ - public: - const int & Dimension() const {return N;} - MatrixDiag(const Point&p):Point(p){} - }; - -/*! - * This class represent a generic m�n matrix. The class is templated over the scalar type field. - * @param TYPE (Templete Parameter) Specifies the ScalarType field. - */ - template - class Matrix - { - - public: - typedef TYPE ScalarType; - - /*! - * Default constructor - * All the elements are initialized to zero. - * \param m the number of matrix rows - * \param n the number of matrix columns - */ - Matrix(unsigned int m, unsigned int n) - { - _rows = m; - _columns = n; - _data = new ScalarType[m*n]; - memset(_data, 0, m*n*sizeof(ScalarType)); - }; - - /*! - * Constructor - * The matrix elements are initialized with the values of the elements in \i values. - * \param m the number of matrix rows - * \param n the number of matrix columns - * \param values the values of the matrix elements - */ - Matrix(unsigned int m, unsigned int n, TYPE *values) - { - _rows = m; - _columns = n; - unsigned int dim = m*n; - _data = new ScalarType[dim]; - memcpy(_data, values, dim*sizeof(ScalarType)); - //unsigned int i; - //for (i=0; i<_rows*_columns; i++) - // _data[i] = values[i]; - }; - - /*! - * Empty constructor - * Just create the object - */ - Matrix() - { - _rows = 0; - _columns = 0; - _data = NULL; - }; - - /*! - * Copy constructor - * The matrix elements are initialized with the value of the corresponding element in \i m - * \param m the matrix to be copied - */ - Matrix(const Matrix &m) - { - _rows = m._rows; - _columns = m._columns; - _data = new ScalarType[_rows*_columns]; - - unsigned int dim = _rows * _columns; - memcpy(_data, m._data, dim * sizeof(ScalarType)); - -// for (unsigned int i=0; i<_rows*_columns; i++) -// _data[i] = m._data[i]; - }; - - /*! - * Default destructor - */ - ~Matrix() - { - delete []_data; - }; - - /*! - * Number of columns - */ - inline unsigned int ColumnsNumber() const - { - return _columns; - }; - - - /*! - * Number of rows - */ - inline unsigned int RowsNumber() const - { - return _rows; - }; - - /*! - * Equality operator. - * \param m - * \return true iff the matrices have same size and its elements have same values. - */ - bool operator==(const Matrix &m) const - { - if (_rows==m._rows && _columns==m._columns) - { - bool result = true; - for (unsigned int i=0; i<_rows*_columns && result; i++) - result = (_data[i]==m._data[i]); - return result; - } - return false; - }; - - /*! - * Inequality operator - * \param m - * \return true iff the matrices have different size or if their elements have different values. - */ - bool operator!=(const Matrix &m) const - { - if (_rows==m._rows && _columns==m._columns) - { - bool result = false; - for (unsigned int i=0; i<_rows*_columns && !result; i++) - result = (_data[i]!=m._data[i]); - return result; - } - return true; - }; - - /*! - * Return the element stored in the i-th rows at the j-th column - * \param i the row index - * \param j the column index - * \return the element - */ - inline TYPE ElementAt(unsigned int i, unsigned int j) - { - assert(i>=0 && i<_rows); - assert(j>=0 && j<_columns); - return _data[i*_columns+j]; - }; - - /*! - * Calculate and return the matrix determinant (Laplace) - * \return the matrix determinant - */ - TYPE Determinant() const - { - assert(_rows == _columns); - switch (_rows) - { - case 2: - { - return _data[0]*_data[3]-_data[1]*_data[2]; - break; - }; - case 3: - { - return _data[0]*(_data[4]*_data[8]-_data[5]*_data[7]) - - _data[1]*(_data[3]*_data[8]-_data[5]*_data[6]) + - _data[2]*(_data[3]*_data[7]-_data[4]*_data[6]) ; - break; - }; - default: - { - // da migliorare: si puo' cercare la riga/colonna con maggior numero di zeri - ScalarType det = 0; - for (unsigned int j=0; j<_columns; j++) - if (_data[j]!=0) - det += _data[j]*this->Cofactor(0, j); - - return det; - } - }; - }; - - /*! - * Return the cofactor Ai,j of the ai,j element - * \return ... - */ - TYPE Cofactor(unsigned int i, unsigned int j) const - { - assert(_rows == _columns); - assert(_rows>2); - TYPE *values = new TYPE[(_rows-1)*(_columns-1)]; - unsigned int u, v, p, q, s, t; - for (u=0, p=0, s=0, t=0; u<_rows; u++, t+=_rows) - { - if (i==u) - continue; - - for (v=0, q=0; v<_columns; v++) - { - if (j==v) - continue; - values[s+q] = _data[t+v]; - q++; - } - p++; - s+=(_rows-1); - } - Matrix temp(_rows-1, _columns-1, values); - return (pow(TYPE(-1.0), TYPE(i+j))*temp.Determinant()); - }; - - /*! - * Subscript operator: - * \param i the index of the row - * \return a reference to the i-th matrix row - */ - inline TYPE* operator[](const unsigned int i) - { - assert(i<_rows); - return _data + i*_columns; - }; - - /*! - * Const subscript operator - * \param i the index of the row - * \return a reference to the i-th matrix row - */ - inline const TYPE* operator[](const unsigned int i) const - { - assert(i<_rows); - return _data + i*_columns; - }; - - /*! - * Get the j-th column on the matrix. - * \param j the column index. - * \return the reference to the column elements. This pointer must be deallocated by the caller. - */ - TYPE* GetColumn(const unsigned int j) - { - assert(j>=0 && j<_columns); - ScalarType *v = new ScalarType[_columns]; - unsigned int i, p; - for (i=0, p=j; i<_rows; i++, p+=_columns) - v[i] = _data[p]; - return v; - }; - - /*! - * Get the i-th row on the matrix. - * \param i the column index. - * \return the reference to the row elements. This pointer must be deallocated by the caller. - */ - TYPE* GetRow(const unsigned int i) - { - assert(i>=0 && i<_rows); - ScalarType *v = new ScalarType[_rows]; - unsigned int j, p; - for (j=0, p=i*_columns; j<_columns; j++, p++) - v[j] = _data[p]; - return v; - }; - - /*! - * Swaps the values of the elements between the i-th and the j-th column. - * \param i the index of the first column - * \param j the index of the second column - */ - void SwapColumns(const unsigned int i, const unsigned int j) - { - assert(0<=i && i<_columns); - assert(0<=j && j<_columns); - if (i==j) - return; - - unsigned int r, e0, e1; - for (r=0, e0=i, e1=j; r<_rows; r++, e0+=_columns, e1+=_columns) - std::swap(_data[e0], _data[e1]); - }; - - /*! - * Swaps the values of the elements between the i-th and the j-th row. - * \param i the index of the first row - * \param j the index of the second row - */ - void SwapRows(const unsigned int i, const unsigned int j) - { - assert(0<=i && i<_rows); - assert(0<=j && j<_rows); - if (i==j) - return; - - unsigned int r, e0, e1; - for (r=0, e0=i*_columns, e1=j*_columns; r<_columns; r++, e0++, e1++) - std::swap(_data[e0], _data[e1]); - }; - - /*! - * Assignment operator - * \param m ... - */ - Matrix& operator=(const Matrix &m) - { - if (this != &m) - { - assert(_rows == m._rows); - assert(_columns == m._columns); - for (unsigned int i=0; i<_rows*_columns; i++) - _data[i] = m._data[i]; - } - return *this; - }; - - /*! - * Adds a matrix m to this matrix. - * \param m reference to matrix to add to this - * \return the matrix sum. - */ - Matrix& operator+=(const Matrix &m) - { - assert(_rows == m._rows); - assert(_columns == m._columns); - for (unsigned int i=0; i<_rows*_columns; i++) - _data[i] += m._data[i]; - return *this; - }; - - /*! - * Subtracts a matrix m to this matrix. - * \param m reference to matrix to subtract - * \return the matrix difference. - */ - Matrix& operator-=(const Matrix &m) - { - assert(_rows == m._rows); - assert(_columns == m._columns); - for (unsigned int i=0; i<_rows*_columns; i++) - _data[i] -= m._data[i]; - return *this; - }; - - /*! - * (Modifier) Add to each element of this matrix the scalar constant k. - * \param k the scalar constant - * \return the modified matrix - */ - Matrix& operator+=(const TYPE k) - { - for (unsigned int i=0; i<_rows*_columns; i++) - _data[i] += k; - return *this; - }; - - /*! - * (Modifier) Subtract from each element of this matrix the scalar constant k. - * \param k the scalar constant - * \return the modified matrix - */ - Matrix& operator-=(const TYPE k) - { - for (unsigned int i=0; i<_rows*_columns; i++) - _data[i] -= k; - return *this; - }; - - /*! - * (Modifier) Multiplies each element of this matrix by the scalar constant k. - * \param k the scalar constant - * \return the modified matrix - */ - Matrix& operator*=(const TYPE k) - { - for (unsigned int i=0; i<_rows*_columns; i++) - _data[i] *= k; - return *this; - }; - - /*! - * (Modifier) Divides each element of this matrix by the scalar constant k. - * \param k the scalar constant - * \return the modified matrix - */ - Matrix& operator/=(const TYPE k) - { - assert(k!=0); - for (unsigned int i=0; i<_rows*_columns; i++) - _data[i] /= k; - return *this; - }; - - /*! - * Matrix multiplication: calculates the cross product. - * \param m reference to the matrix to multiply by - * \return the matrix product - */ - Matrix operator*(const Matrix &m) const - { - assert(_columns == m._rows); - Matrix result(_rows, m._columns); - unsigned int i, j, k, p, q, r; - for (i=0, p=0, r=0; i - void DotProduct(Point &m,Point &result) - { - unsigned int i, j, p, r; - for (i=0, p=0, r=0; i operator*(const MatrixDiagBase &m) const - { - assert(_columns == _rows); - assert(_columns == m.Dimension()); - int i,j; - Matrix result(_rows, _columns); - - for (i=0; i - void OuterProduct(const Point a, const Point< M,TYPE> b) - { - assert(N == _rows); - assert(M == _columns); - Matrix result(_rows,_columns); - unsigned int i, j; - - for (i=0; i operator*(Point3 &p) const - { - assert(_columns==3 && _rows==3); - vcg::Point3 result; - result[0] = _data[0]*p[0]+_data[1]*p[1]+_data[2]*p[2]; - result[1] = _data[3]*p[0]+_data[4]*p[1]+_data[5]*p[2]; - result[2] = _data[6]*p[0]+_data[7]*p[1]+_data[8]*p[2]; - return result; - }; - - - /*! - * Scalar sum. - * \param k - * \return the resultant matrix - */ - Matrix operator+(const TYPE k) - { - Matrix result(_rows, _columns); - for (unsigned int i=0; i<_rows*_columns; i++) - result._data[i] = _data[i]+k; - return result; - }; - - /*! - * Scalar difference. - * \param k - * \return the resultant matrix - */ - Matrix operator-(const TYPE k) - { - Matrix result(_rows, _columns); - for (unsigned int i=0; i<_rows*_columns; i++) - result._data[i] = _data[i]-k; - return result; - }; - - /*! - * Negate all matrix elements - * \return the modified matrix - */ - Matrix operator-() const - { - Matrix result(_rows, _columns, _data); - for (unsigned int i=0; i<_columns*_rows; i++) - result._data[i] = -1*_data[i]; - return result; - }; - - /*! - * Scalar multiplication. - * \param k value to multiply every member by - * \return the resultant matrix - */ - Matrix operator*(const TYPE k) const - { - Matrix result(_rows, _columns); - for (unsigned int i=0; i<_rows*_columns; i++) - result._data[i] = _data[i]*k; - return result; - }; - - /*! - * Scalar division. - * \param k value to divide every member by - * \return the resultant matrix - */ - Matrix operator/(const TYPE k) - { - Matrix result(_rows, _columns); - for (unsigned int i=0; i<_rows*_columns; i++) - result._data[i] = _data[i]/k; - return result; - }; - - - /*! - * Set all the matrix elements to zero. - */ - void SetZero() - { - for (unsigned int i=0; i<_rows*_columns; i++) - _data[i] = ScalarType(0.0); - }; - - /*! - * Set the matrix to identity. - */ - void SetIdentity() - { - assert(_rows==_columns); - for (unsigned int i=0; i<_rows; i++) - for (unsigned int j=0; j<_columns; j++) - _data[i] = (i==j) ? ScalarType(1.0) : ScalarType(0.0f); - }; - - /*! - * Set the values of j-th column to v[j] - * \param j the column index - * \param v ... - */ - void SetColumn(const unsigned int j, TYPE* v) - { - assert(j>=0 && j<_columns); - unsigned int i, p; - for (i=0, p=j; i<_rows; i++, p+=_columns) - _data[p] = v[i]; - }; - - /*! - * Set the elements of the i-th row to v[j] - * \param i the row index - * \param v ... - */ - void SetRow(const unsigned int i, TYPE* v) - { - assert(i>=0 && i<_rows); - unsigned int j, p; - for (j=0, p=i*_rows; j<_columns; j++, p++) - _data[p] = v[j]; - }; - - /*! - * Set the diagonal elements vi,i to v[i] - * \param v - */ - void SetDiagonal(TYPE *v) - { - assert(_rows == _columns); - for (unsigned int i=0, p=0; i<_rows; i++, p+=_rows) - _data[p+i] = v[i]; - }; - - /*! - * Resize the current matrix. - * \param m the number of matrix rows. - * \param n the number of matrix columns. - */ - void Resize(const unsigned int m, const unsigned int n) - { - assert(m>=2); - assert(n>=2); - _rows = m; - _columns = n; - delete []_data; - _data = new ScalarType[m*n]; - for (unsigned int i=0; i MatrixMNd; - typedef vcg::ndim::Matrix MatrixMNf; - - /*! @} */ - -// template -// void Invert(MatrixType & m){ -// typedef typename MatrixType::ScalarType X; -// X *diag; -// diag = new X [m.ColumnsNumber()]; - -// MatrixType res(m.RowsNumber(),m.ColumnsNumber()); -// vcg::SingularValueDecomposition (m,&diag[0],res,LeaveUnsorted,50 ); -// m.Transpose(); -// // prodotto per la diagonale -// unsigned int i,j; -// for (i=0; i -#include -#include -#ifndef _YES_I_WANT_TO_USE_DANGEROUS_STUFF -#error "Please do not never user this file. Use EIGEN!!!!" -#endif -namespace vcg -{ - /** \addtogroup math */ - /* @{ */ - - /*! - * - */ - template< typename MATRIX_TYPE > - static void JacobiRotate(MATRIX_TYPE &A, typename MATRIX_TYPE::ScalarType s, typename MATRIX_TYPE::ScalarType tau, int i,int j,int k,int l) - { - typename MATRIX_TYPE::ScalarType g=A[i][j]; - typename MATRIX_TYPE::ScalarType h=A[k][l]; - A[i][j]=g-s*(h+g*tau); - A[k][l]=h+s*(g-h*tau); - }; - - /*! - * Computes all eigenvalues and eigenvectors of a real symmetric matrix . - * On output, elements of the input matrix above the diagonal are destroyed. - * \param d returns the eigenvalues of a. - * \param v is a matrix whose columns contain, the normalized eigenvectors - * \param nrot returns the number of Jacobi rotations that were required. - */ - template - static void Jacobi(MATRIX_TYPE &w, POINT_TYPE &d, MATRIX_TYPE &v, int &nrot) - { - typedef typename MATRIX_TYPE::ScalarType ScalarType; - assert(w.RowsNumber()==w.ColumnsNumber()); - int dimension = w.RowsNumber(); - - int j,iq,ip,i; - //assert(w.IsSymmetric()); - typename MATRIX_TYPE::ScalarType tresh, theta, tau, t, sm, s, h, g, c; - POINT_TYPE b, z; - - v.SetIdentity(); - - for (ip=0;ip4 && (float)(fabs(d[ip])+g) == (float)fabs(d[ip]) && (float)(fabs(d[iq])+g) == (float)fabs(d[iq])) - w[ip][iq]=ScalarType(0.0); - else if (fabs(w[ip][iq]) > tresh) - { - h=d[iq]-d[ip]; - if ((float)(fabs(h)+g) == (float)fabs(h)) - t=(w[ip][iq])/h; //t =1/(2#) - else - { - theta=ScalarType(0.5)*h/(w[ip][iq]); //Equation (11.1.10). - t=ScalarType(1.0)/(fabs(theta)+sqrt(ScalarType(1.0)+theta*theta)); - if (theta < ScalarType(0.0)) t = -t; - } - c=ScalarType(1.0)/sqrt(ScalarType(1.0)+t*t); - s=t*c; - tau=s/(ScalarType(1.0)+c); - h=t*w[ip][iq]; - z[ip] -= h; - z[iq] += h; - d[ip] -= h; - d[iq] += h; - w[ip][iq]=ScalarType(0.0); - for (j=0;j<=ip-1;j++) { //Case of rotations 1 <= j < p. - JacobiRotate(w,s,tau,j,ip,j,iq) ; - } - for (j=ip+1;j<=iq-1;j++) { //Case of rotations p < j < q. - JacobiRotate(w,s,tau,ip,j,j,iq); - } - for (j=iq+1;j(w,s,tau,ip,j,iq,j); - } - for (j=0;j(v,s,tau,j,ip,j,iq); - } - ++nrot; - } - } - } - for (ip=0;ip - void SortEigenvaluesAndEigenvectors(POINT_TYPE &eigenvalues, MATRIX_TYPE &eigenvectors, bool absComparison = false) - { - assert(eigenvectors.ColumnsNumber()==eigenvectors.RowsNumber()); - int dimension = eigenvectors.ColumnsNumber(); - int i, j, k; - float p,q; - for (i=0; i= p) - { - p = q; - k = j; - } - p = eigenvalues[k]; - } - else - { - p = eigenvalues[ k=i ]; - for (j=i+1; j= p) - p = eigenvalues[ k=j ]; - } - - if (k != i) - { - eigenvalues[k] = eigenvalues[i]; // i.e. - eigenvalues[i] = p; // swaps the value of the elements i-th and k-th - - for (j=0; j - inline static TYPE sqr(TYPE a) - { - TYPE sqr_arg = a; - return (sqr_arg == 0 ? 0 : sqr_arg*sqr_arg); - } - - // Computes (a^2 + b^2)^(1/2) without destructive underflow or overflow. - template - inline static TYPE pythagora(TYPE a, TYPE b) - { - TYPE abs_a = fabs(a); - TYPE abs_b = fabs(b); - if (abs_a > abs_b) - return abs_a*sqrt((TYPE)1.0+sqr(abs_b/abs_a)); - else - return (abs_b == (TYPE)0.0 ? (TYPE)0.0 : abs_b*sqrt((TYPE)1.0+sqr(abs_a/abs_b))); - } - - template - inline static TYPE sign(TYPE a, TYPE b) - { - return (b >= 0.0 ? fabs(a) : -fabs(a)); - } - - /*! - * - */ - enum SortingStrategy {LeaveUnsorted=0, SortAscending=1, SortDescending=2}; - template< typename MATRIX_TYPE > - void Sort(MATRIX_TYPE &U, typename MATRIX_TYPE::ScalarType W[], MATRIX_TYPE &V, const SortingStrategy sorting) ; - - - /*! - * Given a matrix Amxn, this routine computes its singular value decomposition, - * i.e. A=UxWxVT. The matrix A will be destroyed! - * (This is the implementation described in Numerical Recipies). - * \param A the matrix to be decomposed - * \param W the diagonal matrix of singular values W, stored as a vector W[1...N] - * \param V the matrix V (not the transpose VT) - * \param max_iters max iteration number (default = 30). - * \return - */ - template - static bool SingularValueDecomposition(MATRIX_TYPE &A, typename MATRIX_TYPE::ScalarType *W, MATRIX_TYPE &V, const SortingStrategy sorting=LeaveUnsorted, const int max_iters=30) - { - typedef typename MATRIX_TYPE::ScalarType ScalarType; - int m = (int) A.RowsNumber(); - int n = (int) A.ColumnsNumber(); - int flag,i,its,j,jj,k,l,nm; - ScalarType anorm, c, f, g, h, s, scale, x, y, z, *rv1; - bool convergence = true; - - rv1 = new ScalarType[n]; - g = scale = anorm = 0; - // Householder reduction to bidiagonal form. - for (i=0; i( sqrt(s), f ); - h = f*g - s; - A[i][i]=f-g; - for (j=l; j(sqrt(s),f); - h = f*g - s; - A[i][l] = f-g; - for (k=l; k=0; i--) - { - //Accumulation of right-hand transformations. - if (i < (n-1)) - { - if (g) - { - for (j=l; j=0; i--) - { - l = i+1; - g = W[i]; - for (j=l; j=0; k--) - { - for (its=1; its<=max_iters; its++) - { - flag=1; - for (l=k; l>=0; l--) - { - // Test for splitting. - nm=l-1; - // Note that rv1[1] is always zero. - if ((double)(fabs(rv1[l])+anorm) == anorm) - { - flag=0; - break; - } - if ((double)(fabs(W[nm])+anorm) == anorm) - break; - } - if (flag) - { - c=0.0; //Cancellation of rv1[l], if l > 1. - s=1.0; - for (i=l ;i<=k; i++) - { - f = s*rv1[i]; - rv1[i] = c*rv1[i]; - if ((double)(fabs(f)+anorm) == anorm) - break; - g = W[i]; - h = pythagora(f,g); - W[i] = h; - h = (ScalarType)1.0/h; - c = g*h; - s = -f*h; - for (j=0; j(f,1.0); - f=((x-z)*(x+z) + h*((y/(f+sign(g,f)))-h))/x; - c=s=1.0; - //Next QR transformation: - for (j=l; j<= nm;j++) - { - i = j+1; - g = rv1[i]; - y = W[i]; - h = s*g; - g = c*g; - z = pythagora(f,h); - rv1[j] = z; - c = f/z; - s = h/z; - f = x*c + g*s; - g = g*c - x*s; - h = y*s; - y *= c; - for (jj=0; jj(f,h); - W[j] = z; - // Rotation can be arbitrary if z = 0. - if (z) - { - z = (ScalarType)1.0/z; - c = f*z; - s = h*z; - } - f = c*g + s*y; - x = c*y - s*g; - for (jj=0; jj(A, W, V, sorting); - - return convergence; - }; - - - /*! - * Sort the singular values computed by the SingularValueDecomposition procedure and - * modify the matrices U and V accordingly. - */ - // TODO modify the last parameter type - template< typename MATRIX_TYPE > - void Sort(MATRIX_TYPE &U, typename MATRIX_TYPE::ScalarType W[], MATRIX_TYPE &V, const SortingStrategy sorting) - { - typedef typename MATRIX_TYPE::ScalarType ScalarType; - - assert(U.ColumnsNumber()==V.ColumnsNumber()); - - int mu = U.RowsNumber(); - int mv = V.RowsNumber(); - int n = U.ColumnsNumber(); - - //ScalarType* u = &U[0][0]; - //ScalarType* v = &V[0][0]; - - for (int i=0; i p) - { - k = j; - p = W[j]; - } - } - break; - } - case LeaveUnsorted: break; // nothing to do. - } - if (k != i) - { - W[k] = W[i]; // i.e. - W[i] = p; // swaps the i-th and the k-th elements - - int j = mu; - //ScalarType* uji = u + i; // uji = &U[0][i] - //ScalarType* ujk = u + k; // ujk = &U[0][k] - //ScalarType* vji = v + i; // vji = &V[0][i] - //ScalarType* vjk = v + k; // vjk = &V[0][k] - //if (j) - //{ - // for(;;) for( ; j!=0; --j, uji+=n, ujk+=n) - // { { - // p = *uji; p = *uji; // i.e. - // *uji = *ujk; *uji = *ujk; // swap( U[s][i], U[s][k] ) - // *ujk = p; *ujk = p; // - // if (!(--j)) } - // break; - // uji += n; - // ujk += n; - // } - //} - for(int s=0; j!=0; ++s, --j) - std::swap(U[s][i], U[s][k]); - - j = mv; - //if (j!=0) - //{ - // for(;;) for ( ; j!=0; --j, vji+=n, ujk+=n) - // { { - // p = *vji; p = *vji; // i.e. - // *vji = *vjk; *vji = *vjk; // swap( V[s][i], V[s][k] ) - // *vjk = p; *vjk = p; // - // if (!(--j)) } - // break; - // vji += n; - // vjk += n; - // } - //} - for (int s=0; j!=0; ++s, --j) - std::swap(V[s][i], V[s][k]); - } - } - } - - - /*! - * Solves AxX = B for a vector X, where A is specified by the matrices Umxn, - * Wnx1 and Vnxn as returned by SingularValueDecomposition. - * No input quantities are destroyed, so the routine may be called sequentially with different bxs. - * \param x is the output solution vector (xnx1) - * \param b is the input right-hand side (bnx1) - */ - template - static void SingularValueBacksubstitution(const MATRIX_TYPE &U, - const typename MATRIX_TYPE::ScalarType *W, - const MATRIX_TYPE &V, - typename MATRIX_TYPE::ScalarType *x, - const typename MATRIX_TYPE::ScalarType *b) - { - typedef typename MATRIX_TYPE::ScalarType ScalarType; - unsigned int jj, j, i; - unsigned int columns_number = U.ColumnsNumber(); - unsigned int rows_number = U.RowsNumber(); - ScalarType s; - ScalarType *tmp = new ScalarType[columns_number]; - for (j=0; j - -namespace vcg{ -namespace ndim{ -template class Matrix; -} -} - -namespace Eigen{ -template -struct ei_traits > : ei_traits > {}; -template struct ei_to_vcgtype -{ typedef vcg::ndim::Matrix type; }; -} - -namespace vcg{ -namespace ndim{ - -/** \addtogroup math */ -/* @{ */ - -/*! - * \deprecated use Matrix or Matrix or any typedef - * This class represent a generic m�n matrix. The class is templated over the scalar type field. - * @param Scalar (Templete Parameter) Specifies the ScalarType field. - */ -template -class Matrix : public Eigen::Matrix<_Scalar,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> // FIXME col or row major ? -{ - typedef Eigen::Matrix<_Scalar,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> _Base; - -public: - - _EIGEN_GENERIC_PUBLIC_INTERFACE(Matrix,_Base); - typedef _Scalar ScalarType; - VCG_EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Matrix) - - /*! - * Default constructor - * All the elements are initialized to zero. - * \param m the number of matrix rows - * \param n the number of matrix columns - */ - Matrix(int m, int n) - : Base(m,n) - { - memset(Base::data(), 0, m*n*sizeof(Scalar)); - } - - /*! - * Constructor - * The matrix elements are initialized with the values of the elements in \i values. - * \param m the number of matrix rows - * \param n the number of matrix columns - * \param values the values of the matrix elements - */ - Matrix(int m, int n, Scalar *values) - : Base(m,n) - { - *this = Eigen::Map >(values, m , n); - } - - /*! - * Empty constructor - * Just create the object - */ - Matrix() : Base() {} - - /*! - * Copy constructor - * The matrix elements are initialized with the value of the corresponding element in \i m - * \param m the matrix to be copied - */ - Matrix(const Matrix &m) : Base(m) {} - - template - Matrix(const Eigen::MatrixBase &m) : Base(m) {} - - /*! - * Default destructor - */ - ~Matrix() {} - - /*! - * \deprecated use *this.row(i) - * Subscript operator: - * \param i the index of the row - * \return a reference to the i-th matrix row - */ - inline typename Base::RowXpr operator[](const unsigned int i) - { return Base::row(i); } - - /*! - * \deprecated use *this.row(i) - * Const subscript operator - * \param i the index of the row - * \return a reference to the i-th matrix row - */ - inline const typename Base::RowXpr operator[](const unsigned int i) const - { return Base::row(i); } - - - /*! - * Matrix multiplication: calculates the cross product. - * \param reference to the matrix to multiply by - * \return the matrix product - */ - // FIXME what the hell is that ! - /*template - void DotProduct(Point &m,Point &result) - { - unsigned int i, j, p, r; - for (i=0, p=0, r=0; i=2); - assert(n>=2); - Base::resize(m,n); - memset(Base::data(), 0, m*n*sizeof(Scalar)); - }; -}; - -typedef vcg::ndim::Matrix MatrixMNd; -typedef vcg::ndim::Matrix MatrixMNf; - -/*! @} */ - -template -void Invert(MatrixType & m) -{ - m = m.inverse(); -} - -} -} // end of namespace - -#endif - -#endif - diff --git a/vcg/math/old_matrix33.h b/vcg/math/old_matrix33.h deleted file mode 100644 index 0aebd8b0f..000000000 --- a/vcg/math/old_matrix33.h +++ /dev/null @@ -1,298 +0,0 @@ -/**************************************************************************** -* VCGLib o o * -* Visual and Computer Graphics Library o o * -* _ O _ * -* Copyright(C) 2004-2016 \/)\/ * -* Visual Computing Lab /\/| * -* ISTI - Italian National Research Council | * -* \ * -* All rights reserved. * -* * -* This program is free software; you can redistribute it and/or modify * -* it under the terms of the GNU General Public License as published by * -* the Free Software Foundation; either version 2 of the License, or * -* (at your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * -* for more details. * -* * -****************************************************************************/ - -#ifndef VCG_USE_EIGEN -#include "deprecated_matrix33.h" -#else - -#ifndef __VCGLIB_MATRIX33_H -#define __VCGLIB_MATRIX33_H - -#include "eigen.h" -#include "matrix44.h" - -namespace vcg{ -template class Matrix33; -} - -namespace Eigen{ -template -struct ei_traits > : ei_traits > {}; -template struct ei_to_vcgtype -{ typedef vcg::Matrix33 type; }; -} - -namespace vcg { - -/** \deprecated use Matrix - @name Matrix33 - Class Matrix33. - This is the class for definition of a matrix 3x3. - @param S (Templete Parameter) Specifies the ScalarType field. -*/ -template -class Matrix33 : public Eigen::Matrix<_Scalar,3,3,Eigen::RowMajor> // FIXME col or row major ? -{ - - typedef Eigen::Matrix<_Scalar,3,3,Eigen::RowMajor> _Base; -public: - - using _Base::coeff; - using _Base::coeffRef; - using _Base::setZero; - - _EIGEN_GENERIC_PUBLIC_INTERFACE(Matrix33,_Base); - typedef _Scalar ScalarType; - - VCG_EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Matrix33) - - /// Default constructor - inline Matrix33() : Base() {} - - /// Copy constructor - Matrix33(const Matrix33& m ) : Base(m) {} - - /// create from a \b row-major array - Matrix33(const Scalar * v ) : Base(Eigen::Map >(v)) {} - - /// create from Matrix44 excluding row and column k - Matrix33(const Matrix44 & m, const int & k) : Base(m.minor(k,k)) {} - - template - Matrix33(const Eigen::MatrixBase& other) : Base(other) {} - - /*! \deprecated use *this.row(i) */ - inline typename Base::RowXpr operator[](const unsigned int i) - { return Base::row(i); } - - /*! \deprecated use *this.row(i) */ - inline const typename Base::RowXpr operator[](const unsigned int i) const - { return Base::row(i); } - - /** \deprecated */ - Matrix33 & SetRotateRad(Scalar angle, const Point3 & axis ) - { - *this = Eigen::AngleAxis(angle,axis).toRotationMatrix(); - return (*this); - } - /** \deprecated */ - Matrix33 & SetRotateDeg(Scalar angle, const Point3 & axis ){ - return SetRotateRad(math::ToRad(angle),axis); - } - - // Warning, this Inversion code can be HIGHLY NUMERICALLY UNSTABLE! - // In most case you are advised to use the Invert() method based on SVD decomposition. - /** \deprecated */ - Matrix33 & FastInvert() { return *this = Base::inverse(); } - - void show(FILE * fp) - { - for(int i=0;i<3;++i) - printf("| %g \t%g \t%g |\n",coeff(i,0),coeff(i,1),coeff(i,2)); - } - - /** \deprecated use a * b.transpose() - compute the matrix generated by the product of a * b^T - */ - // hm.... this is the outer product - void ExternalProduct(const Point3 &a, const Point3 &b) { *this = a * b.transpose(); } - - /** Compute the Frobenius Norm of the Matrix */ - Scalar Norm() { return Base::cwise().abs2().sum(); } - - /** Computes the covariance matrix of a set of 3d points. Returns the barycenter. - */ - // FIXME should be outside Matrix - - - /** - It computes the cross covariance matrix of two set of 3d points P and X; - it returns also the barycenters of P and X. - fonte: - - Besl, McKay - A method for registration o f 3d Shapes - IEEE TPAMI Vol 14, No 2 1992 - - */ - // FIXME should be outside Matrix - template - void CrossCovariance(const STLPOINTCONTAINER &P, const STLPOINTCONTAINER &X, - Point3 &bp, Point3 &bx) - { - setZero(); - assert(P.size()==X.size()); - bx.setZero(); - bp.setZero(); - Matrix33 tmp; - typename std::vector >::const_iterator pi,xi; - for(pi=P.begin(),xi=X.begin();pi!=P.end();++pi,++xi){ - bp+=*pi; - bx+=*xi; - tmp.ExternalProduct(*pi,*xi); - (*this)+=tmp; - } - bp/=P.size(); - bx/=X.size(); - (*this)/=P.size(); - tmp.ExternalProduct(bp,bx); - (*this)-=tmp; - } - - template - void WeightedCrossCovariance(const STLREALCONTAINER & weights, - const STLPOINTCONTAINER &P, - const STLPOINTCONTAINER &X, - Point3 &bp, - Point3 &bx) - { - setZero(); - assert(P.size()==X.size()); - bx.SetZero(); - bp.SetZero(); - Matrix33 tmp; - typename std::vector >::const_iterator pi,xi; - typename STLREALCONTAINER::const_iterator pw; - - for(pi=P.begin(),xi=X.begin();pi!=P.end();++pi,++xi){ - bp+=(*pi); - bx+=(*xi); - } - bp/=P.size(); - bx/=X.size(); - - for(pi=P.begin(),xi=X.begin(),pw = weights.begin();pi!=P.end();++pi,++xi,++pw){ - - tmp.ExternalProduct(((*pi)-(bp)),((*xi)-(bp))); - - (*this)+=tmp*(*pw); - } - } -}; - -template -void Invert(Matrix33 &m) { m = m.lu().inverse(); } - -template -Matrix33 Inverse(const Matrix33&m) { return m.lu().inverse(); } - -///given 2 vector centered into origin calculate the rotation matrix from first to the second -template -Matrix33 RotationMatrix(vcg::Point3 v0,vcg::Point3 v1,bool normalized=true) - { - typedef typename vcg::Point3 CoordType; - Matrix33 rotM; - const S epsilon=0.00001; - if (!normalized) - { - v0.Normalize(); - v1.Normalize(); - } - S dot=v0.dot(v1); - ///control if there is no rotation - if (dot>((S)1-epsilon)) - { - rotM.SetIdentity(); - return rotM; - } - - ///find the axis of rotation - CoordType axis; - axis=v0^v1; - axis.Normalize(); - - ///construct rotation matrix - S u=axis.X(); - S v=axis.Y(); - S w=axis.Z(); - S phi=acos(dot); - S rcos = cos(phi); - S rsin = sin(phi); - - rotM[0][0] = rcos + u*u*(1-rcos); - rotM[1][0] = w * rsin + v*u*(1-rcos); - rotM[2][0] = -v * rsin + w*u*(1-rcos); - rotM[0][1] = -w * rsin + u*v*(1-rcos); - rotM[1][1] = rcos + v*v*(1-rcos); - rotM[2][1] = u * rsin + w*v*(1-rcos); - rotM[0][2] = v * rsin + u*w*(1-rcos); - rotM[1][2] = -u * rsin + v*w*(1-rcos); - rotM[2][2] = rcos + w*w*(1-rcos); - - return rotM; - } - -///return the rotation matrix along axis -template -Matrix33 RotationMatrix(const vcg::Point3 &axis, - const float &angleRad) - { - vcg::Matrix44 matr44; - vcg::Matrix33 matr33; - matr44.SetRotate(angleRad,axis); - for (int i=0;i<3;i++) - for (int j=0;j<3;j++) - matr33[i][j]=matr44[i][j]; - return matr33; - } - -/// return a random rotation matrix, from the paper: -/// Fast Random Rotation Matrices, James Arvo -/// Graphics Gems III pp. 117-120 -template - Matrix33 RandomRotation(){ - S x1,x2,x3; - Matrix33 R,H,M,vv; - Point3 v; - R.SetIdentity(); - H.SetIdentity(); - x1 = rand()/S(RAND_MAX); - x2 = rand()/S(RAND_MAX); - x3 = rand()/S(RAND_MAX); - - R[0][0] = cos(S(2)*M_PI*x1); - R[0][1] = sin(S(2)*M_PI*x1); - R[1][0] = - R[0][1]; - R[1][1] = R[0][0]; - - v[0] = cos(2.0 * M_PI * x2)*sqrt(x3); - v[1] = sin(2.0 * M_PI * x2)*sqrt(x3); - v[2] = sqrt(1-x3); - - vv.OuterProduct(v,v); - H -= vv*S(2); - M = H*R*S(-1); - return M; -} - -/// -typedef Matrix33 Matrix33s; -typedef Matrix33 Matrix33i; -typedef Matrix33 Matrix33f; -typedef Matrix33 Matrix33d; - -} // end of namespace - -#endif - -#endif diff --git a/vcg/math/old_matrix44.h b/vcg/math/old_matrix44.h deleted file mode 100644 index d4a7ae9ac..000000000 --- a/vcg/math/old_matrix44.h +++ /dev/null @@ -1,493 +0,0 @@ -/**************************************************************************** -* VCGLib o o * -* Visual and Computer Graphics Library o o * -* _ O _ * -* Copyright(C) 2004-2016 \/)\/ * -* Visual Computing Lab /\/| * -* ISTI - Italian National Research Council | * -* \ * -* All rights reserved. * -* * -* This program is free software; you can redistribute it and/or modify * -* it under the terms of the GNU General Public License as published by * -* the Free Software Foundation; either version 2 of the License, or * -* (at your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * -* for more details. * -* * -****************************************************************************/ - -#ifndef VCG_USE_EIGEN -#include "deprecated_matrix44.h" -#else - -#ifndef __VCGLIB_MATRIX44 -#define __VCGLIB_MATRIX44 - -#include "eigen.h" -#include -#include -#include -#include - -namespace vcg{ -template class Matrix44; -} - -namespace Eigen{ -template -struct ei_traits > : ei_traits > {}; -template struct ei_to_vcgtype -{ typedef vcg::Matrix44 type; }; -} - -namespace vcg { - - /* - Annotations: -Opengl stores matrix in column-major order. That is, the matrix is stored as: - - a0 a4 a8 a12 - a1 a5 a9 a13 - a2 a6 a10 a14 - a3 a7 a11 a15 - - Usually in opengl (see opengl specs) vectors are 'column' vectors - so usually matrix are PRE-multiplied for a vector. - So the command glTranslate generate a matrix that - is ready to be premultipled for a vector: - - 1 0 0 tx - 0 1 0 ty - 0 0 1 tz - 0 0 0 1 - -Matrix44 stores matrix in row-major order i.e. - - a0 a1 a2 a3 - a4 a5 a6 a7 - a8 a9 a10 a11 - a12 a13 a14 a15 - -So for the use of that matrix in opengl with their supposed meaning you have to transpose them before feeding to glMultMatrix. -This mechanism is hidden by the templated function defined in wrap/gl/math.h; -If your machine has the ARB_transpose_matrix extension it will use the appropriate; -The various gl-like command SetRotate, SetTranslate assume that you are making matrix -for 'column' vectors. - -*/ - -// Note that we have to pass Dim and HDim because it is not allowed to use a template -// parameter to define a template specialization. To be more precise, in the following -// specializations, it is not allowed to use Dim+1 instead of HDim. -template< typename Other, - int OtherRows=Eigen::ei_traits::RowsAtCompileTime, - int OtherCols=Eigen::ei_traits::ColsAtCompileTime> -struct ei_matrix44_product_impl; - -/** \deprecated use Eigen::Matrix (or the typedef) you want a real 4x4 matrix, or use Eigen::Transform if you want a transformation matrix for a 3D space (a Eigen::Transform is internally a 4x4 col-major matrix) - * - * This class represents a 4x4 matrix. T is the kind of element in the matrix. - */ -template -class Matrix44 : public Eigen::Matrix<_Scalar,4,4,Eigen::RowMajor> // FIXME col or row major ! -{ - - typedef Eigen::Matrix<_Scalar,4,4,Eigen::RowMajor> _Base; -public: - - using _Base::coeff; - using _Base::coeffRef; - using _Base::ElementAt; - using _Base::setZero; - - _EIGEN_GENERIC_PUBLIC_INTERFACE(Matrix44,_Base); - typedef _Scalar ScalarType; - VCG_EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Matrix44) - - Matrix44() : Base() {} - ~Matrix44() {} - Matrix44(const Matrix44 &m) : Base(m) {} - Matrix44(const Scalar * v ) : Base(Eigen::Map >(v)) {} - template - Matrix44(const Eigen::MatrixBase& other) : Base(other) {} - - const typename Base::RowXpr operator[](int i) const { return Base::row(i); } - typename Base::RowXpr operator[](int i) { return Base::row(i); } - - typename Base::ColXpr GetColumn4(const int& i) const { return Base::col(i); } - const Eigen::Block GetColumn3(const int& i) const { return this->template block<3,1>(0,i); } - - typename Base::RowXpr GetRow4(const int& i) const { return Base::row(i); } - Eigen::Block GetRow3(const int& i) const { return this->template block<1,3>(i,0); } - - template - void ToMatrix(Matrix44Type & m) const { m = (*this).template cast(); } - - void ToEulerAngles(Scalar &alpha, Scalar &beta, Scalar &gamma); - - template - void FromMatrix(const Matrix44Type & m) { for(int i = 0; i < 16; i++) Base::data()[i] = m.data()[i]; } - - void FromEulerAngles(Scalar alpha, Scalar beta, Scalar gamma); - void SetDiagonal(const Scalar k); - Matrix44 &SetScale(const Scalar sx, const Scalar sy, const Scalar sz); - Matrix44 &SetScale(const Point3 &t); - Matrix44 &SetTranslate(const Point3 &t); - Matrix44 &SetTranslate(const Scalar sx, const Scalar sy, const Scalar sz); - Matrix44 &SetShearXY(const Scalar sz); - Matrix44 &SetShearXZ(const Scalar sy); - Matrix44 &SetShearYZ(const Scalar sx); - - ///use radiants for angle. - Matrix44 &SetRotateDeg(Scalar AngleDeg, const Point3 & axis); - Matrix44 &SetRotateRad(Scalar AngleRad, const Point3 & axis); - - /** taken from Eigen::Transform - * \returns the product between the transform \c *this and a matrix expression \a other - * - * The right hand side \a other might be either: - * \li a matrix expression with 4 rows - * \li a 3D vector/point - */ - template - inline const typename ei_matrix44_product_impl::ResultType - operator * (const Eigen::MatrixBase &other) const - { return ei_matrix44_product_impl::run(*this,other.derived()); } - - void print() {std::cout << *this << "\n\n";} - -}; - -//return NULL matrix if not invertible -template Matrix44 &Invert(Matrix44 &m); -template Matrix44 Inverse(const Matrix44 &m); - -typedef Matrix44 Matrix44s; -typedef Matrix44 Matrix44i; -typedef Matrix44 Matrix44f; -typedef Matrix44 Matrix44d; - -template < class PointType , class T > void operator*=( std::vector &vert, const Matrix44 & m ) { - typename std::vector::iterator ii; - for(ii=vert.begin();ii!=vert.end();++ii) - (*ii).P()=m * (*ii).P(); -} - -template -void Matrix44::ToEulerAngles(Scalar &alpha, Scalar &beta, Scalar &gamma) -{ - alpha = atan2(coeff(1,2), coeff(2,2)); - beta = asin(-coeff(0,2)); - gamma = atan2(coeff(0,1), coeff(1,1)); -} - -template -void Matrix44::FromEulerAngles(Scalar alpha, Scalar beta, Scalar gamma) -{ - this->SetZero(); - - T cosalpha = cos(alpha); - T cosbeta = cos(beta); - T cosgamma = cos(gamma); - T sinalpha = sin(alpha); - T sinbeta = sin(beta); - T singamma = sin(gamma); - - ElementAt(0,0) = cosbeta * cosgamma; - ElementAt(1,0) = -cosalpha * singamma + sinalpha * sinbeta * cosgamma; - ElementAt(2,0) = sinalpha * singamma + cosalpha * sinbeta * cosgamma; - - ElementAt(0,1) = cosbeta * singamma; - ElementAt(1,1) = cosalpha * cosgamma + sinalpha * sinbeta * singamma; - ElementAt(2,1) = -sinalpha * cosgamma + cosalpha * sinbeta * singamma; - - ElementAt(0,2) = -sinbeta; - ElementAt(1,2) = sinalpha * cosbeta; - ElementAt(2,2) = cosalpha * cosbeta; - - ElementAt(3,3) = 1; -} - -template void Matrix44::SetDiagonal(const Scalar k) { - setZero(); - ElementAt(0, 0) = k; - ElementAt(1, 1) = k; - ElementAt(2, 2) = k; - ElementAt(3, 3) = 1; -} - -template Matrix44 &Matrix44::SetScale(const Point3 &t) { - SetScale(t[0], t[1], t[2]); - return *this; -} -template Matrix44 &Matrix44::SetScale(const Scalar sx, const Scalar sy, const Scalar sz) { - setZero(); - ElementAt(0, 0) = sx; - ElementAt(1, 1) = sy; - ElementAt(2, 2) = sz; - ElementAt(3, 3) = 1; - return *this; -} - -template Matrix44 &Matrix44::SetTranslate(const Point3 &t) { - SetTranslate(t[0], t[1], t[2]); - return *this; -} -template Matrix44 &Matrix44::SetTranslate(const Scalar tx, const Scalar ty, const Scalar tz) { - Base::setIdentity(); - ElementAt(0, 3) = tx; - ElementAt(1, 3) = ty; - ElementAt(2, 3) = tz; - return *this; -} - -template Matrix44 &Matrix44::SetRotateDeg(Scalar AngleDeg, const Point3 & axis) { - return SetRotateRad(math::ToRad(AngleDeg),axis); -} - -template Matrix44 &Matrix44::SetRotateRad(Scalar AngleRad, const Point3 & axis) { - //angle = angle*(T)3.14159265358979323846/180; e' in radianti! - T c = math::Cos(AngleRad); - T s = math::Sin(AngleRad); - T q = 1-c; - Point3 t = axis; - t.Normalize(); - ElementAt(0,0) = t[0]*t[0]*q + c; - ElementAt(0,1) = t[0]*t[1]*q - t[2]*s; - ElementAt(0,2) = t[0]*t[2]*q + t[1]*s; - ElementAt(0,3) = 0; - ElementAt(1,0) = t[1]*t[0]*q + t[2]*s; - ElementAt(1,1) = t[1]*t[1]*q + c; - ElementAt(1,2) = t[1]*t[2]*q - t[0]*s; - ElementAt(1,3) = 0; - ElementAt(2,0) = t[2]*t[0]*q -t[1]*s; - ElementAt(2,1) = t[2]*t[1]*q +t[0]*s; - ElementAt(2,2) = t[2]*t[2]*q +c; - ElementAt(2,3) = 0; - ElementAt(3,0) = 0; - ElementAt(3,1) = 0; - ElementAt(3,2) = 0; - ElementAt(3,3) = 1; - return *this; -} - -/* Shear Matrixes -XY -1 k 0 0 x x+ky -0 1 0 0 y y -0 0 1 0 z z -0 0 0 1 1 1 - -1 0 k 0 x x+kz -0 1 0 0 y y -0 0 1 0 z z -0 0 0 1 1 1 - -1 1 0 0 x x -0 1 k 0 y y+kz -0 0 1 0 z z -0 0 0 1 1 1 - -*/ - - template Matrix44 & Matrix44::SetShearXY( const Scalar sh) {// shear the X coordinate as the Y coordinate change - Base::setIdentity(); - ElementAt(0,1) = sh; - return *this; - } - - template Matrix44 & Matrix44::SetShearXZ( const Scalar sh) {// shear the X coordinate as the Z coordinate change - Base::setIdentity(); - ElementAt(0,2) = sh; - return *this; - } - - template Matrix44 &Matrix44::SetShearYZ( const Scalar sh) {// shear the Y coordinate as the Z coordinate change - Base::setIdentity(); - ElementAt(1,2) = sh; - return *this; - } - - -/* -Given a non singular, non projective matrix (e.g. with the last row equal to [0,0,0,1] ) -This procedure decompose it in a sequence of - Scale,Shear,Rotation e Translation - -- ScaleV and Tranv are obiviously scaling and translation. -- ShearV contains three scalars with, respectively - ShearXY, ShearXZ e ShearYZ -- RotateV contains the rotations (in degree!) around the x,y,z axis - The input matrix is modified leaving inside it a simple roto translation. - - To obtain the original matrix the above transformation have to be applied in the strict following way: - - OriginalMatrix = Trn * Rtx*Rty*Rtz * ShearYZ*ShearXZ*ShearXY * Scl - -Example Code: -double srv() { return (double(rand()%40)-20)/2.0; } // small random value - - srand(time(0)); - Point3d ScV(10+srv(),10+srv(),10+srv()),ScVOut(-1,-1,-1); - Point3d ShV(srv(),srv(),srv()),ShVOut(-1,-1,-1); - Point3d RtV(10+srv(),srv(),srv()),RtVOut(-1,-1,-1); - Point3d TrV(srv(),srv(),srv()),TrVOut(-1,-1,-1); - - Matrix44d Scl; Scl.SetScale(ScV); - Matrix44d Sxy; Sxy.SetShearXY(ShV[0]); - Matrix44d Sxz; Sxz.SetShearXZ(ShV[1]); - Matrix44d Syz; Syz.SetShearYZ(ShV[2]); - Matrix44d Rtx; Rtx.SetRotate(math::ToRad(RtV[0]),Point3d(1,0,0)); - Matrix44d Rty; Rty.SetRotate(math::ToRad(RtV[1]),Point3d(0,1,0)); - Matrix44d Rtz; Rtz.SetRotate(math::ToRad(RtV[2]),Point3d(0,0,1)); - Matrix44d Trn; Trn.SetTranslate(TrV); - - Matrix44d StartM = Trn * Rtx*Rty*Rtz * Syz*Sxz*Sxy *Scl; - Matrix44d ResultM=StartM; - Decompose(ResultM,ScVOut,ShVOut,RtVOut,TrVOut); - - Scl.SetScale(ScVOut); - Sxy.SetShearXY(ShVOut[0]); - Sxz.SetShearXZ(ShVOut[1]); - Syz.SetShearYZ(ShVOut[2]); - Rtx.SetRotate(math::ToRad(RtVOut[0]),Point3d(1,0,0)); - Rty.SetRotate(math::ToRad(RtVOut[1]),Point3d(0,1,0)); - Rtz.SetRotate(math::ToRad(RtVOut[2]),Point3d(0,0,1)); - Trn.SetTranslate(TrVOut); - - // Now Rebuild is equal to StartM - Matrix44d RebuildM = Trn * Rtx*Rty*Rtz * Syz*Sxz*Sxy * Scl ; -*/ -template -bool Decompose(Matrix44 &M, Point3 &ScaleV, Point3 &ShearV, Point3 &RotV,Point3 &TranV) -{ - if(!(M(3,0)==0 && M(3,1)==0 && M(3,2)==0 && M(3,3)==1) ) // the matrix is projective - return false; - if(math::Abs(M.Determinant())<1e-10) return false; // matrix should be at least invertible... - - // First Step recover the traslation - TranV=M.GetColumn3(3); - - // Second Step Recover Scale and Shearing interleaved - ScaleV[0]=Norm(M.GetColumn3(0)); - Point3 R[3]; - R[0]=M.GetColumn3(0); - R[0].Normalize(); - - ShearV[0]=R[0].dot(M.GetColumn3(1)); // xy shearing - R[1]= M.GetColumn3(1)-R[0]*ShearV[0]; - assert(math::Abs(R[1].dot(R[0]))<1e-10); - ScaleV[1]=Norm(R[1]); // y scaling - R[1]=R[1]/ScaleV[1]; - ShearV[0]=ShearV[0]/ScaleV[1]; - - ShearV[1]=R[0].dot(M.GetColumn3(2)); // xz shearing - R[2]= M.GetColumn3(2)-R[0]*ShearV[1]; - assert(math::Abs(R[2].dot(R[0]))<1e-10); - - R[2] = R[2]-R[1]*(R[2].dot(R[1])); - assert(math::Abs(R[2].dot(R[1]))<1e-10); - assert(math::Abs(R[2].dot(R[0]))<1e-10); - - ScaleV[2]=Norm(R[2]); - ShearV[1]=ShearV[1]/ScaleV[2]; - R[2]=R[2]/ScaleV[2]; - assert(math::Abs(R[2].dot(R[1]))<1e-10); - assert(math::Abs(R[2].dot(R[0]))<1e-10); - - ShearV[2]=R[1].dot(M.GetColumn3(2)); // yz shearing - ShearV[2]=ShearV[2]/ScaleV[2]; - int i,j; - for(i=0;i<3;++i) - for(j=0;j<3;++j) - M(i,j)=R[j][i]; - - // Third and last step: Recover the rotation - //now the matrix should be a pure rotation matrix so its determinant is +-1 - double det=M.Determinant(); - if(math::Abs(det)<1e-10) return false; // matrix should be at least invertible... - assert(math::Abs(math::Abs(det)-1.0)<1e-10); // it should be +-1... - if(det<0) { - ScaleV *= -1; - M *= -1; - } - - double alpha,beta,gamma; // rotations around the x,y and z axis - beta=asin( M(0,2)); - double cosbeta=cos(beta); - if(math::Abs(cosbeta) > 1e-5) - { - alpha=asin(-M(1,2)/cosbeta); - if((M(2,2)/cosbeta) < 0 ) alpha=M_PI-alpha; - gamma=asin(-M(0,1)/cosbeta); - if((M(0,0)/cosbeta)<0) gamma = M_PI-gamma; - } - else - { - alpha=asin(-M(1,0)); - if(M(1,1)<0) alpha=M_PI-alpha; - gamma=0; - } - - RotV[0]=math::ToDeg(alpha); - RotV[1]=math::ToDeg(beta); - RotV[2]=math::ToDeg(gamma); - - return true; -} - -/* -To invert a matrix you can -either invert the matrix inplace calling - -vcg::Invert(yourMatrix); - -or get the inverse matrix of a given matrix without touching it: - -invertedMatrix = vcg::Inverse(untouchedMatrix); - -*/ -template Matrix44 & Invert(Matrix44 &m) { - return m = m.lu().inverse(); -} - -template Matrix44 Inverse(const Matrix44 &m) { - return m.lu().inverse(); -} - -template -struct ei_matrix44_product_impl -{ - typedef typename Other::Scalar Scalar; - typedef typename Eigen::ProductReturnType::Base,Other>::Type ResultType; - static ResultType run(const Matrix44& tr, const Other& other) - { return (static_cast::Base&>(tr)) * other; } -}; - -template -struct ei_matrix44_product_impl -{ - typedef typename Other::Scalar Scalar; - typedef Eigen::Matrix ResultType; - static ResultType run(const Matrix44& tr, const Other& p) - { - Scalar w; - Eigen::Matrix s; - s[0] = tr.ElementAt(0, 0)*p[0] + tr.ElementAt(0, 1)*p[1] + tr.ElementAt(0, 2)*p[2] + tr.ElementAt(0, 3); - s[1] = tr.ElementAt(1, 0)*p[0] + tr.ElementAt(1, 1)*p[1] + tr.ElementAt(1, 2)*p[2] + tr.ElementAt(1, 3); - s[2] = tr.ElementAt(2, 0)*p[0] + tr.ElementAt(2, 1)*p[1] + tr.ElementAt(2, 2)*p[2] + tr.ElementAt(2, 3); - w = tr.ElementAt(3, 0)*p[0] + tr.ElementAt(3, 1)*p[1] + tr.ElementAt(3, 2)*p[2] + tr.ElementAt(3, 3); - if(w!= 0) s /= w; - return s; - } -}; - -} //namespace -#endif - -#endif From 341148b961028a5381c934caf3aa2965562bd1a7 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 19 Oct 2021 14:16:53 +0200 Subject: [PATCH 36/56] fix matrix44, remove memset from octree.h --- vcg/math/matrix44.h | 1 + vcg/space/index/octree.h | 14 ++++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/vcg/math/matrix44.h b/vcg/math/matrix44.h index bd9d3a699..9bcc0e304 100644 --- a/vcg/math/matrix44.h +++ b/vcg/math/matrix44.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include diff --git a/vcg/space/index/octree.h b/vcg/space/index/octree.h index 25df7310e..328ae419e 100644 --- a/vcg/space/index/octree.h +++ b/vcg/space/index/octree.h @@ -25,6 +25,7 @@ #define VCG_SPACE_INDEX_OCTREE_H #include +#include #ifdef __glut_h__ #include @@ -212,11 +213,11 @@ namespace vcg public: Octree() { - marks=0; + //marks=0; } ~Octree() { - if(marks) delete []marks; + //if(marks) delete []marks; int node_count = TemplatedOctree::NodeCount(); for (int i=0; i()); std::vector< NodePointer > filled_leaves(placeholder_count); @@ -537,7 +539,7 @@ namespace vcg /*! * Markers used to avoid duplication of the same result during a query */ - unsigned char *marks; + std::vector marks; unsigned char global_mark; /*! @@ -561,7 +563,7 @@ namespace vcg global_mark = (global_mark+1)%255; if (global_mark == 0) { - memset(&marks[0], 0, sizeof(unsigned char)*int(sorted_dataset.size())); + std::fill(marks.begin(), marks.begin() + sorted_dataset.size(), 0); global_mark++; } };//end of IncrementMark From 0bb69855d96724d781d6a93804eee646d427ec29 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 19 Oct 2021 14:33:26 +0200 Subject: [PATCH 37/56] removed other memset --- vcg/space/index/octree.h | 1 - vcg/space/index/octree_template.h | 9 ++++++--- wrap/io_trimesh/export_idtf.h | 9 +++++---- wrap/io_trimesh/import_raw.h | 4 +++- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/vcg/space/index/octree.h b/vcg/space/index/octree.h index 328ae419e..6815fcd8a 100644 --- a/vcg/space/index/octree.h +++ b/vcg/space/index/octree.h @@ -310,7 +310,6 @@ namespace vcg global_mark = 1; marks.resize(placeholder_count); std::fill(marks.begin(), marks.end(), 0); - //memset(&marks[0], 0, sizeof(unsigned char)*placeholder_count); std::sort(placeholders.begin(), placeholders.end(), ObjectSorter< NodeType >()); std::vector< NodePointer > filled_leaves(placeholder_count); diff --git a/vcg/space/index/octree_template.h b/vcg/space/index/octree_template.h index 7a2f1d71f..96aca8272 100644 --- a/vcg/space/index/octree_template.h +++ b/vcg/space/index/octree_template.h @@ -28,6 +28,8 @@ #include #include #include +#include +#include namespace vcg @@ -111,7 +113,7 @@ class OctreeTemplate InnerNode() : Node() {} InnerNode(NodePointer parent, int level) : Node(parent, level) { - memset(&sons[0], 0, 8*sizeof(Node*)); + sons.fill(nullptr); } inline NodePointer &Son(int sonIndex) @@ -125,7 +127,7 @@ class OctreeTemplate return false; } - NodePointer sons[8]; + std::array sons; }; /* @@ -598,7 +600,8 @@ class OctreeTemplate assert( boundingBox.min.Y()<=p.Y() && p.Y()<=boundingBox.max.Y() ); assert( boundingBox.min.Z()<=p.Z() && p.Z()<=boundingBox.max.Z() ); - memset(route, NULL, maximumDepth*sizeof(NodePointer)); + for (unsigned int i = 0; i < maximumDepth; ++i) + route[i] = nullptr; CenterType path = CenterType::Construct(Interize(p)); int shift = maximumDepth-1; diff --git a/wrap/io_trimesh/export_idtf.h b/wrap/io_trimesh/export_idtf.h index ac393c409..e711ee61e 100644 --- a/wrap/io_trimesh/export_idtf.h +++ b/wrap/io_trimesh/export_idtf.h @@ -159,7 +159,8 @@ class TGA_Exporter tga.colourmaptype = 0; tga.imagetype = 2; - memset(tga.colormapspecs,0,5); + for (unsigned int i = 0; i < 5; ++i) + tga.colormapspecs[i] = '\0'; tga.xstart = (short) im.offset().x(); tga.ystart = (short) im.offset().y(); tga.height = (short) im.height(); @@ -180,10 +181,10 @@ class TGA_Exporter //is a 8-digits binary number code // always 0 0 | mirroring | bits //(future uses)| image | for alpha-channel - //-------------------------------------------- - // 7 6 | 5 4 | 3 2 1 0 //-------------------------------------------- - // 0 0 | 1 0 | 1 0 0 0 + // 7 6 | 5 4 | 3 2 1 0 + //-------------------------------------------- + // 0 0 | 1 0 | 1 0 0 0 tga.descriptor = (char) 40; tga.bits = (char) 32; } diff --git a/wrap/io_trimesh/import_raw.h b/wrap/io_trimesh/import_raw.h index 44773f553..a617a9543 100644 --- a/wrap/io_trimesh/import_raw.h +++ b/wrap/io_trimesh/import_raw.h @@ -347,7 +347,9 @@ static int Open( MESH_TYPE &m, const char * filename, bool triangulate=false, in //read a new line ii=0; - memset( rawline, 0, 512); + for (unsigned int i = 0; i < 512; ++i) + rawline[i] = 0; + //memset( rawline, 0, 512); fread(&(rawline[ii++]),sizeof(char),1,fp); while( (rawline[ii-1] != '\n') && (ii<512) ) { From 9cb1a267fa97f5248092171854672bbbb7999185 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 19 Oct 2021 14:37:57 +0200 Subject: [PATCH 38/56] fix octree.h, char -> unsigned char --- vcg/space/index/octree.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vcg/space/index/octree.h b/vcg/space/index/octree.h index 6815fcd8a..076f0eab7 100644 --- a/vcg/space/index/octree.h +++ b/vcg/space/index/octree.h @@ -538,7 +538,7 @@ namespace vcg /*! * Markers used to avoid duplication of the same result during a query */ - std::vector marks; + std::vector marks; unsigned char global_mark; /*! From b8bb88063e52fe385f9c930587b3a4bf3212d5fa Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 19 Oct 2021 15:06:28 +0200 Subject: [PATCH 39/56] remove memcpy from point_matching_scale.h --- vcg/complex/algorithms/point_matching_scale.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/vcg/complex/algorithms/point_matching_scale.h b/vcg/complex/algorithms/point_matching_scale.h index 2acfb2a1f..ca14fe387 100644 --- a/vcg/complex/algorithms/point_matching_scale.h +++ b/vcg/complex/algorithms/point_matching_scale.h @@ -93,7 +93,8 @@ class PointMatchingScale { // rtm = rototranslation RotoTranslation rt; vcg::Matrix44d rtm; - memcpy(&rt._v[0],&x[1],6*sizeof(double)); + for (unsigned int i = 0; i < 6; ++i) + rt._v[i] = x[i+1]; rt.toMatrix(rtm); // res= scaling w.r.t. barycenter @@ -122,7 +123,8 @@ class PointMatchingScale { RotoTranslation rt; vcg::Matrix44d m; - memcpy(&rt._v[0],&x[1],6*sizeof(double)); + for (unsigned int i = 0; i < 6; ++i) + rt._v[i] = x[i+1]; rt.toMatrix(m); for(; i != mov->end(); ++i,++ifix) { From 93538361062787586622bf0665e10550adfe83d8 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 19 Oct 2021 15:31:06 +0200 Subject: [PATCH 40/56] remove memcpy on allocate.h --- vcg/complex/allocate.h | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/vcg/complex/allocate.h b/vcg/complex/allocate.h index b4b337d6e..ee96b2c9d 100644 --- a/vcg/complex/allocate.h +++ b/vcg/complex/allocate.h @@ -2267,8 +2267,10 @@ class Allocator for(size_t i = 0; i < m.vert.size(); ++i){ ATTR_TYPE * dest = &(*_handle)[i]; char * ptr = (char*)( ((SimpleTempDataBase *)pa._handle)->DataBegin()); - memcpy((void*)dest , - (void*) &(ptr[i * pa._sizeof ]) ,sizeof(ATTR_TYPE)); + ATTR_TYPE* attrptr = (ATTR_TYPE*)ptr; + *dest = attrptr[i * pa._sizeof ]; + //memcpy((void*)dest , + //(void*) &(ptr[i * pa._sizeof ]) ,sizeof(ATTR_TYPE)); } // remove the padded container @@ -2294,8 +2296,10 @@ class Allocator for(size_t i = 0; i < m.edge.size(); ++i){ ATTR_TYPE * dest = &(*_handle)[i]; char * ptr = (char*)( ((SimpleTempDataBase *)pa._handle)->DataBegin()); - memcpy((void*)dest , - (void*) &(ptr[i * pa._sizeof ]) ,sizeof(ATTR_TYPE)); + ATTR_TYPE* attrptr = (ATTR_TYPE*)ptr; + *dest = attrptr[i * pa._sizeof ]; + //memcpy((void*)dest , + //(void*) &(ptr[i * pa._sizeof ]) ,sizeof(ATTR_TYPE)); } // remove the padded container @@ -2322,8 +2326,10 @@ class Allocator for(size_t i = 0; i < m.face.size(); ++i){ ATTR_TYPE * dest = &(*_handle)[i]; char * ptr = (char*)( ((SimpleTempDataBase *)pa._handle)->DataBegin()); - memcpy((void*)dest , - (void*) &(ptr[i * pa._sizeof ]) ,sizeof(ATTR_TYPE)); + ATTR_TYPE* attrptr = (ATTR_TYPE*)ptr; + *dest = attrptr[i * pa._sizeof ]; + //memcpy((void*)dest , + // (void*) &(ptr[i * pa._sizeof ]) ,sizeof(ATTR_TYPE)); } // remove the padded container @@ -2352,8 +2358,10 @@ class Allocator { ATTR_TYPE *dest = &(*_handle)[i]; char *ptr = (char *)(((SimpleTempDataBase *)pa._handle)->DataBegin()); - memcpy((void *)dest, - (void *)&(ptr[i * pa._sizeof]), sizeof(ATTR_TYPE)); + ATTR_TYPE* attrptr = (ATTR_TYPE*)ptr; + *dest = attrptr[i * pa._sizeof ]; + //memcpy((void *)dest, + //(void *)&(ptr[i * pa._sizeof]), sizeof(ATTR_TYPE)); } // remove the padded container @@ -2376,8 +2384,11 @@ class Allocator Attribute * _handle = new Attribute(); // copy the padded container in the new one - char * ptr = (char*)( ((Attribute *)pa._handle)->DataBegin()); - memcpy((void*)_handle->DataBegin() ,(void*) &(ptr[0]) ,sizeof(ATTR_TYPE)); + ATTR_TYPE* dest = (ATTR_TYPE*)_handle->DataBegin(); + char* ptr = (char*)( ((Attribute *)pa._handle)->DataBegin()); + ATTR_TYPE* attrptr = (ATTR_TYPE*)ptr; + *dest = *attrptr; + //memcpy((void*)dest ,(void*) &(ptr[0]) ,sizeof(ATTR_TYPE)); // remove the padded container delete ( (Attribute *) pa._handle); From 9dccb764ed42a24fac1a6cb87f4fe33fd764d345 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 19 Oct 2021 15:46:14 +0200 Subject: [PATCH 41/56] remove memcpy on simple_temporary_data.h --- vcg/container/simple_temporary_data.h | 28 +++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/vcg/container/simple_temporary_data.h b/vcg/container/simple_temporary_data.h index 13db925e7..f414bcd7d 100644 --- a/vcg/container/simple_temporary_data.h +++ b/vcg/container/simple_temporary_data.h @@ -66,18 +66,22 @@ class VectorNBW delete[] booldata; } - void reserve(size_t sz) - { - if (sz <= datareserve) - return; - bool *newdataLoc = new bool[sz]; - if (datasize != 0) - memcpy(newdataLoc, booldata, sizeof(bool) * sizeof(datasize)); - std::swap(booldata, newdataLoc); - if (newdataLoc != 0) - delete[] newdataLoc; - datareserve = sz; - } + void reserve(size_t sz) + { + if (sz <= datareserve) + return; + bool* newdataLoc = new bool[sz]; + if (datasize != 0) { + // memcpy(newdataLoc, booldata, sizeof(bool) * sizeof(datasize)); + for (unsigned int i = 0; i < datasize; ++i) + newdataLoc[i] = booldata[i]; + } + + std::swap(booldata, newdataLoc); + if (newdataLoc != 0) + delete[] newdataLoc; + datareserve = sz; + } void resize(size_t sz) { From 78cad04cb96f4c8778de907f64a4eda846048f9d Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 19 Oct 2021 17:44:19 +0200 Subject: [PATCH 42/56] remove sprintf from plymc.h --- vcg/complex/algorithms/create/plymc/plymc.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vcg/complex/algorithms/create/plymc/plymc.h b/vcg/complex/algorithms/create/plymc/plymc.h index d01ed8707..9d6f5dcaf 100644 --- a/vcg/complex/algorithms/create/plymc/plymc.h +++ b/vcg/complex/algorithms/create/plymc/plymc.h @@ -173,7 +173,7 @@ class PlyMC MeshProvider MP; Parameter p; Volume VV; - char errorMessage[1024]; + std::string errorMessage; /// PLYMC Methods @@ -193,7 +193,7 @@ class PlyMC { if(m.FN()==0) { - sprintf(errorMessage,"%sError: mesh has not per vertex normals\n",errorMessage); + errorMessage = "Error: mesh has not per vertex normals\n"; return false; } else @@ -214,7 +214,7 @@ class PlyMC tri::Allocator::CompactEveryVector(m); if(badNormalCnt > m.VN()/10) { - sprintf(errorMessage,"%sError: mesh has null normals\n",errorMessage); + errorMessage = "Error: mesh has null normals\n"; return false; } @@ -340,7 +340,7 @@ class PlyMC bool Process(vcg::CallBackPos *cb=0) { - sprintf(errorMessage,"%s", ""); + errorMessage = ""; printf("bbox scanning...\n"); fflush(stdout); Matrix44f Id; Id.SetIdentity(); MP.InitBBox(); @@ -419,7 +419,7 @@ bool Process(vcg::CallBackPos *cb=0) res = InitMesh(*sm,MP.MeshName(i).c_str(),MP.Tr(i)); if(!res) { - sprintf(errorMessage,"%sFailed Init of mesh %s\n",errorMessage,MP.MeshName(i).c_str()); + errorMessage = "Failed Init of mesh " +MP.MeshName(i); return false ; } } From 10e8502717ef68230f085affe797dc237dffd533 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 19 Oct 2021 18:25:28 +0200 Subject: [PATCH 43/56] remove sprintf from hole.h, plymc.h and volume.h --- vcg/complex/algorithms/create/plymc/plymc.h | 6 +++--- vcg/complex/algorithms/create/plymc/volume.h | 8 ++++---- vcg/complex/algorithms/hole.h | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/vcg/complex/algorithms/create/plymc/plymc.h b/vcg/complex/algorithms/create/plymc/plymc.h index 9d6f5dcaf..c90f233dc 100644 --- a/vcg/complex/algorithms/create/plymc/plymc.h +++ b/vcg/complex/algorithms/create/plymc/plymc.h @@ -597,7 +597,6 @@ int MCSimplify( MeshType &m, float absoluteError, bool preserveBB, vcg::CallBack //qDebug("Simplifying at absoluteError=%f",absoluteError); float TargetError = absoluteError; - char buf[1024]; DeciSession.template Init< MyColl > (); pp.areaThr=TargetError*TargetError; @@ -605,8 +604,9 @@ int MCSimplify( MeshType &m, float absoluteError, bool preserveBB, vcg::CallBack if(TargetError < std::numeric_limits::max() ) DeciSession.SetTargetMetric(TargetError); while(DeciSession.DoOptimization() && DeciSession.currMetric < TargetError) { - sprintf(buf,"Simplyfing %7i err %9g \r",m.fn,DeciSession.currMetric); - if (cb) cb(int(100.0f*DeciSession.currMetric/TargetError),buf); + std::string buf = "Simplyfing " + std::to_string(m.fn) + " err " + std::to_string(DeciSession.currMetric) + " \r"; + if (cb) + cb(int(100.0f*DeciSession.currMetric/TargetError),buf.c_str()); } return 1; //success diff --git a/vcg/complex/algorithms/create/plymc/volume.h b/vcg/complex/algorithms/create/plymc/volume.h index 0a9ba7fce..8f654ee91 100644 --- a/vcg/complex/algorithms/create/plymc/volume.h +++ b/vcg/complex/algorithms/create/plymc/volume.h @@ -42,7 +42,7 @@ const char *SFormat( const char * f, ... ) static char buf[4096]; va_list marker; va_start( marker, f ); - vsprintf(buf,f,marker); + vsnprintf(buf,4096,f,marker); va_end( marker ); return buf; } @@ -301,9 +301,9 @@ void SetSubPart(Point3i _div, Point3i _pos) void GetSubVolumeTag(std::string &subtag) { char buf[32]; - if (div[0]<= 10 && div[1]<= 10 && div[2]<= 10 ) sprintf(buf,"_%01d%01d%01d",pos[0],pos[1],pos[2]); - else if(div[0]<= 100 && div[1]<= 100 && div[2]<= 100 ) sprintf(buf,"_%02d%02d%02d",pos[0],pos[1],pos[2]); - else sprintf(buf,"_%03d%03d%03d",pos[0],pos[1],pos[2]); + if (div[0]<= 10 && div[1]<= 10 && div[2]<= 10 ) snprintf(buf,32,"_%01d%01d%01d",pos[0],pos[1],pos[2]); + else if(div[0]<= 100 && div[1]<= 100 && div[2]<= 100 ) snprintf(buf,32,"_%02d%02d%02d",pos[0],pos[1],pos[2]); + else snprintf(buf,32,"_%03d%03d%03d",pos[0],pos[1],pos[2]); subtag=buf; } diff --git a/vcg/complex/algorithms/hole.h b/vcg/complex/algorithms/hole.h index ecb2256be..70e6aae7d 100644 --- a/vcg/complex/algorithms/hole.h +++ b/vcg/complex/algorithms/hole.h @@ -291,8 +291,8 @@ template class MinimumWeightEar : public TrivialEar typename MESH::ScalarType aspectRatio; const char * Dump() { static char buf[200]; - if(this->IsConcave()) sprintf(buf,"Dihedral -(deg) %6.2f Quality %6.2f\n",math::ToDeg(dihedralRad),aspectRatio); - else sprintf(buf,"Dihedral (deg) %6.2f Quality %6.2f\n",math::ToDeg(dihedralRad),aspectRatio); + if(this->IsConcave()) snprintf(buf,200,"Dihedral -(deg) %6.2f Quality %6.2f\n",math::ToDeg(dihedralRad),aspectRatio); + else snprintf(buf,200,"Dihedral (deg) %6.2f Quality %6.2f\n",math::ToDeg(dihedralRad),aspectRatio); return buf; } From feb2f2c3bce2d3a44aac45d515ac57fada2193a8 Mon Sep 17 00:00:00 2001 From: Paolo Cignoni Date: Tue, 19 Oct 2021 18:56:48 +0200 Subject: [PATCH 44/56] removed memset from isosurfacing classes --- .../algorithms/create/mc_trivial_walker.h | 46 +++++------ vcg/complex/algorithms/create/resampler.h | 77 ++++++++++++------- 2 files changed, 69 insertions(+), 54 deletions(-) diff --git a/vcg/complex/algorithms/create/mc_trivial_walker.h b/vcg/complex/algorithms/create/mc_trivial_walker.h index 8a7455600..ac670fe7b 100644 --- a/vcg/complex/algorithms/create/mc_trivial_walker.h +++ b/vcg/complex/algorithms/create/mc_trivial_walker.h @@ -166,12 +166,11 @@ class TrivialWalker { _bbox = subbox; _slice_dimension = _bbox.DimX()*_bbox.DimZ(); - - _x_cs = new VertexIndex[ _slice_dimension ]; - _y_cs = new VertexIndex[ _slice_dimension ]; - _z_cs = new VertexIndex[ _slice_dimension ]; - _x_ns = new VertexIndex[ _slice_dimension ]; - _z_ns = new VertexIndex[ _slice_dimension ]; + _x_cs.resize(_slice_dimension); + _y_cs.resize(_slice_dimension); + _z_cs.resize(_slice_dimension); + _x_ns.resize(_slice_dimension); + _z_ns.resize(_slice_dimension); } TrivialWalker() @@ -321,23 +320,22 @@ class TrivialWalker int _slice_dimension; int _current_slice; - - VertexIndex *_x_cs; // indici dell'intersezioni della superficie lungo gli Xedge della fetta corrente - VertexIndex *_y_cs; // indici dell'intersezioni della superficie lungo gli Yedge della fetta corrente - VertexIndex *_z_cs; // indici dell'intersezioni della superficie lungo gli Zedge della fetta corrente - VertexIndex *_x_ns; // indici dell'intersezioni della superficie lungo gli Xedge della prossima fetta - VertexIndex *_z_ns; // indici dell'intersezioni della superficie lungo gli Zedge della prossima fetta + + std::vector _x_cs; // indici dell'intersezioni della superficie lungo gli Xedge della fetta corrente + std::vector _y_cs; // indici dell'intersezioni della superficie lungo gli Yedge della fetta corrente + std::vector _z_cs; // indici dell'intersezioni della superficie lungo gli Zedge della fetta corrente + std::vector _x_ns; // indici dell'intersezioni della superficie lungo gli Xedge della prossima fetta + std::vector _z_ns; // indici dell'intersezioni della superficie lungo gli Zedge della prossima fetta MeshType *_mesh; VolumeType *_volume; - - float _thr; + + float _thr; void NextYSlice() { - memset(_x_cs, -1, _slice_dimension*sizeof(VertexIndex)); - memset(_y_cs, -1, _slice_dimension*sizeof(VertexIndex)); - memset(_z_cs, -1, _slice_dimension*sizeof(VertexIndex)); - + std::fill(_x_cs.begin(),_x_cs.end(),-1); + std::fill(_y_cs.begin(),_y_cs.end(),-1); + std::fill(_z_cs.begin(),_z_cs.end(),-1); std::swap(_x_cs, _x_ns); std::swap(_z_cs, _z_ns); @@ -347,13 +345,11 @@ class TrivialWalker void Begin() { _current_slice = _bbox.min.Y(); - - memset(_x_cs, -1, _slice_dimension*sizeof(VertexIndex)); - memset(_y_cs, -1, _slice_dimension*sizeof(VertexIndex)); - memset(_z_cs, -1, _slice_dimension*sizeof(VertexIndex)); - memset(_x_ns, -1, _slice_dimension*sizeof(VertexIndex)); - memset(_z_ns, -1, _slice_dimension*sizeof(VertexIndex)); - + std::fill(_x_cs.begin(),_x_cs.end(),-1); + std::fill(_y_cs.begin(),_y_cs.end(),-1); + std::fill(_z_cs.begin(),_z_cs.end(),-1); + std::fill(_x_ns.begin(),_x_ns.end(),-1); + std::fill(_z_ns.begin(),_z_ns.end(),-1); } }; } // end namespace tri diff --git a/vcg/complex/algorithms/create/resampler.h b/vcg/complex/algorithms/create/resampler.h index edf9eae58..94a484ec5 100644 --- a/vcg/complex/algorithms/create/resampler.h +++ b/vcg/complex/algorithms/create/resampler.h @@ -74,19 +74,22 @@ class Resampler : public BasicGrid //typedef tri::FaceTmark MarkerFace; typedef vcg::tri::EmptyTMark MarkerFace; MarkerFace markerFunctor; - - VertexIndex *_x_cs; // indici dell'intersezioni della superficie lungo gli Xedge della fetta corrente - VertexIndex *_y_cs; // indici dell'intersezioni della superficie lungo gli Yedge della fetta corrente - VertexIndex *_z_cs; // indici dell'intersezioni della superficie lungo gli Zedge della fetta corrente - VertexIndex *_x_ns; // indici dell'intersezioni della superficie lungo gli Xedge della prossima fetta - VertexIndex *_z_ns; // indici dell'intersezioni della superficie lungo gli Zedge della prossima fetta + + std::vector _x_cs; // indici dell'intersezioni della superficie lungo gli Xedge della fetta corrente + std::vector _y_cs; // indici dell'intersezioni della superficie lungo gli Yedge della fetta corrente + std::vector _z_cs; // indici dell'intersezioni della superficie lungo gli Zedge della fetta corrente + std::vector _x_ns; // indici dell'intersezioni della superficie lungo gli Xedge della prossima fetta + std::vector _z_ns; // indici dell'intersezioni della superficie lungo gli Zedge della prossima fetta //float *_v_cs;///values of distance fields for each direction in current slice //float *_v_ns;///values of distance fields for each direction in next slice typedef typename std::pair field_value; - field_value* _v_cs; - field_value* _v_ns; + std::vector _v_cs; + std::vector _v_ns; + +// field_value* _v_cs; +// field_value* _v_ns; NewMeshType *_newM; OldMeshType *_oldM; @@ -110,15 +113,22 @@ class Resampler : public BasicGrid DiscretizeFlag=false; MultiSampleFlag=false; AbsDistFlag=false; - - _x_cs = new VertexIndex[ SliceSize ]; - _y_cs = new VertexIndex[ SliceSize ]; - _z_cs = new VertexIndex[ SliceSize ]; - _x_ns = new VertexIndex[ SliceSize ]; - _z_ns = new VertexIndex[ SliceSize ]; - - _v_cs= new field_value[(this->siz.X()+1)*(this->siz.Z()+1)]; - _v_ns= new field_value[(this->siz.X()+1)*(this->siz.Z()+1)]; + + _x_cs.resize(SliceSize); + _y_cs.resize(SliceSize); + _z_cs.resize(SliceSize); + _x_ns.resize(SliceSize); + _z_ns.resize(SliceSize); +// _x_cs = new VertexIndex[ SliceSize ]; +// _y_cs = new VertexIndex[ SliceSize ]; +// _z_cs = new VertexIndex[ SliceSize ]; +// _x_ns = new VertexIndex[ SliceSize ]; +// _z_ns = new VertexIndex[ SliceSize ]; + + _v_cs.resize((this->siz.X()+1)*(this->siz.Z()+1)); + _v_ns.resize((this->siz.X()+1)*(this->siz.Z()+1)); +// _v_cs= new field_value[(this->siz.X()+1)*(this->siz.Z()+1)]; +// _v_ns= new field_value[(this->siz.X()+1)*(this->siz.Z()+1)]; }; @@ -232,7 +242,7 @@ class Resampler : public BasicGrid /// compute the values if an entire slice (per y) distances>dig of a cell are signed with double of /// the distance of the bb - void ComputeSliceValues(int slice,field_value *slice_values) + void ComputeSliceValues(int slice,std::vector &slice_values) { #pragma omp parallel for schedule(dynamic, 10) for (int i=0; i<=this->siz.X(); i++) @@ -252,7 +262,7 @@ class Resampler : public BasicGrid For some reasons it can happens that the sign of the computed distance could not correct. this function tries to correct these issues by flipping the isolated voxels with discordant sign */ - void ComputeConsensus(int /*slice*/, field_value *slice_values) + void ComputeConsensus(int /*slice*/, std::vector &slice_values) { float max_dist = min(min(this->voxel[0],this->voxel[1]),this->voxel[2]); int flippedCnt=0; @@ -363,10 +373,13 @@ class Resampler : public BasicGrid //swap slices , the initial value of distance fields ids set as double of bbox of space void NextSlice() { - - memset(_x_cs, -1, SliceSize*sizeof(VertexIndex)); - memset(_y_cs, -1, SliceSize*sizeof(VertexIndex)); - memset(_z_cs, -1, SliceSize*sizeof(VertexIndex)); + + std::fill(_x_cs.begin(),_x_cs.end(),-1); + std::fill(_y_cs.begin(),_y_cs.end(),-1); + std::fill(_z_cs.begin(),_z_cs.end(),-1); +// memset(_x_cs, -1, SliceSize*sizeof(VertexIndex)); +// memset(_y_cs, -1, SliceSize*sizeof(VertexIndex)); +// memset(_z_cs, -1, SliceSize*sizeof(VertexIndex)); std::swap(_x_cs, _x_ns); @@ -384,12 +397,18 @@ class Resampler : public BasicGrid { CurrentSlice = 0; - - memset(_x_cs, -1, SliceSize*sizeof(VertexIndex)); - memset(_y_cs, -1, SliceSize*sizeof(VertexIndex)); - memset(_z_cs, -1, SliceSize*sizeof(VertexIndex)); - memset(_x_ns, -1, SliceSize*sizeof(VertexIndex)); - memset(_z_ns, -1, SliceSize*sizeof(VertexIndex)); + + std::fill(_x_cs.begin(),_x_cs.end(),-1); + std::fill(_y_cs.begin(),_y_cs.end(),-1); + std::fill(_z_cs.begin(),_z_cs.end(),-1); + std::fill(_x_ns.begin(),_x_ns.end(),-1); + std::fill(_z_ns.begin(),_z_ns.end(),-1); + +// memset(_x_cs, -1, SliceSize*sizeof(VertexIndex)); +// memset(_y_cs, -1, SliceSize*sizeof(VertexIndex)); +// memset(_z_cs, -1, SliceSize*sizeof(VertexIndex)); +// memset(_x_ns, -1, SliceSize*sizeof(VertexIndex)); +// memset(_z_ns, -1, SliceSize*sizeof(VertexIndex)); ComputeSliceValues(CurrentSlice,_v_cs); ComputeSliceValues(CurrentSlice+1,_v_ns); From 875d659719024c64431d07046130d271be1f9ec2 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Wed, 20 Oct 2021 08:48:06 +0200 Subject: [PATCH 45/56] remove sprintf from edge collapse algorithms --- .../algorithms/local_optimization/quad_diag_collapse.h | 9 ++++++--- .../algorithms/local_optimization/tri_edge_collapse.h | 9 ++++++--- .../algorithms/local_optimization/tri_edge_flip.h | 9 ++++++--- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/vcg/complex/algorithms/local_optimization/quad_diag_collapse.h b/vcg/complex/algorithms/local_optimization/quad_diag_collapse.h index 94d65353e..f2dea23ad 100755 --- a/vcg/complex/algorithms/local_optimization/quad_diag_collapse.h +++ b/vcg/complex/algorithms/local_optimization/quad_diag_collapse.h @@ -358,9 +358,12 @@ namespace vcg{ virtual const char *Info(MeshType &m) { - static char buf[60]; - sprintf(buf,"(%d - %d) %g\n", hp->HVp()-&m.vert[0], hp->HNp()->HNp()->HVp()-&m.vert[0], -_priority); - return buf; + static std::string msg; + msg = + "(" + std::to_string(hp->HVp()-&m.vert[0]) + + " - " + std::to_string(hp->HNp()->HNp()->HVp()-&m.vert[0]) + + ") " + std::to_string(-_priority) + "\n"; + return msg.c_str(); } /*! diff --git a/vcg/complex/algorithms/local_optimization/tri_edge_collapse.h b/vcg/complex/algorithms/local_optimization/tri_edge_collapse.h index 309210dab..0a4a86938 100644 --- a/vcg/complex/algorithms/local_optimization/tri_edge_collapse.h +++ b/vcg/complex/algorithms/local_optimization/tri_edge_collapse.h @@ -115,9 +115,12 @@ class TriEdgeCollapse: public LocalOptimization::LocModType virtual const char *Info(TriMeshType &m) { mt = &m; - static char buf[60]; - sprintf(buf,"%i -> %i %g\n", int(pos.V(0)-&m.vert[0]), int(pos.V(1)-&m.vert[0]),-_priority); - return buf; + static std::string msg; + msg = + std::to_string(int(pos.V(0)-&m.vert[0])) + " -> " + + std::to_string(int(pos.V(1)-&m.vert[0])) + + " " + std::to_string(-_priority) + "\n"; + return msg.c_str(); } inline void Execute(TriMeshType &m, BaseParameterClass *) diff --git a/vcg/complex/algorithms/local_optimization/tri_edge_flip.h b/vcg/complex/algorithms/local_optimization/tri_edge_flip.h index 29f26b5f2..2ad4d64e4 100644 --- a/vcg/complex/algorithms/local_optimization/tri_edge_flip.h +++ b/vcg/complex/algorithms/local_optimization/tri_edge_flip.h @@ -283,9 +283,12 @@ class PlanarEdgeFlip : */ const char* Info(TRIMESH_TYPE &m) { - static char dump[60]; - sprintf(dump,"%zu -> %zu %g\n", tri::Index(m,_pos.F()->V(0)), tri::Index(m,_pos.F()->V(1)),-_priority); - return dump; + static std::string msg; + msg = + std::to_string(tri::Index(m,_pos.F()->V(0))) + " -> " + + std::to_string(tri::Index(m,_pos.F()->V(1))) + + " " + std::to_string(-_priority) + "\n"; + return msg.c_str(); } /*! From 4d6c87c579ea022c7468f9525b1adffd9daa5ac4 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Wed, 20 Oct 2021 09:38:07 +0200 Subject: [PATCH 46/56] remove sprintf from meshtree and perfect_sparial_hashing --- vcg/complex/algorithms/meshtree.h | 26 ++++++++++++++--------- vcg/space/index/perfect_spatial_hashing.h | 2 +- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/vcg/complex/algorithms/meshtree.h b/vcg/complex/algorithms/meshtree.h index de9f12a89..42c21c2f2 100644 --- a/vcg/complex/algorithms/meshtree.h +++ b/vcg/complex/algorithms/meshtree.h @@ -128,8 +128,9 @@ namespace vcg { void Process(vcg::AlignPair::Param& ap, MeshTree::Param& mtp) { std::array buf; - std::sprintf( + std::snprintf( buf.data(), + 1024, "Starting Processing of %i glued meshes out of %zu meshes\n", gluedNum(), nodeMap.size()); @@ -137,7 +138,7 @@ namespace vcg { /******* Occupancy Grid Computation *************/ buf.fill('\0'); - std::sprintf(buf.data(), "Computing Overlaps %i glued meshes...\n", gluedNum()); + std::snprintf(buf.data(), 1024, "Computing Overlaps %i glued meshes...\n", gluedNum()); cb(0, buf.data()); OG.Init( @@ -196,8 +197,9 @@ namespace vcg { // if there are no arcs at all complain and return if (totalArcNum == 0) { buf.fill('\0'); - std::sprintf( + std::snprintf( buf.data(), + 1024, "\n Failure. There are no overlapping meshes?\n No candidate alignment arcs. " "Nothing Done.\n"); cb(0, buf.data()); @@ -210,12 +212,12 @@ namespace vcg { num_max_thread = omp_get_max_threads(); #endif buf.fill('\0'); - std::sprintf( - buf.data(), "Arc with good overlap %6zu (on %6zu)\n", totalArcNum, OG.SVA.size()); + std::snprintf( + buf.data(), 1024,"Arc with good overlap %6zu (on %6zu)\n", totalArcNum, OG.SVA.size()); cb(0, buf.data()); buf.fill('\0'); - std::sprintf(buf.data(), " %6i preserved %i Recalc \n", preservedArcNum, recalcArcNum); + std::snprintf(buf.data(), 1024," %6i preserved %i Recalc \n", preservedArcNum, recalcArcNum); cb(0, buf.data()); bool hasValidAlign = false; @@ -244,8 +246,9 @@ namespace vcg { #pragma omp critical buf.fill('\0'); - std::sprintf( + std::snprintf( buf.data(), + 1024, "(%3i/%3zu) %2i -> %2i Aligned AvgErr dd=%f -> dd=%f \n", i + 1, totalArcNum, @@ -258,8 +261,9 @@ namespace vcg { else { #pragma omp critical buf.fill('\0'); - std::sprintf( + std::snprintf( buf.data(), + 1024, "(%3i/%3zu) %2i -> %2i Failed Alignment of one arc %s\n", i + 1, totalArcNum, @@ -274,8 +278,9 @@ namespace vcg { // if there are no valid arcs complain and return if (!hasValidAlign) { buf.fill('\0'); - std::sprintf( + std::snprintf( buf.data(), + 1024, "\n Failure. No successful arc among candidate Alignment arcs. Nothing " "Done.\n"); cb(0, buf.data()); @@ -289,8 +294,9 @@ namespace vcg { } buf.fill('\0'); - std::sprintf( + std::snprintf( buf.data(), + 1024, "Completed Mesh-Mesh Alignment: Avg Err %5.3f; Median %5.3f; 90%% %5.3f\n", H.Avg(), H.Percentile(0.5f), diff --git a/vcg/space/index/perfect_spatial_hashing.h b/vcg/space/index/perfect_spatial_hashing.h index bbcbdef94..cf253bc08 100644 --- a/vcg/space/index/perfect_spatial_hashing.h +++ b/vcg/space/index/perfect_spatial_hashing.h @@ -1462,7 +1462,7 @@ namespace vcg m_OffsetTable.GetPreImageSortedPerCardinality(preimage_slots); char msg[128]; - sprintf(msg, "Building offset table of resolution %d", m_OffsetTable.GetSize()); + snprintf(msg, 128, "Building offset table of resolution %d", m_OffsetTable.GetSize()); int step = int(preimage_slots.size())/100; int number_of_slots = int(preimage_slots.size()); int perc = 0; From 412c904a179357d52d511fa6fb2b1503eab77a7d Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Wed, 20 Oct 2021 10:29:25 +0200 Subject: [PATCH 47/56] remove fscanf from outline2_packer.h --- vcg/space/outline2_packer.h | 41 ++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/vcg/space/outline2_packer.h b/vcg/space/outline2_packer.h index 5343ad0b1..384bfda60 100644 --- a/vcg/space/outline2_packer.h +++ b/vcg/space/outline2_packer.h @@ -1,4 +1,4 @@ -/**************************************************************************** +/**************************************************************************** * VCGLib o o * * Visual and Computer Graphics Library o o * * _ O _ * @@ -24,6 +24,7 @@ #define __VCG_OUTLINE2_PACKER_H__ #include +#include #include #include #include @@ -212,26 +213,24 @@ static bool WritePolyVec(const std::vector< std::vector > &polyVec, con static bool ReadPolyVec(std::vector< std::vector > &polyVec, const char *filename) { - FILE *fp=fopen(filename,"r"); - if(!fp) return false; - int sz; - fscanf(fp,"%i\n",&sz); - polyVec.clear(); - polyVec.resize(sz); - for(size_t i=0;i> sz; + polyVec.resize(sz); + for (std::size_t i = 0; i < sz; ++i){ + int isz; + ifs >> isz; + polyVec[i].resize(isz); + for (std::size_t j = 0; j < isz; ++j){ + float x, y; + ifs >> x >> y; + polyVec[i][j].X() = x; + polyVec[i][j].Y() = y; + } + } + ifs.close(); + return true; } From 18e841e3d029e195efd850b45b96225bfbffe401 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Wed, 20 Oct 2021 11:27:02 +0200 Subject: [PATCH 48/56] fix import_dae, see #24 --- wrap/io_trimesh/import_dae.h | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/wrap/io_trimesh/import_dae.h b/wrap/io_trimesh/import_dae.h index b4e0e09b8..0dcaaa6fc 100644 --- a/wrap/io_trimesh/import_dae.h +++ b/wrap/io_trimesh/import_dae.h @@ -397,14 +397,33 @@ namespace io { } // ind_txt = indexTextureByImgNode(*(info.doc),txt_node); } - int faceAttributeNum = triNodeList.at(tript).toElement().elementsByTagName("input").size(); + int triangleNumber = triNodeList.at(tript).toElement().attribute("count").toInt(); + + // A triangle can have multiple inputs that share a common offset. Therefore it's + // not sufficient to take the number of input to derive the stride from triangle to + // triangle. Instead, this heuristic uses the maximal offset found among inputs. + QDomNodeList attributes = triNodeList.at(tript).toElement().elementsByTagName("input"); + int numTriangleAttributeIndices = 0; + for (int i = 0; i < attributes.size(); ++i) { + QDomNode attr = attributes.at(i); + int offset = attr.toElement().attribute("offset", "-1").toInt(); + numTriangleAttributeIndices = std::max(numTriangleAttributeIndices, offset+1); + } QStringList face; valueStringList(face,triNodeList.at(tript),"p"); + + // Ensure that the

array size is consistent with the number of triangles and the + // exprected stride. + if (face.size() != 3 * triangleNumber * numTriangleAttributeIndices) { + QDEBUG("********* ERROR triangle count is inconsistent with input offsets and face index list"); + return E_INCOMPATIBLECOLLADA141FORMAT; + } + int offsetface = (int)m.face.size(); if (face.size() != 0) { - vcg::tri::Allocator::AddFaces(m,face.size() / (faceAttributeNum * 3)); + vcg::tri::Allocator::AddFaces(m, triangleNumber); WedgeAttribute wa; FindStandardWedgeAttributes(wa,triNodeList.at(tript),*(info.doc)); @@ -430,7 +449,7 @@ namespace io { WedgeTextureAttribute(m,face,ind_txt,wa.wt,wa.wtsrc,ff,jj + wa.offtx,tt,wa.stridetx); } - jj += faceAttributeNum; + jj += numTriangleAttributeIndices; } if( ! ( (m.face[ff].V(0) != m.face[ff].V(1)) && (m.face[ff].V(0) != m.face[ff].V(2)) && @@ -589,8 +608,13 @@ namespace io { } } - if (isTri && tripatch.isEmpty()) + if (isTri && tripatch.isEmpty()) { tripatch=polylist; + // Clear the polylist. Otherwise faces are loaded twice, once by + // LoadTriangularMesh and another time by LoadPolygonalListMesh. + polylist = QDomNodeList(); + } + if (tripatch.isEmpty() && polypatch.isEmpty() && polylist.isEmpty()) return E_NOPOLYGONALMESH; From 91dcfaa3062089b83cc7efcea14939daf5a02813 Mon Sep 17 00:00:00 2001 From: Christian Rauch Date: Tue, 19 Oct 2021 20:14:18 +0100 Subject: [PATCH 49/56] fix typo in PLY loader error message --- wrap/io_trimesh/export_ply.h | 2 +- wrap/io_trimesh/import_ply.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wrap/io_trimesh/export_ply.h b/wrap/io_trimesh/export_ply.h index 3823c337c..95d52350d 100644 --- a/wrap/io_trimesh/export_ply.h +++ b/wrap/io_trimesh/export_ply.h @@ -923,7 +923,7 @@ class ExporterPLY ply_error_msg[PlyInfo::E_NO_VERTEX ]="No vertex field found"; ply_error_msg[PlyInfo::E_NO_FACE ]="No face field found"; - ply_error_msg[PlyInfo::E_SHORTFILE ]="Unespected eof"; + ply_error_msg[PlyInfo::E_SHORTFILE ]="Unexpected EOF"; ply_error_msg[PlyInfo::E_NO_3VERTINFACE ]="Face with more than 3 vertices"; ply_error_msg[PlyInfo::E_BAD_VERT_INDEX ]="Bad vertex index in face"; ply_error_msg[PlyInfo::E_NO_6TCOORD ]="Face with no 6 texture coordinates"; diff --git a/wrap/io_trimesh/import_ply.h b/wrap/io_trimesh/import_ply.h index d94dc5faa..ab6bda9cc 100644 --- a/wrap/io_trimesh/import_ply.h +++ b/wrap/io_trimesh/import_ply.h @@ -328,7 +328,7 @@ class ImporterPLY ply_error_msg[PlyInfo::E_NO_VERTEX ]="No vertex field found"; ply_error_msg[PlyInfo::E_NO_FACE ]="No face field found"; - ply_error_msg[PlyInfo::E_SHORTFILE ]="Unespected eof"; + ply_error_msg[PlyInfo::E_SHORTFILE ]="Unexpected EOF"; ply_error_msg[PlyInfo::E_NO_3VERTINFACE ]="Face with more than 3 vertices"; ply_error_msg[PlyInfo::E_BAD_VERT_INDEX ]="Bad vertex index in face"; ply_error_msg[PlyInfo::E_BAD_VERT_INDEX_EDGE ]="Bad vertex index in edge"; From 8e7ec453bb0e6f62cc10e1d79ce8536ffa376a14 Mon Sep 17 00:00:00 2001 From: Christian Rauch Date: Tue, 19 Oct 2021 20:30:42 +0100 Subject: [PATCH 50/56] fix typos in pull request template --- .github/pull_request_template.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index e81cb6a9d..1b246c9a6 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,4 +1,4 @@ -## Thank you for sending a Pull Request to the VCGLib! +## Thank you for sending a Pull Request to the VCGLib! 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 @@ -6,9 +6,9 @@ If you will sign the CLA, then we will be able to merge your pull request after 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. -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: - [ ] I already signed and sent via email the CLA; -- [ ] I wil sign and send the CLA via email as soon as possible; -- [ ] I don't want to sign the CLA. \ No newline at end of file +- [ ] I will sign and send the CLA via email as soon as possible; +- [ ] I don't want to sign the CLA. From 08487711d6b43d6a6a3cffc972ed49fc954069db Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Wed, 20 Oct 2021 18:36:34 +0200 Subject: [PATCH 51/56] better copy in simple temporary data --- vcg/container/simple_temporary_data.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vcg/container/simple_temporary_data.h b/vcg/container/simple_temporary_data.h index f414bcd7d..8fd50011d 100644 --- a/vcg/container/simple_temporary_data.h +++ b/vcg/container/simple_temporary_data.h @@ -72,9 +72,8 @@ class VectorNBW return; bool* newdataLoc = new bool[sz]; if (datasize != 0) { + std::copy(booldata, booldata+datasize, newdataLoc); // memcpy(newdataLoc, booldata, sizeof(bool) * sizeof(datasize)); - for (unsigned int i = 0; i < datasize; ++i) - newdataLoc[i] = booldata[i]; } std::swap(booldata, newdataLoc); From 138b35eb06edd937954b295cc66b93c1afccfcb1 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Thu, 21 Oct 2021 17:00:03 +0200 Subject: [PATCH 52/56] update CLA --- docs/ContributorLicenseAgreement.md | 7 ++----- docs/ContributorLicenseAgreement.pdf | Bin 45779 -> 45891 bytes 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/docs/ContributorLicenseAgreement.md b/docs/ContributorLicenseAgreement.md index 994c4e2f9..20215eef2 100644 --- a/docs/ContributorLicenseAgreement.md +++ b/docs/ContributorLicenseAgreement.md @@ -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. ## 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. 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. @@ -25,9 +25,7 @@ Your contribution is either your original creation, based upon previous work tha   |   **Email** | **Physical home/office address**  |  -**Date of birth** | **Place of birth** -  |   -**github Project Contributed** | **Contribution** (id of the pull request) +**Date of birth** | **Place of birth**   |   @@ -37,4 +35,3 @@ Signature Date --- - diff --git a/docs/ContributorLicenseAgreement.pdf b/docs/ContributorLicenseAgreement.pdf index daa1cefc65b5e2f74186378d976d29bbc7d54fe0..c56c6392a9977b31d62ac6bc3f91565aea6ddfd5 100644 GIT binary patch delta 39679 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 aV*>K Date: Thu, 21 Oct 2021 17:14:44 +0200 Subject: [PATCH 53/56] update PR template --- .github/pull_request_template.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 1b246c9a6..15f9de14d 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -3,6 +3,7 @@ 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. +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 . If you will not sign the CLA, we will review and then apply your changes as soon as possible. From 2fbc872228f782ae451cae312ab13de7d0576040 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Fri, 22 Oct 2021 12:36:41 +0200 Subject: [PATCH 54/56] delete old travis and appveyor yml files --- .appveyor.yml | 59 --------------------------------------------------- .travis.yml | 49 ------------------------------------------ 2 files changed, 108 deletions(-) delete mode 100644 .appveyor.yml delete mode 100644 .travis.yml diff --git a/.appveyor.yml b/.appveyor.yml deleted file mode 100644 index f378c89d2..000000000 --- a/.appveyor.yml +++ /dev/null @@ -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% diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 9c7935a6b..000000000 --- a/.travis.yml +++ /dev/null @@ -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 From a0e7ed3d0a557332398879920db74eaae9b3498c Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 26 Oct 2021 10:57:18 +0200 Subject: [PATCH 55/56] solve bug for uninitialized public members in ply lib --- wrap/io_trimesh/io_ply.h | 1 + wrap/ply/plylib.h | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/wrap/io_trimesh/io_ply.h b/wrap/io_trimesh/io_ply.h index 05c25cab9..56e7822f0 100644 --- a/wrap/io_trimesh/io_ply.h +++ b/wrap/io_trimesh/io_ply.h @@ -75,6 +75,7 @@ class PlyInfo PropDescriptor p; p.propname=propName; + p.islist = false; p.stotype1 = propertyType; p.memtype1 = propertyType; diff --git a/wrap/ply/plylib.h b/wrap/ply/plylib.h index 0162ae005..da64940e5 100644 --- a/wrap/ply/plylib.h +++ b/wrap/ply/plylib.h @@ -116,18 +116,18 @@ typedef FILE * GZFILE; class PropDescriptor { public: - std::string elemname; // name of the element (e.g. vertex) - std::string propname; // name of the property (e.g. x, y, red...) - int stotype1; // Type of the property in the file - int memtype1; // Type of the property in memory - size_t offset1; // Offset in memory - bool islist; // true if the property is a list - bool alloclist; // 1 se alloca lista, 0 se preallocata - int stotype2; // Type of the number of elements of the list in the file - int memtype2; // Type of the number of elements of the list in memory - size_t offset2; // Offset valore memoria - - int format; // duplicazione del formato + std::string elemname = ""; // name of the element (e.g. vertex) + std::string propname = ""; // name of the property (e.g. x, y, red...) + int stotype1 = -1; // Type of the property in the file + int memtype1 = -1; // Type of the property in memory + size_t offset1 = 0; // Offset in memory + bool islist = false; // true if the property is a list + bool alloclist = false; // 1 se alloca lista, 0 se preallocata + int stotype2 = -1; // Type of the number of elements of the list in the file + int memtype2 = -1; // Type of the number of elements of the list in memory + size_t offset2 = 0; // Offset valore memoria + + int format = -1; // duplicazione del formato size_t stotypesize() const; // per sapere quanto e'grande un dato descrittore sul file size_t memtypesize() const; // per sapere quanto e'grande un dato descrittore in memoria From 476d1c2d5176b9d48f0c55dc37ef913de4099a5a Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Tue, 26 Oct 2021 11:22:20 +0200 Subject: [PATCH 56/56] make plylib bugfix build also on gcc and clang --- wrap/ply/plylib.cpp | 2 +- wrap/ply/plylib.h | 32 +++++++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/wrap/ply/plylib.cpp b/wrap/ply/plylib.cpp index c4657fd66..78bb2ccd9 100644 --- a/wrap/ply/plylib.cpp +++ b/wrap/ply/plylib.cpp @@ -3695,6 +3695,6 @@ void interpret_texture_name(const char*a, const char*fn, char*output){ output[io++]=a[ia++]; }; output[io]=0; -}; +} } } diff --git a/wrap/ply/plylib.h b/wrap/ply/plylib.h index da64940e5..a068ac4c0 100644 --- a/wrap/ply/plylib.h +++ b/wrap/ply/plylib.h @@ -116,9 +116,35 @@ typedef FILE * GZFILE; class PropDescriptor { public: - std::string elemname = ""; // name of the element (e.g. vertex) - std::string propname = ""; // name of the property (e.g. x, y, red...) - int stotype1 = -1; // Type of the property in the file + PropDescriptor() {} + PropDescriptor + (std::string elemname, + std::string propname, + int stotype1, + int memtype1, + size_t offset1, + bool islist, + bool alloclist, + int stotype2, + int memtype2, + size_t offset2, + int format) : + elemname(elemname), + propname(propname), + stotype1(stotype1), + memtype1(memtype1), + offset1(offset1), + islist(islist), + alloclist(alloclist), + stotype2(stotype2), + memtype2(memtype2), + offset2(offset2), + format(format) + { + } + std::string elemname; // name of the element (e.g. vertex) + std::string propname; // name of the property (e.g. x, y, red...) + int stotype1 = -1; // Type of the property in the file int memtype1 = -1; // Type of the property in memory size_t offset1 = 0; // Offset in memory bool islist = false; // true if the property is a list