order_facets_around_edges.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. // This file is part of libigl, a simple c++ geometry processing library.
  2. //
  3. // Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>
  4. //
  5. // This Source Code Form is subject to the terms of the Mozilla Public License
  6. // v. 2.0. If a copy of the MPL was not distributed with this file, You can
  7. // obtain one at http://mozilla.org/MPL/2.0/.
  8. #include "order_facets_around_edges.h"
  9. #include "order_facets_around_edge.h"
  10. #include "../../sort_angles.h"
  11. #include <Eigen/Geometry>
  12. #include <type_traits>
  13. #include <CGAL/Exact_predicates_exact_constructions_kernel.h>
  14. template<
  15. typename DerivedV,
  16. typename DerivedF,
  17. typename DerivedN,
  18. typename DeriveduE,
  19. typename uE2EType,
  20. typename uE2oEType,
  21. typename uE2CType >
  22. IGL_INLINE
  23. typename std::enable_if<!std::is_same<typename DerivedV::Scalar,
  24. typename CGAL::Exact_predicates_exact_constructions_kernel::FT>::value, void>::type
  25. igl::copyleft::cgal::order_facets_around_edges(
  26. const Eigen::PlainObjectBase<DerivedV>& V,
  27. const Eigen::PlainObjectBase<DerivedF>& F,
  28. const Eigen::PlainObjectBase<DerivedN>& N,
  29. const Eigen::PlainObjectBase<DeriveduE>& uE,
  30. const std::vector<std::vector<uE2EType> >& uE2E,
  31. std::vector<std::vector<uE2oEType> >& uE2oE,
  32. std::vector<std::vector<uE2CType > >& uE2C ) {
  33. typedef Eigen::Matrix<typename DerivedN::Scalar, 3, 1> Vector3F;
  34. const typename DerivedV::Scalar EPS = 1e-12;
  35. const size_t num_faces = F.rows();
  36. const size_t num_undirected_edges = uE.rows();
  37. auto edge_index_to_face_index = [&](size_t ei) { return ei % num_faces; };
  38. auto edge_index_to_corner_index = [&](size_t ei) { return ei / num_faces; };
  39. uE2oE.resize(num_undirected_edges);
  40. uE2C.resize(num_undirected_edges);
  41. for(size_t ui = 0;ui<num_undirected_edges;ui++)
  42. {
  43. const auto& adj_edges = uE2E[ui];
  44. const size_t edge_valance = adj_edges.size();
  45. assert(edge_valance > 0);
  46. const auto ref_edge = adj_edges[0];
  47. const auto ref_face = edge_index_to_face_index(ref_edge);
  48. Vector3F ref_normal = N.row(ref_face);
  49. const auto ref_corner_o = edge_index_to_corner_index(ref_edge);
  50. const auto ref_corner_s = (ref_corner_o+1)%3;
  51. const auto ref_corner_d = (ref_corner_o+2)%3;
  52. const typename DerivedF::Scalar o = F(ref_face, ref_corner_o);
  53. const typename DerivedF::Scalar s = F(ref_face, ref_corner_s);
  54. const typename DerivedF::Scalar d = F(ref_face, ref_corner_d);
  55. Vector3F edge = V.row(d) - V.row(s);
  56. auto edge_len = edge.norm();
  57. bool degenerated = edge_len < EPS;
  58. if (degenerated) {
  59. if (edge_valance <= 2) {
  60. // There is only one way to order 2 or less faces.
  61. edge.setZero();
  62. } else {
  63. edge.setZero();
  64. Eigen::Matrix<typename DerivedN::Scalar, Eigen::Dynamic, 3>
  65. normals(edge_valance, 3);
  66. for (size_t fei=0; fei<edge_valance; fei++) {
  67. const auto fe = adj_edges[fei];
  68. const auto f = edge_index_to_face_index(fe);
  69. normals.row(fei) = N.row(f);
  70. }
  71. for (size_t i=0; i<edge_valance; i++) {
  72. size_t j = (i+1) % edge_valance;
  73. Vector3F ni = normals.row(i);
  74. Vector3F nj = normals.row(j);
  75. edge = ni.cross(nj);
  76. edge_len = edge.norm();
  77. if (edge_len >= EPS) {
  78. edge.normalize();
  79. break;
  80. }
  81. }
  82. // Ensure edge direction are consistent with reference face.
  83. Vector3F in_face_vec = V.row(o) - V.row(s);
  84. if (edge.cross(in_face_vec).dot(ref_normal) < 0) {
  85. edge *= -1;
  86. }
  87. if (edge.norm() < EPS) {
  88. std::cerr << "=====================================" << std::endl;
  89. std::cerr << " ui: " << ui << std::endl;
  90. std::cerr << "edge: " << ref_edge << std::endl;
  91. std::cerr << "face: " << ref_face << std::endl;
  92. std::cerr << " vs: " << V.row(s) << std::endl;
  93. std::cerr << " vd: " << V.row(d) << std::endl;
  94. std::cerr << "adj face normals: " << std::endl;
  95. std::cerr << normals << std::endl;
  96. std::cerr << "Very degenerated case detected:" << std::endl;
  97. std::cerr << "Near zero edge surrounded by "
  98. << edge_valance << " neearly colinear faces" <<
  99. std::endl;
  100. std::cerr << "=====================================" << std::endl;
  101. }
  102. }
  103. } else {
  104. edge.normalize();
  105. }
  106. Eigen::MatrixXd angle_data(edge_valance, 3);
  107. std::vector<bool> cons(edge_valance);
  108. for (size_t fei=0; fei<edge_valance; fei++) {
  109. const auto fe = adj_edges[fei];
  110. const auto f = edge_index_to_face_index(fe);
  111. const auto c = edge_index_to_corner_index(fe);
  112. cons[fei] = (d == F(f, (c+1)%3));
  113. assert( cons[fei] || (d == F(f,(c+2)%3)));
  114. assert(!cons[fei] || (s == F(f,(c+2)%3)));
  115. assert(!cons[fei] || (d == F(f,(c+1)%3)));
  116. Vector3F n = N.row(f);
  117. angle_data(fei, 0) = ref_normal.cross(n).dot(edge);
  118. angle_data(fei, 1) = ref_normal.dot(n);
  119. if (cons[fei]) {
  120. angle_data(fei, 0) *= -1;
  121. angle_data(fei, 1) *= -1;
  122. }
  123. angle_data(fei, 0) *= -1; // Sort clockwise.
  124. angle_data(fei, 2) = (cons[fei]?1.:-1.)*(f+1);
  125. }
  126. Eigen::VectorXi order;
  127. igl::sort_angles(angle_data, order);
  128. auto& ordered_edges = uE2oE[ui];
  129. auto& consistency = uE2C[ui];
  130. ordered_edges.resize(edge_valance);
  131. consistency.resize(edge_valance);
  132. for (size_t fei=0; fei<edge_valance; fei++) {
  133. ordered_edges[fei] = adj_edges[order[fei]];
  134. consistency[fei] = cons[order[fei]];
  135. }
  136. }
  137. }
  138. template<
  139. typename DerivedV,
  140. typename DerivedF,
  141. typename DerivedN,
  142. typename DeriveduE,
  143. typename uE2EType,
  144. typename uE2oEType,
  145. typename uE2CType >
  146. IGL_INLINE
  147. typename std::enable_if<std::is_same<typename DerivedV::Scalar,
  148. typename CGAL::Exact_predicates_exact_constructions_kernel::FT>::value, void>::type
  149. igl::copyleft::cgal::order_facets_around_edges(
  150. const Eigen::PlainObjectBase<DerivedV>& V,
  151. const Eigen::PlainObjectBase<DerivedF>& F,
  152. const Eigen::PlainObjectBase<DerivedN>& N,
  153. const Eigen::PlainObjectBase<DeriveduE>& uE,
  154. const std::vector<std::vector<uE2EType> >& uE2E,
  155. std::vector<std::vector<uE2oEType> >& uE2oE,
  156. std::vector<std::vector<uE2CType > >& uE2C ) {
  157. typedef Eigen::Matrix<typename DerivedN::Scalar, 3, 1> Vector3F;
  158. typedef Eigen::Matrix<typename DerivedV::Scalar, 3, 1> Vector3E;
  159. const typename DerivedV::Scalar EPS = 1e-12;
  160. const size_t num_faces = F.rows();
  161. const size_t num_undirected_edges = uE.rows();
  162. auto edge_index_to_face_index = [&](size_t ei) { return ei % num_faces; };
  163. auto edge_index_to_corner_index = [&](size_t ei) { return ei / num_faces; };
  164. uE2oE.resize(num_undirected_edges);
  165. uE2C.resize(num_undirected_edges);
  166. for(size_t ui = 0;ui<num_undirected_edges;ui++)
  167. {
  168. const auto& adj_edges = uE2E[ui];
  169. const size_t edge_valance = adj_edges.size();
  170. assert(edge_valance > 0);
  171. const auto ref_edge = adj_edges[0];
  172. const auto ref_face = edge_index_to_face_index(ref_edge);
  173. Vector3F ref_normal = N.row(ref_face);
  174. const auto ref_corner_o = edge_index_to_corner_index(ref_edge);
  175. const auto ref_corner_s = (ref_corner_o+1)%3;
  176. const auto ref_corner_d = (ref_corner_o+2)%3;
  177. const typename DerivedF::Scalar o = F(ref_face, ref_corner_o);
  178. const typename DerivedF::Scalar s = F(ref_face, ref_corner_s);
  179. const typename DerivedF::Scalar d = F(ref_face, ref_corner_d);
  180. Vector3E exact_edge = V.row(d) - V.row(s);
  181. exact_edge.array() /= exact_edge.squaredNorm();
  182. Vector3F edge(
  183. CGAL::to_double(exact_edge[0]),
  184. CGAL::to_double(exact_edge[1]),
  185. CGAL::to_double(exact_edge[2]));
  186. edge.normalize();
  187. Eigen::MatrixXd angle_data(edge_valance, 3);
  188. std::vector<bool> cons(edge_valance);
  189. for (size_t fei=0; fei<edge_valance; fei++) {
  190. const auto fe = adj_edges[fei];
  191. const auto f = edge_index_to_face_index(fe);
  192. const auto c = edge_index_to_corner_index(fe);
  193. cons[fei] = (d == F(f, (c+1)%3));
  194. assert( cons[fei] || (d == F(f,(c+2)%3)));
  195. assert(!cons[fei] || (s == F(f,(c+2)%3)));
  196. assert(!cons[fei] || (d == F(f,(c+1)%3)));
  197. Vector3F n = N.row(f);
  198. angle_data(fei, 0) = ref_normal.cross(n).dot(edge);
  199. angle_data(fei, 1) = ref_normal.dot(n);
  200. if (cons[fei]) {
  201. angle_data(fei, 0) *= -1;
  202. angle_data(fei, 1) *= -1;
  203. }
  204. angle_data(fei, 0) *= -1; // Sort clockwise.
  205. angle_data(fei, 2) = (cons[fei]?1.:-1.)*(f+1);
  206. }
  207. Eigen::VectorXi order;
  208. igl::sort_angles(angle_data, order);
  209. auto& ordered_edges = uE2oE[ui];
  210. auto& consistency = uE2C[ui];
  211. ordered_edges.resize(edge_valance);
  212. consistency.resize(edge_valance);
  213. for (size_t fei=0; fei<edge_valance; fei++) {
  214. ordered_edges[fei] = adj_edges[order[fei]];
  215. consistency[fei] = cons[order[fei]];
  216. }
  217. }
  218. }
  219. template<
  220. typename DerivedV,
  221. typename DerivedF,
  222. typename DeriveduE,
  223. typename uE2EType,
  224. typename uE2oEType,
  225. typename uE2CType >
  226. IGL_INLINE void igl::copyleft::cgal::order_facets_around_edges(
  227. const Eigen::PlainObjectBase<DerivedV>& V,
  228. const Eigen::PlainObjectBase<DerivedF>& F,
  229. const Eigen::PlainObjectBase<DeriveduE>& uE,
  230. const std::vector<std::vector<uE2EType> >& uE2E,
  231. std::vector<std::vector<uE2oEType> >& uE2oE,
  232. std::vector<std::vector<uE2CType > >& uE2C ) {
  233. //typedef Eigen::Matrix<typename DerivedV::Scalar, 3, 1> Vector3E;
  234. const size_t num_faces = F.rows();
  235. const size_t num_undirected_edges = uE.rows();
  236. auto edge_index_to_face_index = [&](size_t ei) { return ei % num_faces; };
  237. auto edge_index_to_corner_index = [&](size_t ei) { return ei / num_faces; };
  238. uE2oE.resize(num_undirected_edges);
  239. uE2C.resize(num_undirected_edges);
  240. for(size_t ui = 0;ui<num_undirected_edges;ui++)
  241. {
  242. const auto& adj_edges = uE2E[ui];
  243. const size_t edge_valance = adj_edges.size();
  244. assert(edge_valance > 0);
  245. const auto ref_edge = adj_edges[0];
  246. const auto ref_face = edge_index_to_face_index(ref_edge);
  247. const auto ref_corner_o = edge_index_to_corner_index(ref_edge);
  248. const auto ref_corner_s = (ref_corner_o+1)%3;
  249. const auto ref_corner_d = (ref_corner_o+2)%3;
  250. //const typename DerivedF::Scalar o = F(ref_face, ref_corner_o);
  251. const typename DerivedF::Scalar s = F(ref_face, ref_corner_s);
  252. const typename DerivedF::Scalar d = F(ref_face, ref_corner_d);
  253. std::vector<bool> cons(edge_valance);
  254. std::vector<int> adj_faces(edge_valance);
  255. for (size_t fei=0; fei<edge_valance; fei++) {
  256. const auto fe = adj_edges[fei];
  257. const auto f = edge_index_to_face_index(fe);
  258. const auto c = edge_index_to_corner_index(fe);
  259. cons[fei] = (d == F(f, (c+1)%3));
  260. adj_faces[fei] = (f+1) * (cons[fei] ? 1:-1);
  261. assert( cons[fei] || (d == F(f,(c+2)%3)));
  262. assert(!cons[fei] || (s == F(f,(c+2)%3)));
  263. assert(!cons[fei] || (d == F(f,(c+1)%3)));
  264. }
  265. Eigen::VectorXi order;
  266. order_facets_around_edge(V, F, s, d, adj_faces, order);
  267. assert((size_t)order.size() == edge_valance);
  268. auto& ordered_edges = uE2oE[ui];
  269. auto& consistency = uE2C[ui];
  270. ordered_edges.resize(edge_valance);
  271. consistency.resize(edge_valance);
  272. for (size_t fei=0; fei<edge_valance; fei++) {
  273. ordered_edges[fei] = adj_edges[order[fei]];
  274. consistency[fei] = cons[order[fei]];
  275. }
  276. }
  277. }
  278. #ifdef IGL_STATIC_LIBRARY
  279. // Explicit template instantiation
  280. // generated by autoexplicit.sh
  281. template void igl::copyleft::cgal::order_facets_around_edges<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int, int, bool>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > >&);
  282. // generated by autoexplicit.sh
  283. template std::enable_if<!(std::is_same<Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, CGAL::Lazy_exact_nt<CGAL::Gmpq> >::value), void>::type igl::copyleft::cgal::order_facets_around_edges<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int, int, bool>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > >&);
  284. template void igl::copyleft::cgal::order_facets_around_edges<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, long, long, bool>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&, std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > >&);
  285. template void igl::copyleft::cgal::order_facets_around_edges<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, long, long, bool>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&, std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > >&);
  286. template void igl::copyleft::cgal::order_facets_around_edges<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, long, long, bool>(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&, std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > >&);
  287. template void igl::copyleft::cgal::order_facets_around_edges<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 2, 0, -1, 2>, long, long, bool>(Eigen::PlainObjectBase<Eigen::Matrix<CGAL::Lazy_exact_nt<CGAL::Gmpq>, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > > const&, std::vector<std::vector<long, std::allocator<long> >, std::allocator<std::vector<long, std::allocator<long> > > >&, std::vector<std::vector<bool, std::allocator<bool> >, std::allocator<std::vector<bool, std::allocator<bool> > > >&);
  288. #ifdef WIN32
  289. template void igl::copyleft::cgal::order_facets_around_edges<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>,-1,-1,0,-1,-1>,class Eigen::Matrix<int,-1,-1,0,-1,-1>,class Eigen::Matrix<int,-1,2,0,-1,2>,__int64,__int64,bool>(class Eigen::PlainObjectBase<class Eigen::Matrix<class CGAL::Lazy_exact_nt<class CGAL::Gmpq>,-1,-1,0,-1,-1> > const &,class Eigen::PlainObjectBase<class Eigen::Matrix<int,-1,-1,0,-1,-1> > const &,class Eigen::PlainObjectBase<class Eigen::Matrix<int,-1,2,0,-1,2> > const &,class std::vector<class std::vector<__int64,class std::allocator<__int64> >,class std::allocator<class std::vector<__int64,class std::allocator<__int64> > > > const &,class std::vector<class std::vector<__int64,class std::allocator<__int64> >,class std::allocator<class std::vector<__int64,class std::allocator<__int64> > > > &,class std::vector<class std::vector<bool,class std::allocator<bool> >,class std::allocator<class std::vector<bool,class std::allocator<bool> > > > &);
  290. template void igl::copyleft::cgal::order_facets_around_edges<class Eigen::Matrix<double,-1,-1,0,-1,-1>,class Eigen::Matrix<int,-1,-1,0,-1,-1>,class Eigen::Matrix<int,-1,2,0,-1,2>,__int64,__int64,bool>(class Eigen::PlainObjectBase<class Eigen::Matrix<double,-1,-1,0,-1,-1> > const &,class Eigen::PlainObjectBase<class Eigen::Matrix<int,-1,-1,0,-1,-1> > const &,class Eigen::PlainObjectBase<class Eigen::Matrix<int,-1,2,0,-1,2> > const &,class std::vector<class std::vector<__int64,class std::allocator<__int64> >,class std::allocator<class std::vector<__int64,class std::allocator<__int64> > > > const &,class std::vector<class std::vector<__int64,class std::allocator<__int64> >,class std::allocator<class std::vector<__int64,class std::allocator<__int64> > > > &,class std::vector<class std::vector<bool,class std::allocator<bool> >,class std::allocator<class std::vector<bool,class std::allocator<bool> > > > &);
  291. template void igl::copyleft::cgal::order_facets_around_edges<class Eigen::Matrix<double,-1,3,0,-1,3>,class Eigen::Matrix<int,-1,3,0,-1,3>,class Eigen::Matrix<int,-1,2,0,-1,2>,__int64,__int64,bool>(class Eigen::PlainObjectBase<class Eigen::Matrix<double,-1,3,0,-1,3> > const &,class Eigen::PlainObjectBase<class Eigen::Matrix<int,-1,3,0,-1,3> > const &,class Eigen::PlainObjectBase<class Eigen::Matrix<int,-1,2,0,-1,2> > const &,class std::vector<class std::vector<__int64,class std::allocator<__int64> >,class std::allocator<class std::vector<__int64,class std::allocator<__int64> > > > const &,class std::vector<class std::vector<__int64,class std::allocator<__int64> >,class std::allocator<class std::vector<__int64,class std::allocator<__int64> > > > &,class std::vector<class std::vector<bool,class std::allocator<bool> >,class std::allocator<class std::vector<bool,class std::allocator<bool> > > > &);
  292. #endif
  293. #endif