Graph Framework
Loading...
Searching...
No Matches
vector.hpp
Go to the documentation of this file.
1//------------------------------------------------------------------------------
4//------------------------------------------------------------------------------
5
6#ifndef vector_h
7#define vector_h
8
9#include "node.hpp"
10
11namespace graph {
12//******************************************************************************
13// Vector interface.
14//******************************************************************************
15//------------------------------------------------------------------------------
20//------------------------------------------------------------------------------
21 template<jit::float_scalar T, bool SAFE_MATH=false>
22 class vector_quantity : public std::enable_shared_from_this<vector_quantity<T, SAFE_MATH>> {
23 protected:
30
31 public:
32//------------------------------------------------------------------------------
38//------------------------------------------------------------------------------
43
44//------------------------------------------------------------------------------
48//------------------------------------------------------------------------------
50 return x;
51 }
52
53
54//------------------------------------------------------------------------------
58//------------------------------------------------------------------------------
60 return y;
61 }
62
63//------------------------------------------------------------------------------
67//------------------------------------------------------------------------------
69 return z;
70 }
71
72//------------------------------------------------------------------------------
77//------------------------------------------------------------------------------
80 return x*v2->get_x() +
81 y*v2->get_y() +
82 z*v2->get_z();
83 }
84
85//------------------------------------------------------------------------------
90//------------------------------------------------------------------------------
91 std::shared_ptr<vector_quantity<T, SAFE_MATH>>
93 return std::make_shared<vector_quantity<T, SAFE_MATH>> (y*v2->get_z() - z*v2->get_y(),
94 z*v2->get_x() - x*v2->get_z(),
95 x*v2->get_y() - y*v2->get_x());
96 }
97
98//------------------------------------------------------------------------------
102//------------------------------------------------------------------------------
104 return sqrt(this->dot(this->shared_from_this()));
105 }
106
107//------------------------------------------------------------------------------
111//------------------------------------------------------------------------------
112 std::shared_ptr<vector_quantity<T, SAFE_MATH>> unit() {
113 return std::make_shared<vector_quantity<T, SAFE_MATH>> (x, y, z)/length();
114 }
115 };
116
118 template<jit::float_scalar T, bool SAFE_MATH=false>
119 using shared_vector = std::shared_ptr<vector_quantity<T, SAFE_MATH>>;
120
121//------------------------------------------------------------------------------
131//------------------------------------------------------------------------------
132 template<jit::float_scalar T, bool SAFE_MATH=false>
136 return std::make_shared<vector_quantity<T, SAFE_MATH>> (x, y, z);
137 }
138
139//------------------------------------------------------------------------------
150//------------------------------------------------------------------------------
151 template<jit::float_scalar T, jit::float_scalar L, bool SAFE_MATH=false>
155 return std::make_shared<vector_quantity<T, SAFE_MATH>> (constant<T, SAFE_MATH> (static_cast<T> (x)), y, z);
156 }
157
158//------------------------------------------------------------------------------
169//------------------------------------------------------------------------------
170 template<jit::float_scalar T, jit::float_scalar M, bool SAFE_MATH=false>
172 const M y,
174 return std::make_shared<vector_quantity<T, SAFE_MATH>> (x, constant<T, SAFE_MATH> (static_cast<T> (y)), z);
175 }
176
177//------------------------------------------------------------------------------
188//------------------------------------------------------------------------------
189 template<jit::float_scalar T, jit::float_scalar R, bool SAFE_MATH=false>
192 const R z) {
193 return std::make_shared<vector_quantity<T, SAFE_MATH>> (x, y, constant<T, SAFE_MATH> (static_cast<T> (z)));
194 }
195
196//------------------------------------------------------------------------------
208//------------------------------------------------------------------------------
209 template<jit::float_scalar T, jit::float_scalar L, jit::float_scalar M, bool SAFE_MATH=false>
211 const M y,
213 return std::make_shared<vector_quantity<T, SAFE_MATH>> (constant<T, SAFE_MATH> (static_cast<T> (x)),
214 constant<T, SAFE_MATH> (static_cast<T> (y)), z);
215 }
216
217//------------------------------------------------------------------------------
229//------------------------------------------------------------------------------
230 template<jit::float_scalar T, jit::float_scalar M, jit::float_scalar R, bool SAFE_MATH=false>
232 const M y,
233 const R z) {
234 return std::make_shared<vector_quantity<T, SAFE_MATH>> (x, constant<T, SAFE_MATH> (static_cast<T> (y)),
235 constant<T, SAFE_MATH> (static_cast<T> (z)));
236 }
237
238//------------------------------------------------------------------------------
250//------------------------------------------------------------------------------
251 template<jit::float_scalar T, jit::float_scalar L, jit::float_scalar R, bool SAFE_MATH=false>
254 const R z) {
255 return std::make_shared<vector_quantity<T, SAFE_MATH>> (constant<T, SAFE_MATH> (static_cast<T> (x)), y,
256 constant<T, SAFE_MATH> (static_cast<T> (z)));
257 }
258
259//------------------------------------------------------------------------------
269//------------------------------------------------------------------------------
270 template<jit::float_scalar T, bool SAFE_MATH=false>
272 const T y,
273 const T z) {
274 return std::make_shared<vector_quantity<T, SAFE_MATH>> (constant<T, SAFE_MATH> (static_cast<T> (x)),
275 constant<T, SAFE_MATH> (static_cast<T> (y)),
276 constant<T, SAFE_MATH> (static_cast<T> (z)));
277 }
278
279//------------------------------------------------------------------------------
288//------------------------------------------------------------------------------
289 template<jit::float_scalar T, bool SAFE_MATH=false>
292 return vector(l->get_x() + r->get_x(),
293 l->get_y() + r->get_y(),
294 l->get_z() + r->get_z());
295 }
296
297//------------------------------------------------------------------------------
306//------------------------------------------------------------------------------
307 template<jit::float_scalar T, bool SAFE_MATH=false>
310 return vector(l->get_x() - r->get_x(),
311 l->get_y() - r->get_y(),
312 l->get_z() - r->get_z());
313 }
314
315//------------------------------------------------------------------------------
324//------------------------------------------------------------------------------
325 template<jit::float_scalar T, bool SAFE_MATH=false>
328 return vector(s*v->get_x(),
329 s*v->get_y(),
330 s*v->get_z());
331 }
332
333//------------------------------------------------------------------------------
342//------------------------------------------------------------------------------
343 template<jit::float_scalar T, bool SAFE_MATH=false>
346 return vector(v->get_x()/s,
347 v->get_y()/s,
348 v->get_z()/s);
349 }
350
351//******************************************************************************
352// Matrix interface.
353//******************************************************************************
354//------------------------------------------------------------------------------
359//------------------------------------------------------------------------------
360 template<jit::float_scalar T, bool SAFE_MATH=false>
361 class matrix_quantity : public std::enable_shared_from_this<matrix_quantity<T, SAFE_MATH>> {
362 protected:
369
370 public:
371//------------------------------------------------------------------------------
377//------------------------------------------------------------------------------
382
383//------------------------------------------------------------------------------
388//------------------------------------------------------------------------------
391 return vector<T, SAFE_MATH> (r1->dot(v),
392 r2->dot(v),
393 r3->dot(v));
394 }
395 };
396
398 template<jit::float_scalar T, bool SAFE_MATH=false>
399 using shared_matrix = std::shared_ptr<matrix_quantity<T, SAFE_MATH>>;
400
401//------------------------------------------------------------------------------
411//------------------------------------------------------------------------------
412 template<jit::float_scalar T, bool SAFE_MATH=false>
416 return std::make_shared<matrix_quantity<T, SAFE_MATH>> (r1, r2, r3);
417 }
418}
419
420#endif /* vector_h */
Class to represent matrix quantities.
Definition vector.hpp:361
matrix_quantity(shared_vector< T, SAFE_MATH > r1, shared_vector< T, SAFE_MATH > r2, shared_vector< T, SAFE_MATH > r3)
Construct a new matrix_quantity.
Definition vector.hpp:378
shared_vector< T, SAFE_MATH > r3
Third row of the matrix.
Definition vector.hpp:368
shared_vector< T, SAFE_MATH > r1
First row of the matrix.
Definition vector.hpp:364
shared_vector< T, SAFE_MATH > dot(shared_vector< T, SAFE_MATH > v)
Multiply matrix by vector.
Definition vector.hpp:390
shared_vector< T, SAFE_MATH > r2
Second row of the matrix.
Definition vector.hpp:366
Class to represent vector quantities.
Definition vector.hpp:22
shared_leaf< T, SAFE_MATH > y
Y component of the vector.
Definition vector.hpp:27
shared_leaf< T, SAFE_MATH > get_x() const
Get the x component.
Definition vector.hpp:49
std::shared_ptr< vector_quantity< T, SAFE_MATH > > cross(std::shared_ptr< vector_quantity< T, SAFE_MATH > > v2)
Vector cross product.
Definition vector.hpp:92
shared_leaf< T, SAFE_MATH > get_z() const
Get the z component.
Definition vector.hpp:68
shared_leaf< T, SAFE_MATH > get_y() const
Get the y component.
Definition vector.hpp:59
shared_leaf< T, SAFE_MATH > dot(std::shared_ptr< vector_quantity< T, SAFE_MATH > > v2)
Vector dot product.
Definition vector.hpp:79
shared_leaf< T, SAFE_MATH > length()
Get the length of the vector.
Definition vector.hpp:103
std::shared_ptr< vector_quantity< T, SAFE_MATH > > unit()
Get the unit vector.
Definition vector.hpp:112
shared_leaf< T, SAFE_MATH > z
Z component of the vector.
Definition vector.hpp:29
vector_quantity(shared_leaf< T, SAFE_MATH > x, shared_leaf< T, SAFE_MATH > y, shared_leaf< T, SAFE_MATH > z)
Construct a new vector_quantity.
Definition vector.hpp:39
shared_leaf< T, SAFE_MATH > x
X component of the vector.
Definition vector.hpp:25
Name space for graph nodes.
Definition arithmetic.hpp:13
shared_leaf< T, SAFE_MATH > operator*(shared_leaf< T, SAFE_MATH > l, shared_leaf< T, SAFE_MATH > r)
Build multiply node from two leaves.
Definition arithmetic.hpp:2666
constexpr shared_leaf< T, SAFE_MATH > zero()
Forward declare for zero.
Definition node.hpp:994
shared_leaf< T, SAFE_MATH > operator/(shared_leaf< T, SAFE_MATH > l, shared_leaf< T, SAFE_MATH > r)
Build divide node from two leaves.
Definition arithmetic.hpp:3631
std::shared_ptr< vector_quantity< T, SAFE_MATH > > shared_vector
Convenience type for shared vector quantities.
Definition vector.hpp:119
shared_leaf< T, SAFE_MATH > operator+(shared_leaf< T, SAFE_MATH > l, shared_leaf< T, SAFE_MATH > r)
Build add node from two leaves.
Definition arithmetic.hpp:774
shared_leaf< T, SAFE_MATH > operator-(shared_leaf< T, SAFE_MATH > l, shared_leaf< T, SAFE_MATH > r)
Build subtract node from two leaves.
Definition arithmetic.hpp:1598
shared_vector< T, SAFE_MATH > vector(shared_leaf< T, SAFE_MATH > x, shared_leaf< T, SAFE_MATH > y, shared_leaf< T, SAFE_MATH > z)
Build a shared vector quantity.
Definition vector.hpp:133
shared_leaf< T, SAFE_MATH > sqrt(shared_leaf< T, SAFE_MATH > x)
Define sqrt convience function.
Definition math.hpp:279
shared_matrix< T, SAFE_MATH > matrix(shared_vector< T, SAFE_MATH > r1, shared_vector< T, SAFE_MATH > r2, shared_vector< T, SAFE_MATH > r3)
Build a shared vector quantity.
Definition vector.hpp:413
std::shared_ptr< matrix_quantity< T, SAFE_MATH > > shared_matrix
Convenience type for shared vector quantities.
Definition vector.hpp:399
std::shared_ptr< leaf_node< T, SAFE_MATH > > shared_leaf
Convenience type alias for shared leaf nodes.
Definition node.hpp:673
Base nodes of graph computation framework.