4 #include <boost/math/special_functions/binomial.hpp>
14 Mesh (
int dim, std::vector<std::vector<double>> vertices,
bool compute_submeshes=
true) ;
18 printf(
"ROTATION NEEDS TO BE REIMPLEMENTED\n") ;
33 std::string out, indent ;
35 auto write_point= [](
cv1d v){std::string res=
"[" ;
for(
int i=0 ; i<
d ; i++) {res+=
std::to_string(v[i]) ;
if (i!=
d-1) res+=
", " ;} res +=
"]" ;
return res ; } ;
36 auto write_point_base= [](
cv1d v,
cv1d b,
int n){std::string res=
"[" ;
for(
int i=0 ; i<
d ; i++) {res+=
std::to_string(v[i]+b[n*
d+i]) ;
if (i!=
d-1) res+=
", " ;} res +=
"]" ;
return res ; } ;
41 indent = indent +
" " ;
42 out += indent + write_point(
origin) ;
46 out +=
"]\n" + indent +
"}" ;
55 std::cout <<
"orig: ";
57 std::cout << y <<
" ";
59 for (
int i=0 ; i<
d*
d ; i++)
61 if (i%
d==0) std::cout <<
"\n" ;
68 printf(
"DIMENSIONALITY: %d\n", i) ;
71 std::cout <<
"orig: ";
72 for (
auto &y:w.origin)
73 std::cout << y <<
" ";
75 for (
int i=0 ; i<
d*
d ; i++)
77 if (i%
d==0) std::cout <<
"\n" ;
78 std::cout << w.mixedbase[i] <<
" " ;
94 template <
class Archive>
102 Mesh<d>::Mesh (
int dim, std::vector<std::vector<double>> vertices,
bool compute_submeshes)
105 if (vertices.size() !=
static_cast<long unsigned int>(dimensionality+1)) printf(
"ERR: incorrect number of vertices %ld for the mesh of dimensionality %d.\n", vertices.size(), dimensionality) ;
107 std::vector<std::vector<double>> tmpbase ;
108 tmpbase.resize(
d, std::vector<double>(
d)) ;
109 mixedbase.resize(
d*
d, 0) ;
111 for (
int i=1 ; i<dimensionality+1 ; i++)
113 tmpbase[i-1]=vertices[i]-vertices[0] ;
119 boost::random::mt19937
rng(12345);
120 boost::random::uniform_01<boost::mt19937> rand(
rng) ;
121 for (
int i=dimensionality ; i<
d-1 ; i++)
122 for (
int j=0 ; j<
d ; j++)
123 tmpbase[i][j]=rand() ;
125 std::vector<double> tmp (
d,0) ;
126 for (
int i=dimensionality ; i<
d ; i++)
128 for (
int j=0 ; j<
d ; j++)
134 tmpbase[i] = tmp/norm;
139 std::rotate(tmpbase.begin(), tmpbase.begin()+dimensionality, tmpbase.end()) ;
149 for (
int i=0 ; i<
d ; i++)
150 for (
int j=0 ; j<
d ; j++)
151 mixedbase[i*
d+j]=tmpbase[i][j] ;
155 if (compute_submeshes)
157 submeshes.resize(dimensionality) ;
158 for (
int i=1 ; i<(1<<(dimensionality+1))-1 ; i++)
160 int subdimensionality = __builtin_popcount(i)-1 ;
161 std::vector<std::vector<double>> pts (subdimensionality+1, std::vector<double>(
d)) ;
162 for (
int j=0, n=0 ; j<dimensionality+1 ; j++)
165 pts[n++]=vertices[j] ;
167 submeshes[subdimensionality].push_back(
Mesh(subdimensionality, pts,
false)) ;
170 for (
int i=0 ; i<dimensionality-1 ; i++)
171 if (submeshes[i].size() != boost::math::binomial_coefficient<double>(dimensionality+1, i+1))
172 printf(
"ERR: the wrong number of submeshes %ld of dimensionality %d was generated ...\n", submeshes[i].size(), i) ;
NLOHMANN_BASIC_JSON_TPL_DECLARATION std::string to_string(const NLOHMANN_BASIC_JSON_TPL &j)
user-defined to_string function for JSON values
Definition: json.hpp:25318
boost::random::mt19937 rng(static_cast< unsigned int >(std::time(nullptr)))
std::string export_json()
Definition: Mesh.h:31
void disp()
Definition: Mesh.h:52
int dimensionality
Definition: Mesh.h:86
std::vector< double > invertbase
Inverted base: inverse(transpose(mixedbase)).
Definition: Mesh.h:90
void translate(cv1d t)
Definition: Mesh.h:15
void serialize(Archive &ar)
Definition: Mesh.h:95
Mesh()
Only for use by Restarting.
Definition: Mesh.h:13
std::vector< double > origin
Definition: Mesh.h:87
void rotate([[maybe_unused]] cv1d rot)
Definition: Mesh.h:16
std::vector< std::vector< Mesh > > submeshes
Definition: Mesh.h:92
std::vector< double > mixedbase
Mixed based: first n=dimensionality vectors are neither normalised nor unit vectors,...
Definition: Mesh.h:89
static void unitvec(vector< double > &v, int n)
Construct a unit vector in place.
Definition: Tools.h:735
static double det(cv2d &M)
compute the matrix determinant (probably quite slow, but doesn't really really matters for the usage)
Definition: Tools.h:766
static v1d inverse(cv1d &M)
compute the matrix inverse (very slow and redundant calculation of the determinant for the comatrix,...
Definition: Tools.h:832
const vector< double > cv1d
Definition: Typedefs.h:13
static double norm(const vector< double > &a)
Norm of a vector.
Definition: Tools.h:119