Tenncor
coord.hpp
Go to the documentation of this file.
1 
9 #include <functional>
10 
11 #include "teq/matops.hpp"
12 
13 #ifndef TEQ_COORD_HPP
14 #define TEQ_COORD_HPP
15 
16 namespace teq
17 {
18 
20 struct iCoordMap
21 {
22  virtual ~iCoordMap (void) = default;
23 
25  virtual iCoordMap* connect (const iCoordMap& rhs) const = 0;
26 
28  virtual void forward (CoordT::iterator out,
29  CoordT::const_iterator in) const = 0;
30 
33  virtual iCoordMap* reverse (void) const = 0;
34 
36  virtual std::string to_string (void) const = 0;
37 
40  virtual void access (std::function<void(const MatrixT&)> cb) const = 0;
41 
43  virtual bool is_bijective (void) const = 0;
44 };
45 
48 struct CoordMap final : public iCoordMap
49 {
50  CoordMap (std::function<void(MatrixT)> init)
51  {
52  std::memset(fwd_, 0, mat_size);
53  fwd_[rank_cap][rank_cap] = 1;
54  init(fwd_);
55  }
56 
58  iCoordMap* connect (const iCoordMap& rhs) const override
59  {
60  return new CoordMap([&](MatrixT out)
61  {
62  rhs.access([&](const MatrixT& in)
63  {
64  matmul(out, fwd_, in);
65  });
66  });
67  }
68 
70  void forward (CoordT::iterator out,
71  CoordT::const_iterator in) const override;
72 
74  iCoordMap* reverse (void) const override
75  {
76  return new CoordMap([this](MatrixT m)
77  {
78  inverse(m, this->fwd_);
79  });
80  }
81 
83  std::string to_string (void) const override
84  {
85  return teq::to_string(fwd_);
86  }
87 
89  void access (std::function<void(const MatrixT&)> cb) const override
90  {
91  cb(fwd_);
92  }
93 
95  bool is_bijective (void) const override
96  {
97  return (int) determinant(fwd_) != 0;
98  }
99 
100 private:
103 };
104 
106 using CoordptrT = std::shared_ptr<iCoordMap>;
107 
109 extern CoordptrT identity;
110 
112 bool is_identity (iCoordMap* coorder);
113 
118 CoordptrT reduce (RankT rank, std::vector<DimT> red);
119 
124 CoordptrT extend (RankT rank, std::vector<DimT> ext);
125 
134 CoordptrT permute (std::vector<RankT> order);
135 
139 CoordptrT flip (RankT dim);
140 
141 }
142 
143 #endif // TEQ_COORD_HPP
const RankT rank_cap
Number of dimsensions in a shape/coordinate.
Definition: shape.hpp:47
bool is_bijective(void) const override
Implementation of iCoordMap.
Definition: coord.hpp:95
iCoordMap * connect(const iCoordMap &rhs) const override
Implementation of iCoordMap.
Definition: coord.hpp:58
virtual void forward(CoordT::iterator out, CoordT::const_iterator in) const =0
Forward transform coordinates.
double determinant(const MatrixT &mat)
Return the determinant of matrix.
std::string to_string(const MatrixT &mat)
Return the string representation of input matrix.
uint8_t RankT
Type used for shape rank.
Definition: shape.hpp:23
CoordptrT extend(RankT rank, std::vector< DimT > ext)
std::shared_ptr< iCoordMap > CoordptrT
Type of iCoordMap smartpointer.
Definition: coord.hpp:106
CoordptrT reduce(RankT rank, std::vector< DimT > red)
Definition: coord.hpp:48
const size_t mat_size
Number of bytes in a homogeneous matrix.
Definition: matops.hpp:25
Interface for transforming coordinates and reversing the coordinate.
Definition: coord.hpp:20
iCoordMap * reverse(void) const override
Implementation of iCoordMap.
Definition: coord.hpp:74
MatrixT fwd_
Forward transformation matrix.
Definition: coord.hpp:102
CoordptrT identity
Identity matrix instance.
virtual std::string to_string(void) const =0
Return string representation of coordinate transformer.
void inverse(MatrixT out, const MatrixT &in)
Inverse in matrix and dump to out matrix.
void forward(CoordT::iterator out, CoordT::const_iterator in) const override
Implementation of iCoordMap.
virtual iCoordMap * connect(const iCoordMap &rhs) const =0
Return matmul(this, rhs)
virtual ~iCoordMap(void)=default
virtual bool is_bijective(void) const =0
Return true if this instance maps coordinates/shapes bijectively.
std::string to_string(void) const override
Implementation of iCoordMap.
Definition: coord.hpp:83
virtual void access(std::function< void(const MatrixT &)> cb) const =0
CoordptrT permute(std::vector< RankT > order)
void access(std::function< void(const MatrixT &)> cb) const override
Implementation of iCoordMap.
Definition: coord.hpp:89
Definition: coord.hpp:16
CoordMap(std::function< void(MatrixT)> init)
Definition: coord.hpp:50
double[mat_dim][mat_dim] MatrixT
Coordinate transformation matrix (using homogeneous)
Definition: matops.hpp:28
void matmul(MatrixT out, const MatrixT &lhs, const MatrixT &rhs)
Apply matrix multiplication for lhs and rhs to out matrix.
bool is_identity(iCoordMap *coorder)
Checks if the coord mapper is an identity mapper.
virtual iCoordMap * reverse(void) const =0
CoordptrT flip(RankT dim)