glucat 0.13.0
clifford_algebra.h
Go to the documentation of this file.
1#ifndef _GLUCAT_CLIFFORD_ALGEBRA_H
2#define _GLUCAT_CLIFFORD_ALGEBRA_H
3/***************************************************************************
4 GluCat : Generic library of universal Clifford algebra templates
5 clifford_algebra.h : Declare the operations of a Clifford algebra
6 -------------------
7 begin : Sun 2001-12-09
8 copyright : (C) 2001-2021 by Paul C. Leopardi
9 ***************************************************************************
10
11 This library is free software: you can redistribute it and/or modify
12 it under the terms of the GNU Lesser General Public License as published
13 by the Free Software Foundation, either version 3 of the License, or
14 (at your option) any later version.
15
16 This library is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU Lesser General Public License for more details.
20
21 You should have received a copy of the GNU Lesser General Public License
22 along with this library. If not, see <http://www.gnu.org/licenses/>.
23
24 ***************************************************************************
25 This library is based on a prototype written by Arvind Raja and was
26 licensed under the LGPL with permission of the author. See Arvind Raja,
27 "Object-oriented implementations of Clifford algebras in C++: a prototype",
28 in Ablamowicz, Lounesto and Parra (eds.)
29 "Clifford algebras with numeric and symbolic computations", Birkhauser, 1996.
30 ***************************************************************************
31 See also Arvind Raja's original header comments in glucat.h
32 ***************************************************************************/
33
34#include "glucat/global.h"
35
36#include <limits>
37#include <string>
38#include <utility>
39#include <vector>
40
41namespace glucat
42{
44 template< typename Scalar_T, typename Index_Set_T, typename Multivector_T>
46 {
47 public:
48 using scalar_t = Scalar_T;
49 using index_set_t = Index_Set_T;
50 static const index_t v_lo = index_set_t::v_lo;
51 static const index_t v_hi = index_set_t::v_hi;
52 using multivector_t = Multivector_T;
53 using pair_t = std::pair<const index_set_t, Scalar_T>;
54 using vector_t = std::vector<Scalar_T>;
55
56 static auto classname() -> const std::string;
57
59 static const Scalar_T default_truncation;
60
61 virtual ~clifford_algebra() = default;
62
63 // clifford_algebra operations
65 virtual auto operator== (const multivector_t& val) const -> bool = 0;
67 virtual auto operator== (const Scalar_T& scr) const -> bool = 0;
69 virtual auto operator+= (const multivector_t& rhs) -> multivector_t& = 0;
71 virtual auto operator+= (const Scalar_T& scr) -> multivector_t& = 0;
73 virtual auto operator-= (const multivector_t& rhs) -> multivector_t& = 0;
75 virtual auto operator-= (const Scalar_T& scr) -> multivector_t& = 0;
77 virtual auto operator- () const -> const multivector_t = 0;
79 virtual auto operator*= (const Scalar_T& scr) -> multivector_t& = 0;
81 virtual auto operator*= (const multivector_t& rhs) -> multivector_t& = 0;
83 virtual auto operator%= (const multivector_t& rhs) -> multivector_t& = 0;
85 virtual auto operator&= (const multivector_t& rhs) -> multivector_t& = 0;
87 virtual auto operator^= (const multivector_t& rhs) -> multivector_t& = 0;
89 virtual auto operator/= (const Scalar_T& scr) -> multivector_t& = 0;
91 virtual auto operator/= (const multivector_t& rhs) -> multivector_t& = 0;
93 virtual auto operator|= (const multivector_t& rhs) -> multivector_t& = 0;
95 virtual auto inv () const -> const multivector_t = 0;
97 virtual auto pow (int m) const -> const multivector_t = 0;
99 virtual auto outer_pow (int m) const -> const multivector_t = 0;
101 virtual auto frame () const -> const index_set_t = 0;
103 virtual auto grade () const -> index_t = 0;
105 virtual auto operator[] (const index_set_t ist) const -> Scalar_T = 0;
107 virtual auto operator() (index_t grade) const -> const multivector_t = 0;
109 virtual auto scalar () const -> Scalar_T = 0;
111 virtual auto pure () const -> const multivector_t = 0;
113 virtual auto even () const -> const multivector_t = 0;
115 virtual auto odd () const -> const multivector_t = 0;
117 virtual auto vector_part () const -> const vector_t = 0;
119 virtual auto vector_part (const index_set_t frm, const bool prechecked) const -> const vector_t = 0;
121 virtual auto involute () const -> const multivector_t = 0;
123 virtual auto reverse () const -> const multivector_t = 0;
125 virtual auto conj () const -> const multivector_t = 0;
127 virtual auto quad () const -> Scalar_T = 0;
129 virtual auto norm () const -> Scalar_T = 0;
131 virtual auto max_abs () const -> Scalar_T = 0;
133 virtual auto truncated (const Scalar_T& limit = default_truncation) const -> const multivector_t = 0;
135 virtual auto isinf () const -> bool = 0;
137 virtual auto isnan () const -> bool = 0;
139 virtual void write (const std::string& msg="") const = 0;
141 virtual void write (std::ofstream& ofile, const std::string& msg="") const = 0;
142 };
143
144#ifndef _GLUCAT_CLIFFORD_ALGEBRA_OPERATIONS
145#define _GLUCAT_CLIFFORD_ALGEBRA_OPERATIONS \
146 auto operator== (const multivector_t& val) const -> bool override;\
147 auto operator== (const Scalar_T& scr) const -> bool override;\
148 auto operator+= (const multivector_t& rhs) -> multivector_t& override;\
149 auto operator+= (const Scalar_T& scr) -> multivector_t& override;\
150 auto operator-= (const multivector_t& rhs) -> multivector_t& override;\
151 auto operator-= (const Scalar_T& scr) -> multivector_t& override;\
152 auto operator- () const -> const multivector_t override;\
153 auto operator*= (const Scalar_T& scr) -> multivector_t& override;\
154 auto operator*= (const multivector_t& rhs) -> multivector_t& override;\
155 auto operator%= (const multivector_t& rhs) -> multivector_t& override;\
156 auto operator&= (const multivector_t& rhs) -> multivector_t& override;\
157 auto operator^= (const multivector_t& rhs) -> multivector_t& override;\
158 auto operator/= (const Scalar_T& scr) -> multivector_t& override;\
159 auto operator/= (const multivector_t& rhs) -> multivector_t& override;\
160 auto operator|= (const multivector_t& rhs) -> multivector_t& override;\
161 auto inv () const -> const multivector_t override;\
162 auto pow (int m) const -> const multivector_t override;\
163 auto outer_pow (int m) const -> const multivector_t override;\
164 auto frame () const -> const index_set_t override;\
165 auto grade () const -> index_t override;\
166 auto operator[] (const index_set_t ist) const -> Scalar_T override;\
167 auto operator() (index_t grade) const -> const multivector_t override;\
168 auto scalar () const -> Scalar_T override;\
169 auto pure () const -> const multivector_t override;\
170 auto even () const -> const multivector_t override;\
171 auto odd () const -> const multivector_t override;\
172 auto vector_part () const -> const vector_t override;\
173 auto vector_part (const index_set_t frm, const bool prechecked = false) const \
174 -> const vector_t override;\
175 auto involute () const -> const multivector_t override;\
176 auto reverse () const -> const multivector_t override;\
177 auto conj () const -> const multivector_t override;\
178 auto quad () const -> Scalar_T override;\
179 auto norm () const -> Scalar_T override;\
180 auto max_abs () const -> Scalar_T override;\
181 auto truncated (const Scalar_T& limit = multivector_t::default_truncation) const \
182 -> const multivector_t override;\
183 auto isinf () const -> bool override;\
184 auto isnan () const -> bool override;\
185 void write (const std::string& msg="") const override;\
186 void write (std::ofstream& ofile, const std::string& msg="") const override;
187#endif // _GLUCAT_CLIFFORD_ALGEBRA_OPERATIONS
188
190 template
191 <
192 template<typename, const index_t, const index_t, typename> class Multivector,
193 template<typename, const index_t, const index_t, typename> class RHS,
194 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
195 >
196 auto
197 operator!= (const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, const RHS<Scalar_T,LO,HI,Tune_P>& rhs) -> bool;
198
200 template
201 <
202 template<typename, const index_t, const index_t, typename> class Multivector,
203 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
204 >
205 auto
206 operator!= (const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, const Scalar_T& scr) -> bool;
207
209 template
210 <
211 template<typename, const index_t, const index_t, typename> class Multivector,
212 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
213 >
214 auto
215 operator!= (const Scalar_T& scr, const Multivector<Scalar_T,LO,HI,Tune_P>& rhs) -> bool;
216
218 template
219 <
220 template<typename, const index_t, const index_t, typename> class Multivector,
221 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
222 >
223 auto
224 error_squared_tol(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> Scalar_T;
225
227 template
228 <
229 template<typename, const index_t, const index_t, typename> class Multivector,
230 template<typename, const index_t, const index_t, typename> class RHS,
231 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
232 >
233 auto
234 error_squared(const Multivector<Scalar_T,LO,HI,Tune_P>& lhs,
235 const RHS<Scalar_T,LO,HI,Tune_P>& rhs,
236 const Scalar_T threshold) -> Scalar_T;
237
239 template
240 <
241 template<typename, const index_t, const index_t, typename> class Multivector,
242 template<typename, const index_t, const index_t, typename> class RHS,
243 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
244 >
245 auto
246 approx_equal(const Multivector<Scalar_T,LO,HI,Tune_P>& lhs,
247 const RHS<Scalar_T,LO,HI,Tune_P>& rhs,
248 const Scalar_T threshold,
249 const Scalar_T tolerance) -> bool;
250
252 template
253 <
254 template<typename, const index_t, const index_t, typename> class Multivector,
255 template<typename, const index_t, const index_t, typename> class RHS,
256 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
257 >
258 auto
259 approx_equal(const Multivector<Scalar_T,LO,HI,Tune_P>& lhs,
260 const RHS<Scalar_T,LO,HI,Tune_P>& rhs) -> bool;
261
263 template
264 <
265 template<typename, const index_t, const index_t, typename> class Multivector,
266 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
267 >
268 auto
269 operator+ (const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, const Scalar_T& scr) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
270
272 template
273 <
274 template<typename, const index_t, const index_t, typename> class Multivector,
275 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
276 >
277 auto
278 operator+ (const Scalar_T& scr, const Multivector<Scalar_T,LO,HI,Tune_P>& rhs) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
279
281 template
282 <
283 template<typename, const index_t, const index_t, typename> class Multivector,
284 template<typename, const index_t, const index_t, typename> class RHS,
285 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
286 >
287 auto
288 operator+ (const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, const RHS<Scalar_T,LO,HI,Tune_P>& rhs) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
289
291 template
292 <
293 template<typename, const index_t, const index_t, typename> class Multivector,
294 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
295 >
296 auto
297 operator- (const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, const Scalar_T& scr) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
298
300 template
301 <
302 template<typename, const index_t, const index_t, typename> class Multivector,
303 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
304 >
305 auto
306 operator- (const Scalar_T& scr, const Multivector<Scalar_T,LO,HI,Tune_P>& rhs) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
307
309 template
310 <
311 template<typename, const index_t, const index_t, typename> class Multivector,
312 template<typename, const index_t, const index_t, typename> class RHS,
313 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
314 >
315 auto
316 operator- (const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, const RHS<Scalar_T,LO,HI,Tune_P>& rhs) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
317
319 template
320 <
321 template<typename, const index_t, const index_t, typename> class Multivector,
322 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
323 >
324 auto
325 operator* (const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, const Scalar_T& scr) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
326
328 template
329 <
330 template<typename, const index_t, const index_t, typename> class Multivector,
331 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
332 >
333 auto
334 operator* (const Scalar_T& scr, const Multivector<Scalar_T,LO,HI,Tune_P>& rhs) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
335
337 template
338 <
339 template<typename, const index_t, const index_t, typename> class Multivector,
340 template<typename, const index_t, const index_t, typename> class RHS,
341 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
342 >
343 auto
344 operator* (const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, const RHS<Scalar_T,LO,HI,Tune_P>& rhs) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
345
347 template
348 <
349 template<typename, const index_t, const index_t, typename> class Multivector,
350 template<typename, const index_t, const index_t, typename> class RHS,
351 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
352 >
353 auto
354 operator^ (const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, const RHS<Scalar_T,LO,HI,Tune_P>& rhs) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
355
357 template
358 <
359 template<typename, const index_t, const index_t, typename> class Multivector,
360 template<typename, const index_t, const index_t, typename> class RHS,
361 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
362 >
363 auto
364 operator& (const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, const RHS<Scalar_T,LO,HI,Tune_P>& rhs) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
365
367 template
368 <
369 template<typename, const index_t, const index_t, typename> class Multivector,
370 template<typename, const index_t, const index_t, typename> class RHS,
371 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
372 >
373 auto
374 operator% (const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, const RHS<Scalar_T,LO,HI,Tune_P>& rhs) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
375
377 template
378 <
379 template<typename, const index_t, const index_t, typename> class Multivector,
380 template<typename, const index_t, const index_t, typename> class RHS,
381 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
382 >
383 auto
384 star (const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, const RHS<Scalar_T,LO,HI,Tune_P>& rhs) -> Scalar_T;
385
387 template
388 <
389 template<typename, const index_t, const index_t, typename> class Multivector,
390 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
391 >
392 auto
393 operator/ (const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, const Scalar_T& scr) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
394
396 template
397 <
398 template<typename, const index_t, const index_t, typename> class Multivector,
399 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
400 >
401 auto
402 operator/ (const Scalar_T& scr, const Multivector<Scalar_T,LO,HI,Tune_P>& rhs) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
403
405 template
406 <
407 template<typename, const index_t, const index_t, typename> class Multivector,
408 template<typename, const index_t, const index_t, typename> class RHS,
409 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
410 >
411 auto
412 operator/ (const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, const RHS<Scalar_T,LO,HI,Tune_P>& rhs) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
413
415 template
416 <
417 template<typename, const index_t, const index_t, typename> class Multivector,
418 template<typename, const index_t, const index_t, typename> class RHS,
419 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
420 >
421 auto
422 operator| (const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, const RHS<Scalar_T,LO,HI,Tune_P>& rhs) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
423
425 template
426 <
427 template<typename, const index_t, const index_t, typename> class Multivector,
428 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
429 >
430 auto
431 inv(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
432
434 template
435 <
436 template<typename, const index_t, const index_t, typename> class Multivector,
437 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
438 >
439 auto
440 pow(const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, int rhs) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
441
443 template
444 <
445 template<typename, const index_t, const index_t, typename> class Multivector,
446 template<typename, const index_t, const index_t, typename> class RHS,
447 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
448 >
449 auto
450 pow(const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, const RHS<Scalar_T,LO,HI,Tune_P>& rhs) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
451
453 template< template<typename, const index_t, const index_t, typename> class Multivector,
454 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P >
455 auto
456 outer_pow(const Multivector<Scalar_T,LO,HI,Tune_P>& lhs, int rhs) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
457
459 template
460 <
461 template<typename, const index_t, const index_t, typename> class Multivector,
462 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
463 >
464 auto
465 scalar(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> Scalar_T;
466
468 template
469 <
470 template<typename, const index_t, const index_t, typename> class Multivector,
471 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
472 >
473 auto
474 real(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> Scalar_T;
475
477 template
478 <
479 template<typename, const index_t, const index_t, typename> class Multivector,
480 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
481 >
482 auto
483 imag(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> Scalar_T;
484
486 template
487 <
488 template<typename, const index_t, const index_t, typename> class Multivector,
489 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
490 >
491 auto
492 pure(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
493
495 template
496 <
497 template<typename, const index_t, const index_t, typename> class Multivector,
498 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
499 >
500 auto
501 even(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
502
504 template
505 <
506 template<typename, const index_t, const index_t, typename> class Multivector,
507 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
508 >
509 auto
510 odd(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
511
513 template
514 <
515 template<typename, const index_t, const index_t, typename> class Multivector,
516 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
517 >
518 auto
519 vector_part(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const std::vector<Scalar_T>;
520
522 template
523 <
524 template<typename, const index_t, const index_t, typename> class Multivector,
525 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
526 >
527 auto
528 involute(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
529
531 template
532 <
533 template<typename, const index_t, const index_t, typename> class Multivector,
534 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
535 >
536 auto
537 reverse(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
538
540 template
541 <
542 template<typename, const index_t, const index_t, typename> class Multivector,
543 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
544 >
545 auto
546 conj(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
547
549 template
550 <
551 template<typename, const index_t, const index_t, typename> class Multivector,
552 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
553 >
554 auto
555 quad(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> Scalar_T;
556
558 template
559 <
560 template<typename, const index_t, const index_t, typename> class Multivector,
561 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
562 >
563 auto
564 norm(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> Scalar_T;
565
567 template
568 <
569 template<typename, const index_t, const index_t, typename> class Multivector,
570 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
571 >
572 auto
573 abs(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> Scalar_T;
574
576 template
577 <
578 template<typename, const index_t, const index_t, typename> class Multivector,
579 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
580 >
581 auto
582 max_abs(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> Scalar_T;
583
585 template
586 <
587 template<typename, const index_t, const index_t, typename> class Multivector,
588 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
589 >
590 auto
591 complexifier(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
592
595 template
596 <
597 template<typename, const index_t, const index_t, typename> class Multivector,
598 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
599 >
600 auto
601 elliptic(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
602
604 template
605 <
606 template<typename, const index_t, const index_t, typename> class Multivector,
607 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
608 >
609 auto
610 sqrt(const Multivector<Scalar_T,LO,HI,Tune_P>& val,
611 const Multivector<Scalar_T,LO,HI,Tune_P>& i,
612 const bool prechecked = false) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
613
615 template
616 <
617 template<typename, const index_t, const index_t, typename> class Multivector,
618 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
619 >
620 auto
621 sqrt(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
622
623 // Transcendental functions
624
626 template
627 < template<typename, const index_t, const index_t, typename> class Multivector,
628 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
629 >
630 auto
631 clifford_exp(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
632
634 template
635 <
636 template<typename, const index_t, const index_t, typename> class Multivector,
637 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
638 >
639 auto
640 log(const Multivector<Scalar_T,LO,HI,Tune_P>& val,
641 const Multivector<Scalar_T,LO,HI,Tune_P>& i,
642 const bool prechecked = false) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
643
645 template
646 <
647 template<typename, const index_t, const index_t, typename> class Multivector,
648 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
649 >
650 auto
651 log(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
652
654 template
655 <
656 template<typename, const index_t, const index_t, typename> class Multivector,
657 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
658 >
659 auto
660 cos(const Multivector<Scalar_T,LO,HI,Tune_P>& val,
661 const Multivector<Scalar_T,LO,HI,Tune_P>& i,
662 const bool prechecked = false) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
663
665 template
666 <
667 template<typename, const index_t, const index_t, typename> class Multivector,
668 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
669 >
670 auto
671 cos(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
672
674 template
675 <
676 template<typename, const index_t, const index_t, typename> class Multivector,
677 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
678 >
679 auto
680 acos(const Multivector<Scalar_T,LO,HI,Tune_P>& val,
681 const Multivector<Scalar_T,LO,HI,Tune_P>& i,
682 const bool prechecked = false) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
683
685 template
686 <
687 template<typename, const index_t, const index_t, typename> class Multivector,
688 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
689 >
690 auto
691 acos(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
692
694 template
695 <
696 template<typename, const index_t, const index_t, typename> class Multivector,
697 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
698 >
699 auto
700 cosh(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
701
703 template
704 <
705 template<typename, const index_t, const index_t, typename> class Multivector,
706 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
707 >
708 auto
709 acosh(const Multivector<Scalar_T,LO,HI,Tune_P>& val,
710 const Multivector<Scalar_T,LO,HI,Tune_P>& i,
711 const bool prechecked = false) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
712
714 template
715 <
716 template<typename, const index_t, const index_t, typename> class Multivector,
717 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
718 >
719 auto
720 acosh(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
721
723 template
724 <
725 template<typename, const index_t, const index_t, typename> class Multivector,
726 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
727 >
728 auto
729 sin(const Multivector<Scalar_T,LO,HI,Tune_P>& val,
730 const Multivector<Scalar_T,LO,HI,Tune_P>& i,
731 const bool prechecked = false) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
732
734 template
735 <
736 template<typename, const index_t, const index_t, typename> class Multivector,
737 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
738 >
739 auto
740 sin(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
741
743 template
744 <
745 template<typename, const index_t, const index_t, typename> class Multivector,
746 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
747 >
748 auto
749 asin(const Multivector<Scalar_T,LO,HI,Tune_P>& val,
750 const Multivector<Scalar_T,LO,HI,Tune_P>& i,
751 const bool prechecked = false) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
752
754 template
755 <
756 template<typename, const index_t, const index_t, typename> class Multivector,
757 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
758 >
759 auto
760 asin(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
761
763 template
764 <
765 template<typename, const index_t, const index_t, typename> class Multivector,
766 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
767 >
768 auto
769 sinh(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
770
772 template
773 <
774 template<typename, const index_t, const index_t, typename> class Multivector,
775 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
776 >
777 auto
778 asinh(const Multivector<Scalar_T,LO,HI,Tune_P>& val,
779 const Multivector<Scalar_T,LO,HI,Tune_P>& i,
780 const bool prechecked = false) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
781
783 template
784 <
785 template<typename, const index_t, const index_t, typename> class Multivector,
786 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
787 >
788 auto
789 asinh(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
790
792 template
793 <
794 template<typename, const index_t, const index_t, typename> class Multivector,
795 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
796 >
797 auto
798 tan(const Multivector<Scalar_T,LO,HI,Tune_P>& val,
799 const Multivector<Scalar_T,LO,HI,Tune_P>& i,
800 const bool prechecked = false) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
801
803 template
804 <
805 template<typename, const index_t, const index_t, typename> class Multivector,
806 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
807 >
808 auto
809 tan(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
810
812 template
813 <
814 template<typename, const index_t, const index_t, typename> class Multivector,
815 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
816 >
817 auto
818 atan(const Multivector<Scalar_T,LO,HI,Tune_P>& val,
819 const Multivector<Scalar_T,LO,HI,Tune_P>& i,
820 const bool prechecked = false) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
821
823 template
824 <
825 template<typename, const index_t, const index_t, typename> class Multivector,
826 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
827 >
828 auto
829 atan(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
830
832 template
833 <
834 template<typename, const index_t, const index_t, typename> class Multivector,
835 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
836 >
837 auto
838 tanh(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
839
841 template
842 <
843 template<typename, const index_t, const index_t, typename> class Multivector,
844 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
845 >
846 auto
847 atanh(const Multivector<Scalar_T,LO,HI,Tune_P>& val,
848 const Multivector<Scalar_T,LO,HI,Tune_P>& i,
849 const bool prechecked = false) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
850
852 template
853 <
854 template<typename, const index_t, const index_t, typename> class Multivector,
855 typename Scalar_T, const index_t LO, const index_t HI, typename Tune_P
856 >
857 auto
858 atanh(const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> const Multivector<Scalar_T,LO,HI,Tune_P>;
859}
860#endif // _GLUCAT_CLIFFORD_ALGEBRA_H
clifford_algebra<> declares the operations of a Clifford algebra
virtual void write(const std::string &msg="") const =0
Write formatted multivector to output.
virtual auto involute() const -> const multivector_t=0
Main involution, each {i} is replaced by -{i} in each term, eg. {1} -> -{1}.
virtual auto outer_pow(int m) const -> const multivector_t=0
Outer product power.
virtual auto isinf() const -> bool=0
Check if a multivector contains any infinite values.
virtual auto quad() const -> Scalar_T=0
Scalar_T quadratic form == (rev(x)*x)(0)
virtual auto scalar() const -> Scalar_T=0
Scalar part.
static const index_t v_hi
virtual auto conj() const -> const multivector_t=0
Conjugation, reverse o involute == involute o reverse.
virtual auto operator-=(const multivector_t &rhs) -> multivector_t &=0
Geometric difference.
virtual auto grade() const -> index_t=0
Maximum of the grades of each term.
virtual auto even() const -> const multivector_t=0
Even part of multivector, sum of even grade terms.
virtual auto frame() const -> const index_set_t=0
Subalgebra generated by all generators of terms of given multivector.
static auto classname() -> const std::string
static const index_t v_lo
virtual ~clifford_algebra()=default
virtual auto max_abs() const -> Scalar_T=0
Maximum of absolute values of components of multivector: multivector infinity norm.
virtual auto odd() const -> const multivector_t=0
Odd part of multivector, sum of odd grade terms.
virtual auto vector_part() const -> const vector_t=0
Vector part of multivector, as a vector_t with respect to frame()
virtual auto reverse() const -> const multivector_t=0
Reversion, eg. {1}*{2} -> {2}*{1}.
std::vector< Scalar_T > vector_t
virtual auto operator-() const -> const multivector_t=0
Unary -.
virtual auto operator+=(const multivector_t &rhs) -> multivector_t &=0
Geometric sum.
virtual auto truncated(const Scalar_T &limit=default_truncation) const -> const multivector_t=0
Remove all terms with relative size smaller than limit.
virtual auto pure() const -> const multivector_t=0
Pure part.
static const Scalar_T default_truncation
Default for truncation.
virtual auto operator==(const multivector_t &val) const -> bool=0
Test for equality of multivectors.
virtual auto isnan() const -> bool=0
Check if a multivector contains any IEEE NaN values.
std::pair< const index_set_t, Scalar_T > pair_t
virtual auto norm() const -> Scalar_T=0
Scalar_T norm == sum of norm of coordinates.
virtual auto pow(int m) const -> const multivector_t=0
*this to the m
virtual auto inv() const -> const multivector_t=0
Geometric multiplicative inverse.
auto operator|(const Multivector< Scalar_T, LO, HI, Tune_P > &lhs, const RHS< Scalar_T, LO, HI, Tune_P > &rhs) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Transformation via twisted adjoint action.
auto operator*(const Multivector< Scalar_T, LO, HI, Tune_P > &lhs, const Scalar_T &scr) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Product of multivector and scalar.
auto operator&(const Multivector< Scalar_T, LO, HI, Tune_P > &lhs, const RHS< Scalar_T, LO, HI, Tune_P > &rhs) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inner product.
auto cosh(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Hyperbolic cosine of multivector.
auto tanh(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Hyperbolic tangent of multivector.
auto approx_equal(const Multivector< Scalar_T, LO, HI, Tune_P > &lhs, const RHS< Scalar_T, LO, HI, Tune_P > &rhs, const Scalar_T threshold, const Scalar_T tolerance) -> bool
Test for approximate equality of multivectors.
auto tan(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Tangent of multivector with specified complexifier.
auto error_squared(const Multivector< Scalar_T, LO, HI, Tune_P > &lhs, const RHS< Scalar_T, LO, HI, Tune_P > &rhs, const Scalar_T threshold) -> Scalar_T
Relative or absolute error using the quadratic norm.
auto elliptic(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
auto sinh(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Hyperbolic sine of multivector.
auto imag(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> Scalar_T
Imaginary part: deprecated (always 0)
auto operator+(const Multivector< Scalar_T, LO, HI, Tune_P > &lhs, const Scalar_T &scr) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Geometric sum of multivector and scalar.
auto operator%(const Multivector< Scalar_T, LO, HI, Tune_P > &lhs, const RHS< Scalar_T, LO, HI, Tune_P > &rhs) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Left contraction.
auto sin(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Sine of multivector with specified complexifier.
auto abs(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> Scalar_T
Absolute value == sqrt(norm)
auto asinh(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse hyperbolic sine of multivector with specified complexifier.
auto atanh(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse hyperbolic tangent of multivector with specified complexifier.
auto atan(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse tangent of multivector with specified complexifier.
int index_t
Size of index_t should be enough to represent LO, HI.
Definition global.h:77
auto clifford_exp(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Exponential of multivector.
auto cos(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Cosine of multivector with specified complexifier.
auto operator/(const Multivector< Scalar_T, LO, HI, Tune_P > &lhs, const Scalar_T &scr) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Quotient of multivector and scalar.
auto log(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Natural logarithm of multivector with specified complexifier.
auto asin(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse sine of multivector with specified complexifier.
auto real(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> Scalar_T
Real part: synonym for scalar part.
auto acosh(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse hyperbolic cosine of multivector with specified complexifier.
auto error_squared_tol(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> Scalar_T
Quadratic norm error tolerance relative to a specific multivector.
auto star(const Multivector< Scalar_T, LO, HI, Tune_P > &lhs, const RHS< Scalar_T, LO, HI, Tune_P > &rhs) -> Scalar_T
Hestenes scalar product.
auto operator^(const Multivector< Scalar_T, LO, HI, Tune_P > &lhs, const RHS< Scalar_T, LO, HI, Tune_P > &rhs) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Outer product.
auto sqrt(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Square root of multivector with specified complexifier.
auto complexifier(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Square root of -1 which commutes with all members of the frame of the given multivector.
auto acos(const Multivector< Scalar_T, LO, HI, Tune_P > &val, const Multivector< Scalar_T, LO, HI, Tune_P > &i, const bool prechecked=false) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Inverse cosine of multivector with specified complexifier.
auto operator!=(const Multivector< Scalar_T, LO, HI, Tune_P > &lhs, const RHS< Scalar_T, LO, HI, Tune_P > &rhs) -> bool
Test for inequality of multivectors.