1#ifndef _GLUCAT_CLIFFORD_ALGEBRA_H
2#define _GLUCAT_CLIFFORD_ALGEBRA_H
44 template<
typename Scalar_T,
typename Index_Set_T,
typename Multivector_T>
53 using pair_t = std::pair<const index_set_t, Scalar_T>;
56 static auto classname() ->
const std::string;
67 virtual auto operator== (
const Scalar_T& scr)
const ->
bool = 0;
105 virtual auto operator[] (const
index_set_t ist) const -> Scalar_T = 0;
109 virtual auto
scalar () const -> Scalar_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;
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;
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;
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
197 operator!= (
const Multivector<Scalar_T,LO,HI,Tune_P>& lhs,
const RHS<Scalar_T,LO,HI,Tune_P>& rhs) -> bool;
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
206 operator!= (
const Multivector<Scalar_T,LO,HI,Tune_P>& lhs,
const Scalar_T& scr) -> bool;
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
215 operator!= (
const Scalar_T& scr,
const Multivector<Scalar_T,LO,HI,Tune_P>& rhs) -> bool;
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
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
235 const RHS<Scalar_T,LO,HI,Tune_P>& rhs,
236 const Scalar_T threshold) -> Scalar_T;
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
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;
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
259 approx_equal(
const Multivector<Scalar_T,LO,HI,Tune_P>& lhs,
260 const RHS<Scalar_T,LO,HI,Tune_P>& rhs) -> bool;
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
269 operator+ (
const Multivector<Scalar_T,LO,HI,Tune_P>& lhs,
const Scalar_T& scr) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
278 operator+ (
const Scalar_T& scr,
const Multivector<Scalar_T,LO,HI,Tune_P>& rhs) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
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>;
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
297 operator- (
const Multivector<Scalar_T,LO,HI,Tune_P>& lhs,
const Scalar_T& scr) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
306 operator- (
const Scalar_T& scr,
const Multivector<Scalar_T,LO,HI,Tune_P>& rhs) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
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>;
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
325 operator* (
const Multivector<Scalar_T,LO,HI,Tune_P>& lhs,
const Scalar_T& scr) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
334 operator* (
const Scalar_T& scr,
const Multivector<Scalar_T,LO,HI,Tune_P>& rhs) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
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>;
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
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>;
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
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>;
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
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>;
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
384 star (
const Multivector<Scalar_T,LO,HI,Tune_P>& lhs,
const RHS<Scalar_T,LO,HI,Tune_P>& rhs) -> Scalar_T;
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
393 operator/ (
const Multivector<Scalar_T,LO,HI,Tune_P>& lhs,
const Scalar_T& scr) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
402 operator/ (
const Scalar_T& scr,
const Multivector<Scalar_T,LO,HI,Tune_P>& rhs) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
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>;
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
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>;
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
431 inv(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
440 pow(
const Multivector<Scalar_T,LO,HI,Tune_P>& lhs,
int rhs) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
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>;
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 >
456 outer_pow(
const Multivector<Scalar_T,LO,HI,Tune_P>& lhs,
int rhs) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
465 scalar(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> Scalar_T;
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
474 real(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> Scalar_T;
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
483 imag(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> Scalar_T;
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
492 pure(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
501 even(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
510 odd(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
519 vector_part(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const std::vector<Scalar_T>;
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
528 involute(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
537 reverse(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
546 conj(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
555 quad(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> Scalar_T;
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
564 norm(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> Scalar_T;
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
573 abs(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> Scalar_T;
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
582 max_abs(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) -> Scalar_T;
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
591 complexifier(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
601 elliptic(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
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>;
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
621 sqrt(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
631 clifford_exp(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
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>;
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
651 log(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
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>;
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
671 cos(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
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>;
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
691 acos(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
700 cosh(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
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>;
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
720 acosh(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
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>;
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
740 sin(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
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>;
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
760 asin(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
769 sinh(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
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>;
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
789 asinh(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
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>;
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
809 tan(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
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>;
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
829 atan(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
838 tanh(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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
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>;
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
858 atanh(
const Multivector<Scalar_T,LO,HI,Tune_P>& val) ->
const Multivector<Scalar_T,LO,HI,Tune_P>;
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.
Multivector_T multivector_t
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.
int index_t
Size of index_t should be enough to represent LO, HI.
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.
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.