glucat  0.12.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 
41 namespace 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
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 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.
virtual auto quad() const -> Scalar_T=0
Scalar_T quadratic form == (rev(x)*x)(0)
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.
virtual auto scalar() const -> Scalar_T=0
Scalar part.
virtual auto outer_pow(int m) const -> const multivector_t=0
Outer product power.
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.
A framed_multi<Scalar_T,LO,HI,Tune_P> is a framed approximation to a multivector. ...
Definition: framed_multi.h:56
static const Scalar_T default_truncation
Default for truncation.
clifford_algebra<> declares the operations of a Clifford algebra
virtual auto pure() const -> const multivector_t=0
Pure part.
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.
static const index_t v_hi
virtual auto norm() const -> Scalar_T=0
Scalar_T norm == sum of norm of coordinates.
auto elliptic(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
virtual auto inv() const -> const multivector_t=0
Geometric multiplicative inverse.
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.
virtual auto conj() const -> const multivector_t=0
Conjugation, reverse o involute == involute o reverse.
virtual auto even() const -> const multivector_t=0
Even part of multivector, sum of even grade terms.
virtual auto operator-=(const multivector_t &rhs) -> multivector_t &=0
Geometric difference.
virtual auto pow(int m) const -> const multivector_t=0
*this to the m
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 clifford_exp(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Exponential of multivector.
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 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 sinh(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Hyperbolic sine 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.
virtual void write(const std::string &msg="") const =0
Write formatted multivector to output.
static auto classname() -> const std::string
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 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.
virtual auto reverse() const -> const multivector_t=0
Reversion, eg. {1}*{2} -> {2}*{1}.
auto tanh(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Hyperbolic tangent of multivector.
virtual auto frame() const -> const index_set_t=0
Subalgebra generated by all generators of terms of given multivector.
auto error_squared_tol(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> Scalar_T
Quadratic norm error tolerance relative to a specific multivector.
virtual auto vector_part() const -> const vector_t=0
Vector part of multivector, as a vector_t with respect to frame()
auto abs(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> Scalar_T
Absolute value == sqrt(norm)
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.
virtual auto truncated(const Scalar_T &limit=default_truncation) const -> const multivector_t=0
Remove all terms with relative size smaller than limit.
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 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.
virtual auto odd() const -> const multivector_t=0
Odd part of multivector, sum of odd grade terms.
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 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.
virtual ~clifford_algebra()=default
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
virtual auto grade() const -> index_t=0
Maximum of the grades of each term.
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.
Index set class based on std::bitset<> in Gnu standard C++ library.
Definition: index_set.h:45
virtual auto isinf() const -> bool=0
Check if a multivector contains any infinite values.
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.
virtual auto operator==(const multivector_t &val) const -> bool=0
Test for equality of multivectors.
static const index_t v_lo
virtual auto operator+=(const multivector_t &rhs) -> multivector_t &=0
Geometric sum.
auto real(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> Scalar_T
Real part: synonym for scalar part.
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 cosh(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> const Multivector< Scalar_T, LO, HI, Tune_P >
Hyperbolic cosine of multivector.
virtual auto max_abs() const -> Scalar_T=0
Maximum of absolute values of components of multivector: multivector infinity norm.
virtual auto operator-() const -> const multivector_t=0
Unary -.
auto imag(const Multivector< Scalar_T, LO, HI, Tune_P > &val) -> Scalar_T
Imaginary part: deprecated (always 0)
virtual auto involute() const -> const multivector_t=0
Main involution, each {i} is replaced by -{i} in each term, eg. {1} -> -{1}.
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.
virtual auto isnan() const -> bool=0
Check if a multivector contains any IEEE NaN values.
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.