ADOL-C: Automatic Differentiation in C/C++ 2.7.3
Loading...
Searching...
No Matches
adtb_types.h
Go to the documentation of this file.
1/*----------------------------------------------------------------------------
2 ADOL-C -- Automatic Differentiation by Overloading in C++
3 File: adtb_types.h
4 Revision: $Id$
5 Contents: adtb_types.h contains the declarations of tape_location, adouble and
6pdouble.
7
8 Copyright (c) Andrea Walther, Andreas Griewank, Andreas Kowarz,
9 Hristo Mitev, Sebastian Schlenkrich, Jean Utke, Olaf Vogel,
10 Benjamin Letschert, Kshitij Kulshreshtha
11
12 This file is part of ADOL-C. This software is provided as open source.
13 Any use, reproduction, or distribution of the software constitutes
14 recipient's acceptance of the terms of the accompanying license file.
15
16---------------------------------------------------------------------------*/
17
18#ifndef ADOLC_AD_TYPES_H
19#define ADOLC_AD_TYPES_H
20
21#include <adolc/adolcerror.h>
22#include <adolc/adolcexport.h>
25#include <cassert>
26#include <cmath>
27#include <iostream>
28#include <limits>
29#include <span>
30#include <type_traits>
31
32// Forward declarations for concept
33class adouble;
34class pdouble;
35
41template <typename T>
43 std::is_same_v<T, adouble> || std::is_same_v<T, pdouble>;
44
57template <adouble_or_pdouble T> class tape_location {
58 size_t loc_{0};
59
63 int valid_{1};
64
73 size_t next_loc() {
74 if constexpr (std::is_same_v<T, adouble>)
75 return currentTape().next_loc();
76 else
77 return currentTape().p_next_loc();
78 }
79
85 void free_loc() {
86 assert(currentTapePtr() != nullptr &&
87 "Tape was deleted before all adoubles are destroyed!");
88 if constexpr (std::is_same_v<T, adouble>)
90
91 // currently freeing the location of pdouble leads to errors
92 // need to revisit the issue
93 // currentTape().p_free_loc(loc());
94 }
95
96public:
111 };
112
118 if (owns_location()) {
119 free_loc();
120 }
121 }
122
127 tape_location() : loc_(next_loc()) {}
128
135 explicit tape_location(size_t loc, ownership_mode mode = OWNING)
136 : loc_(loc), valid_(mode) {}
137
139 tape_location(const tape_location &) = delete;
140
143
150 tape_location(tape_location &&other) noexcept
151 : loc_(other.loc_), valid_(other.valid_) {
152 other.valid_ = INVALID;
153 };
154
162 if (this == &other)
163 return *this;
164
165 // free location of *this
166 if (owns_location())
167 free_loc();
168
169 // Transfer ownership
170 loc_ = other.loc_;
171 valid_ = other.valid_;
172
173 other.valid_ = INVALID;
174 return *this;
175 };
176
182 size_t loc() const { return loc_; }
183
187 bool owns_location() const { return valid_ == OWNING; }
188 bool is_valid() const { return valid_ != INVALID; }
189
195 size_t release() {
196 assert(is_valid());
197 valid_ = INVALID;
198 return loc_;
199 }
200};
201
213 tape_location<adouble> tape_loc_;
214
215 explicit adouble(tape_location<adouble> &&loc) : tape_loc_(std::move(loc)) {}
216
217public:
219 ~adouble() = default;
220
228
234 adouble(double coval);
235
244 adouble(const adouble &a);
245
253 adouble(adouble &&other) noexcept : tape_loc_(std::move(other.tape_loc_)) {};
254
265
272 size_t release_loc() { return tape_loc_.release(); }
273 bool is_valid() const { return tape_loc_.is_valid(); }
274
275 // Assignment Operators
276
283 adouble &operator=(const double coval);
284
292
301 adouble &operator=(adouble &&other) noexcept {
302 if (this == &other) {
303 return *this;
304 }
305 tape_loc_ = std::move(other.tape_loc_);
306 return *this;
307 }
314
315 // Accessors
323 double value() const {
324 assert(is_valid());
325 return currentTape().get_ad_value(loc());
326 }
327
332 size_t loc() const {
333 assert(is_valid());
334 return tape_loc_.loc();
335 }
336
337 // Mutators
342 void value(const double coval) {
343 assert(is_valid());
344 currentTape().set_ad_value(loc(), coval);
345 }
346
347 // Type Conversions
348
354 explicit operator double() const { return value(); }
355
356 // Arithmetic assignment Operators
357
358 adouble &operator+=(const double coval);
361 inline adouble &operator+=(const pdouble &p);
362
363 adouble &operator-=(const double coval);
366 inline adouble &operator-=(const pdouble &p);
367
368 adouble &operator*=(const double coval);
370 inline adouble &operator*=(const pdouble &p);
371
372 inline adouble &operator/=(const double coval);
373 inline adouble &operator/=(const adouble &a);
374 inline adouble &operator/=(adouble &&a);
375 inline adouble &operator/=(const pdouble &p);
376
377 // Postfix and Prefix Increment and Decrement Operators
378
381
384
385 // Independent and Dependent Markers
386
397 adouble &operator<<=(const double input);
398
409 adouble &operator>>=(double &out);
410
413
416};
417
433 tape_location<pdouble> tape_loc_;
434
435public:
437 ~pdouble() = default;
438
440 pdouble() = delete;
441
443 pdouble(const pdouble &) = delete;
444 pdouble &operator=(const pdouble &) = delete;
445
453 pdouble(pdouble &&other) noexcept : tape_loc_{std::move(other.tape_loc_)} {};
454
463 pdouble &operator=(pdouble &&other) noexcept {
464 if (this == &other)
465 return *this;
466
467 tape_loc_ = std::move(other.tape_loc_);
468 return *this;
469 }
470
476 explicit pdouble(const double pval);
477
484 explicit operator adouble() const;
485
490 size_t loc() const { return tape_loc_.loc(); }
491
496 double value() const { return currentTape().get_pd_value(loc()); }
497
502 void value(const double pval) { currentTape().set_pd_value(loc(), pval); }
503};
504
518ADOLC_API inline void operator<<=(std::span<adouble> indeps,
519 std::span<const double> inputs) {
520 assert(indeps.size() == inputs.size() && "Size mismatch!");
521 for (size_t i = 0; i < indeps.size(); ++i) {
522 indeps[i] <<= inputs[i];
523 }
524}
525
538ADOLC_API inline void operator>>=(std::span<adouble> deps,
539 std::span<double> outputs) {
540 assert(deps.size() == outputs.size() && "Size mismatch!");
541 for (size_t i = 0; i < deps.size(); ++i) {
542 deps[i] >>= outputs[i];
543 }
544}
545
546ADOLC_API std::ostream &operator<<(std::ostream &, const adouble &);
547ADOLC_API std::istream &operator>>(std::istream &, const adouble &);
548
553/*--------------------------------------------------------------------------*/
554/* sign operators */
557
560
561/*--------------------------------------------------------------------------*/
562/* binary operators */
563
564/*--------------------------------------------------------------------------*/
568 return std::move(b) + a;
569}
571 return std::move(a) + b;
572}
573ADOLC_API adouble operator+(const double coval, const adouble &a);
574ADOLC_API adouble operator+(const double coval, adouble &&a);
575inline adouble operator+(const adouble &a, const double coval) {
576 return coval + a;
577}
578inline adouble operator+(adouble &&a, const double coval) {
579 return coval + std::move(a);
580}
581/*--------------------------------------------------------------------------*/
582
586 return -(std::move(b)) + a;
587}
589 return std::move(a) - b;
590}
591ADOLC_API adouble operator-(const double coval, const adouble &a);
592ADOLC_API adouble operator-(const double coval, adouble &&a);
593ADOLC_API inline adouble operator-(const adouble &a, const double coval) {
594 return (-coval) + a;
595}
596ADOLC_API inline adouble operator-(adouble &&a, const double coval) {
597 return (-coval) + std::move(a);
598}
599
600/*--------------------------------------------------------------------------*/
601
605 return std::move(b) * a;
606}
608 return std::move(a) * b;
609}
610ADOLC_API adouble operator*(const double coval, const adouble &a);
611ADOLC_API adouble operator*(const double coval, adouble &&a);
612ADOLC_API inline adouble operator*(const adouble &a, const double coval) {
613 return coval * a;
614}
615ADOLC_API inline adouble operator*(adouble &&a, const double coval) {
616 return coval * std::move(a);
617}
618
619/*--------------------------------------------------------------------------*/
620
625 return std::move(a) / b;
626}
627ADOLC_API adouble operator/(const double coval, const adouble &a);
628ADOLC_API adouble operator/(const double coval, adouble &&a);
629ADOLC_API inline adouble operator/(const adouble &a, const double coval) {
630 return a * (1.0 / coval);
631}
632ADOLC_API inline adouble operator/(adouble &&a, const double coval) {
633 return std::move(a) * (1.0 / coval);
634}
635
636/*--------------------------------------------------------------------------*/
637/* Inlined Arithmetic assignments */
638ADOLC_API inline adouble &adouble::operator/=(const double coval) {
639 *this *= 1.0 / coval;
640 return *this;
641}
643 *this *= 1.0 / a;
644 return *this;
645}
647 *this *= 1.0 / std::move(a);
648 return *this;
649}
650/*--------------------------------------------------------------------------*/
651/* Comparison */
652
653ADOLC_API bool operator!=(const adouble &a, const double coval);
654ADOLC_API bool operator!=(const double coval, const adouble &a);
655
656ADOLC_API bool operator==(const double coval, const adouble &a);
657ADOLC_API bool operator==(const adouble &a, const double coval);
658
659ADOLC_API bool operator<=(const double coval, const adouble &a);
660ADOLC_API bool operator<=(const adouble &a, const double coval);
661
662ADOLC_API bool operator>=(const double coval, const adouble &a);
663ADOLC_API bool operator>=(const adouble &a, const double coval);
664
665ADOLC_API bool operator<(const double coval, const adouble &a);
666ADOLC_API bool operator<(const adouble &a, const double coval);
667
668ADOLC_API bool operator>(const double coval, const adouble &a);
669ADOLC_API bool operator>(const adouble &a, const double coval);
670
671#ifdef ADOLC_ADVANCED_BRANCHING
672
673ADOLC_API adouble operator!=(const adouble &a, const adouble &b);
676
677ADOLC_API adouble operator==(const adouble &a, const adouble &b);
680
681ADOLC_API adouble operator<=(const adouble &a, const adouble &b);
684
685ADOLC_API adouble operator>=(const adouble &a, const adouble &b);
688
689ADOLC_API adouble operator<(const adouble &a, const adouble &b);
692
693ADOLC_API adouble operator>(const adouble &a, const adouble &b);
696
697#else // ADOLC_ADVANCED_BRANCHING
698
699ADOLC_API inline bool operator!=(const adouble &a, const adouble &b) {
700 return (a - b != 0.0);
701}
702ADOLC_API inline bool operator==(const adouble &a, const adouble &b) {
703 return (a - b == 0.0);
704}
705ADOLC_API inline bool operator<=(const adouble &a, const adouble &b) {
706 return (a - b <= 0.0);
707}
708ADOLC_API inline bool operator>=(const adouble &a, const adouble &b) {
709 return (a - b >= 0.0);
710}
711ADOLC_API inline bool operator>(const adouble &a, const adouble &b) {
712 return (a - b > 0.0);
713}
714ADOLC_API inline bool operator<(const adouble &a, const adouble &b) {
715 return (a - b < 0.0);
716}
717
718#endif // ADOLC_ADVANCED_BRANCHING
719
726ADOLC_API inline bool isnormal(const adouble &a) {
727 return std::isnormal(a.value());
728}
729
736ADOLC_API inline bool isnan(const adouble &a) { return std::isnan(a.value()); }
737
744ADOLC_API inline bool isinf(const adouble &a) { return std::isinf(a.value()); }
745
752ADOLC_API inline bool isfinite(const adouble &a) {
753 return std::isfinite(a.value());
754}
755
756/*--------------------------------------------------------------------------*/
757/* unary operators */
760
763
764ADOLC_API inline adouble log10(const adouble &a) {
765 return log(a) / ADOLC_MATH_NSP::log(10.0);
766}
768 return log(std::move(a)) / ADOLC_MATH_NSP::log(10.0);
769}
770
773
776
779
782
783ADOLC_API inline adouble tan(const adouble &a) { return sin(a) / cos(a); }
784ADOLC_API inline adouble tan(adouble &&a) { return sin(a) / cos(a); }
785
788
791
794
795/*--------------------------------------------------------------------------*/
796ADOLC_API inline adouble sinh(const adouble &a) {
797 if (a.value() < 0.0) {
798 adouble temp = exp(a);
799 return 0.5 * (temp - 1.0 / temp);
800 } else {
801 adouble temp = exp(-a);
802 return 0.5 * (1.0 / temp - temp);
803 }
804}
806 if (a.value() < 0.0) {
807 adouble temp = exp(std::move(a));
808 return 0.5 * (temp - 1.0 / temp);
809 } else {
810 adouble temp = exp(-std::move(a));
811 return 0.5 * (1.0 / temp - temp);
812 }
813}
814/*--------------------------------------------------------------------------*/
815
816ADOLC_API inline adouble cosh(const adouble &a) {
817 adouble temp = (a.value() < 0.0) ? exp(a) : exp(-a);
818 return 0.5 * (temp + 1.0 / temp);
819}
821 adouble temp = (a.value() < 0.0) ? exp(std::move(a)) : exp(-std::move(a));
822 return 0.5 * (temp + 1.0 / temp);
823}
824/*--------------------------------------------------------------------------*/
825
826ADOLC_API inline adouble tanh(const adouble &a) {
827 if (a.value() < 0.0) {
828 adouble temp = exp(2.0 * a);
829 return (temp - 1.0) / (temp + 1.0);
830 } else {
831 adouble temp = exp((-2.0) * a);
832 return (1.0 - temp) / (temp + 1.0);
833 }
834}
836 if (a.value() < 0.0) {
837 adouble temp = exp(2.0 * std::move(a));
838 return (temp - 1.0) / (temp + 1.0);
839 } else {
840 adouble temp = exp((-2.0) * std::move(a));
841 return (1.0 - temp) / (temp + 1.0);
842 }
843}
844/*--------------------------------------------------------------------------*/
845
848
851
854
857
860
863
866
869
870ADOLC_API inline adouble abs(const adouble &a) { return fabs(a); }
871ADOLC_API inline adouble abs(adouble &&a) { return fabs(std::move(a)); }
872
873/*--------------------------------------------------------------------------*/
874/* Min and Max */
875
880 return fmin(std::move(a), b);
881}
882ADOLC_API inline adouble fmin(const double coval, const adouble &a) {
883 return fmin(adouble(coval), a);
884}
885ADOLC_API inline adouble fmin(const double coval, adouble &&a) {
886 return fmin(adouble(coval), std::move(a));
887}
888ADOLC_API inline adouble fmin(const adouble &a, const double coval) {
889 return fmin(a, adouble(coval));
890}
891ADOLC_API inline adouble fmin(adouble &&a, const double coval) {
892 return fmin(std::move(a), adouble(coval));
893}
894
895ADOLC_API inline adouble min(const adouble &a, const adouble &b) {
896 return fmin(a, b);
897}
898ADOLC_API inline adouble min(adouble &&a, const adouble &b) {
899 return fmin(std::move(a), b);
900}
901ADOLC_API inline adouble min(const adouble &a, adouble &&b) {
902 return fmin(a, std::move(b));
903}
905 return fmin(std::move(a), b);
906}
907ADOLC_API inline adouble min(const double coval, const adouble &a) {
908 return fmin(coval, a);
909}
910ADOLC_API inline adouble min(const double coval, adouble &&a) {
911 return fmin(coval, std::move(a));
912}
913ADOLC_API inline adouble min(const adouble &a, const double coval) {
914 return fmin(a, coval);
915}
916ADOLC_API inline adouble min(adouble &&a, const double coval) {
917 return fmin(std::move(a), coval);
918}
919
920/*--------------------------------------------------------------------------*/
921
922ADOLC_API inline adouble fmax(const adouble &a, const adouble &b) {
923 return (-fmin(-a, -b));
924}
925ADOLC_API inline adouble fmax(adouble &&a, const adouble &b) {
926 return (-fmin(-std::move(a), -b));
927}
928ADOLC_API inline adouble fmax(const adouble &a, adouble &&b) {
929 return (-fmin(-a, -std::move(b)));
930}
932 return fmax(std::move(a), b);
933}
934ADOLC_API inline adouble fmax(const double coval, const adouble &a) {
935 return (-fmin(-coval, -a));
936}
937ADOLC_API inline adouble fmax(const double coval, adouble &&a) {
938 return (-fmin(-coval, -std::move(a)));
939}
940ADOLC_API inline adouble fmax(const adouble &a, const double coval) {
941 return (-fmin(-a, -coval));
942}
943ADOLC_API inline adouble fmax(adouble &&a, const double coval) {
944 return (-fmin(-std::move(a), -coval));
945}
946
947ADOLC_API inline adouble max(const adouble &a, const adouble &b) {
948 return fmax(a, b);
949}
950
951ADOLC_API inline adouble max(adouble &&a, const adouble &b) {
952 return fmax(std::move(a), b);
953}
954ADOLC_API inline adouble max(const adouble &a, adouble &&b) {
955 return fmax(a, std::move(b));
956}
957
959 return fmax(std::move(a), b);
960}
961ADOLC_API inline adouble max(const double coval, const adouble &a) {
962 return fmax(coval, a);
963}
964ADOLC_API inline adouble max(const double coval, adouble &&a) {
965 return fmax(coval, std::move(a));
966}
967ADOLC_API inline adouble max(const adouble &a, const double coval) {
968 return fmax(a, coval);
969}
970ADOLC_API inline adouble max(adouble &&a, const double coval) {
971 return fmax(std::move(a), coval);
972}
973
974/*--------------------------------------------------------------------------*/
975/* ldexp and frexp */
976
977ADOLC_API inline adouble ldexp(const adouble &a, const int exp) {
978 return a * ldexp(1.0, exp);
979}
980ADOLC_API inline adouble ldexp(adouble &&a, const int exp) {
981 return a * ldexp(1.0, exp);
982}
983
984/*--------------------------------------------------------------------------*/
985
986ADOLC_API inline adouble frexp(const adouble &a, int *exp) {
987 double coval = std::frexp(a.value(), exp);
988 return adouble(coval);
989}
990ADOLC_API inline adouble frexp(adouble &&a, int *exp) {
991 const double coval = std::frexp(a.value(), exp);
992 a.value(coval);
993 return a;
994}
995
996/*---------------------------------------------------------------*/
997/* Conditional assignments */
998
999ADOLC_API void condassign(adouble &res, const adouble &cond,
1000 const adouble &arg1, const adouble &arg2);
1001ADOLC_API inline void condassign(double &res, const double &cond,
1002 const double &arg1, const double &arg2) {
1003 res = cond > 0 ? arg1 : arg2;
1004}
1005/*---------------------------------------------------------------*/
1006ADOLC_API void condassign(adouble &res, const adouble &cond,
1007 const adouble &arg);
1008ADOLC_API inline void condassign(double &res, const double &cond,
1009 const double &arg) {
1010 res = cond > 0 ? arg : res;
1011}
1012/*---------------------------------------------------------------*/
1013ADOLC_API void condeqassign(adouble &res, const adouble &cond,
1014 const adouble &arg1, const adouble &arg2);
1015ADOLC_API inline void condeqassign(double &res, const double &cond,
1016 const double &arg1, const double &arg2) {
1017 res = cond >= 0 ? arg1 : arg2;
1018}
1019/*---------------------------------------------------------------*/
1020ADOLC_API inline void condeqassign(double &res, const double &cond,
1021 const double &arg) {
1022 res = cond >= 0 ? arg : res;
1023}
1024ADOLC_API void condeqassign(adouble &res, const adouble &cond,
1025 const adouble &arg);
1026
1027/*---------------------------------------------------------------*/
1028/* power function */
1029ADOLC_API adouble pow(const adouble &a, const double exp);
1030ADOLC_API adouble pow(adouble &&a, const double exp);
1031ADOLC_API inline adouble pow(double coval, const adouble &a) {
1032 adouble ret;
1033 if (coval <= 0)
1036
1037 condassign(ret, adouble{coval}, exp(a * ADOLC_MATH_NSP::log(coval)),
1038 adouble{ADOLC_MATH_NSP::pow(coval, a.value())});
1039
1040 return ret;
1041}
1042ADOLC_API inline adouble pow(const adouble &a, const adouble &b) {
1043 assert((a.value() >= 0) && "\nADOL-C message: negative basis deactivated\n ");
1044 assert(a.value() != 0 && "\nADOL-C message: zero basis deactivated\n ");
1045
1046 adouble a1, a2, ret;
1047
1048 condassign(a1, -b, adouble{ADOLC_MATH_NSP::pow(a.value(), b.value())},
1049 pow(a, b.value()));
1050 condassign(a2, fabs(a), pow(a, b.value()), a1);
1051 condassign(ret, a, exp(b * log(a)), a2);
1052 return ret;
1053}
1054
1055/*---------------------------------------------------------------*/
1056/* atan(x, y) */
1057ADOLC_API inline adouble atan2(const adouble &a, const adouble &b) {
1058 adouble a1, a2, ret, sy;
1059 const double pihalf = ADOLC_MATH_NSP::asin(1.0);
1060 condassign(sy, a, adouble{1.0}, adouble{-1.0});
1061 condassign(a1, b, atan(a / b), atan(a / b) + sy * 2 * pihalf);
1062 condassign(a2, fabs(a), sy * pihalf - atan(b / a), adouble{0.0});
1063 condassign(ret, fabs(b) - fabs(a), a1, a2);
1064 return ret;
1065}
1066
1067/*---------------------------------------------------------------*/
1068/* Advector functions */
1069// copies src to dest; both should be of size "size"
1070void ADOLC_API adolc_vec_copy(adouble *const dest, const adouble *const src,
1071 size_t size);
1072
1073// computes canonical scalarproduct, src and dest must have size "size"
1074void ADOLC_API adolc_vec_dot(adouble *const dest, const adouble *const src,
1075 size_t size);
1076
1077// res = a*vec_a + vec_b, vec_a and vec_b must have same size "size"
1078void ADOLC_API adolc_vec_axpy(adouble *const res, const adouble &a,
1079 const adouble *const vec_a,
1080 const adouble *const vec_b, size_t size);
1081
1086/*--------------------------------------------------------------------------*/
1087/* Arithmetic assignments */
1089 return *this += adouble(p);
1090}
1092 return *this -= adouble(p);
1093}
1095 return *this *= adouble(p);
1096}
1098 return *this /= adouble(p);
1099}
1100
1101/*--------------------------------------------------------------------------*/
1102/* sign operators */
1103ADOLC_API inline adouble operator-(const pdouble &p) { return -adouble(p); }
1104ADOLC_API inline adouble operator+(const pdouble &p) { return adouble(p); };
1105
1106/*--------------------------------------------------------------------------*/
1107/* Binary Operations */
1108ADOLC_API inline adouble operator+(const pdouble &p, const adouble &a) {
1109 return a + adouble(p);
1110};
1111ADOLC_API inline adouble operator+(const adouble &a, const pdouble &p) {
1112 return a + adouble(p);
1113};
1114ADOLC_API inline adouble operator+(const pdouble &p, const double coval) {
1115 return coval + adouble(p);
1116}
1117ADOLC_API inline adouble operator+(const double coval, const pdouble &p) {
1118 return coval + adouble(p);
1119}
1120/*--------------------------------------------------------------------------*/
1121ADOLC_API inline adouble operator-(const adouble &a, const pdouble &p) {
1122 return a - adouble(p);
1123}
1124ADOLC_API inline adouble operator-(const pdouble &p, const adouble &a) {
1125 return (-a) + adouble(p);
1126}
1127ADOLC_API inline adouble operator-(const pdouble &p, const double coval) {
1128 return adouble(p) - coval;
1129}
1130ADOLC_API inline adouble operator-(const double coval, const pdouble &p) {
1131 return coval - adouble(p);
1132}
1133/*--------------------------------------------------------------------------*/
1134ADOLC_API inline adouble operator*(const adouble &a, const pdouble &p) {
1135 return a * adouble(p);
1136}
1137ADOLC_API inline adouble operator*(const pdouble &p, const adouble &a) {
1138 return a * adouble(p);
1139}
1140ADOLC_API inline adouble operator*(const pdouble &p, const double coval) {
1141 return coval * adouble(p);
1142}
1143ADOLC_API inline adouble operator*(const double coval, const pdouble &p) {
1144 return coval * adouble(p);
1145}
1146/*--------------------------------------------------------------------------*/
1147ADOLC_API inline adouble operator/(const pdouble &p, const adouble &a) {
1148 return adouble(p) / a;
1149}
1150ADOLC_API inline adouble operator/(const adouble &a, const pdouble &p) {
1151 return a / adouble(p);
1152}
1153ADOLC_API inline adouble operator/(const pdouble &p, const double coval) {
1154 return adouble(p) / coval;
1155}
1156ADOLC_API inline adouble operator/(const double coval, const pdouble &p) {
1157 return coval / adouble(p);
1158}
1159
1160/*--------------------------------------------------------------------------*/
1161/* Comparions */
1162#ifdef ADOLC_ADVANCED_BRANCHING
1163ADOLC_API inline adouble operator!=(const adouble &a, const pdouble &p) {
1164 return a != adouble(p);
1165}
1166ADOLC_API inline adouble operator!=(const pdouble &p, const adouble &a) {
1167 return adouble(p) != a;
1168}
1169
1170ADOLC_API inline adouble operator==(const adouble &a, const pdouble &p) {
1171 return a == adouble(p);
1172}
1173ADOLC_API inline adouble operator==(const pdouble &p, const adouble &a) {
1174 return adouble(p) == a;
1175}
1176
1177ADOLC_API inline adouble operator<=(const adouble &a, const pdouble &p) {
1178 return a <= adouble(p);
1179}
1180ADOLC_API inline adouble operator<=(const pdouble &p, const adouble &a) {
1181 return adouble(p) <= a;
1182}
1183
1184ADOLC_API inline adouble operator>=(const adouble &a, const pdouble &p) {
1185 return a >= adouble(p);
1186}
1187ADOLC_API inline adouble operator>=(const pdouble &p, const adouble &a) {
1188 return adouble(p) >= a;
1189}
1190
1191ADOLC_API inline adouble operator>(const adouble &a, const pdouble &p) {
1192 return a > adouble(p);
1193}
1194ADOLC_API inline adouble operator>(const pdouble &p, const adouble &a) {
1195 return adouble(p) > a;
1196}
1197ADOLC_API inline adouble operator<(const adouble &a, const pdouble &p) {
1198 return a < adouble(p);
1199}
1200ADOLC_API inline adouble operator<(const pdouble &p, const adouble &a) {
1201 return adouble(p) < a;
1202}
1203#else // ADOLC_ADVANCED_BRANCHING
1204
1205ADOLC_API inline bool operator!=(const adouble &a, const pdouble &p) {
1206 return a != adouble(p);
1207}
1208ADOLC_API inline bool operator!=(const pdouble &p, const adouble &a) {
1209 return adouble(p) != a;
1210}
1211
1212ADOLC_API inline bool operator==(const adouble &a, const pdouble &p) {
1213 return a == adouble(p);
1214}
1215ADOLC_API inline bool operator==(const pdouble &p, const adouble &a) {
1216 return adouble(p) == a;
1217}
1218
1219ADOLC_API inline bool operator<=(const adouble &a, const pdouble &p) {
1220 return a <= adouble(p);
1221}
1222ADOLC_API inline bool operator<=(const pdouble &p, const adouble &a) {
1223 return adouble(p) <= a;
1224}
1225
1226ADOLC_API inline bool operator>=(const adouble &a, const pdouble &p) {
1227 return a >= adouble(p);
1228}
1229ADOLC_API inline bool operator>=(const pdouble &p, const adouble &a) {
1230 return adouble(p) >= a;
1231}
1232
1233ADOLC_API inline bool operator>(const adouble &a, const pdouble &p) {
1234 return a > adouble(p);
1235}
1236ADOLC_API inline bool operator>(const pdouble &p, const adouble &a) {
1237 return adouble(p) > a;
1238}
1239
1240ADOLC_API inline bool operator<(const adouble &a, const pdouble &p) {
1241 return a < adouble(p);
1242}
1243ADOLC_API inline bool operator<(const pdouble &p, const adouble &a) {
1244 return adouble(p) < a;
1245}
1246
1247#endif // ADOLC_ADVANCED_BRANCHING
1248
1255ADOLC_API inline bool isnormal(const pdouble &p) {
1256 return std::isnormal(p.value());
1257}
1258
1265ADOLC_API inline bool isnan(const pdouble &p) { return std::isnan(p.value()); }
1266
1273ADOLC_API inline bool isinf(const pdouble &p) { return std::isinf(p.value()); }
1274
1281ADOLC_API inline bool isfinite(const pdouble &p) {
1282 return std::isfinite(p.value());
1283}
1284
1285/*--------------------------------------------------------------------------*/
1286/* unary operators */
1287ADOLC_API inline adouble exp(const pdouble &p) { return exp(adouble(p)); }
1288ADOLC_API inline adouble log(const pdouble &p) { return log(adouble(p)); }
1289ADOLC_API inline adouble log10(const pdouble &p) { return log10(adouble(p)); }
1290ADOLC_API inline adouble sqrt(const pdouble &p) { return sqrt(adouble(p)); }
1291ADOLC_API inline adouble cbrt(const pdouble &p) { return cbrt(adouble(p)); }
1292ADOLC_API inline adouble sin(const pdouble &p) { return sin(adouble(p)); }
1293ADOLC_API inline adouble cos(const pdouble &p) { return cos(adouble(p)); }
1294ADOLC_API inline adouble tan(const pdouble &p) { return tan(adouble(p)); }
1295ADOLC_API inline adouble asin(const pdouble &p) { return asin(adouble(p)); }
1296ADOLC_API inline adouble acos(const pdouble &p) { return acos(adouble(p)); }
1297ADOLC_API inline adouble atan(const pdouble &p) { return atan(adouble(p)); }
1298ADOLC_API inline adouble sinh(const pdouble &p) { return sinh(adouble(p)); }
1299ADOLC_API inline adouble cosh(const pdouble &p) { return cosh(adouble(p)); }
1300ADOLC_API inline adouble tanh(const pdouble &p) { return tanh(adouble(p)); }
1301ADOLC_API inline adouble asinh(const pdouble &p) { return asinh(adouble(p)); }
1302ADOLC_API inline adouble acosh(const pdouble &p) { return acosh(adouble(p)); }
1303ADOLC_API inline adouble atanh(const pdouble &p) { return atanh(adouble(p)); }
1304ADOLC_API inline adouble erf(const pdouble &p) { return erf(adouble(p)); }
1305ADOLC_API inline adouble erfc(const pdouble &p) { return erfc(adouble(p)); }
1306ADOLC_API inline adouble fabs(const pdouble &p) { return fabs(adouble(p)); }
1307ADOLC_API inline adouble abs(const pdouble &p) { return fabs(adouble(p)); }
1308ADOLC_API inline adouble ceil(const pdouble &p) { return ceil(adouble(p)); }
1309ADOLC_API inline adouble floor(const pdouble &p) { return floor(adouble(p)); }
1310
1311/*--------------------------------------------------------------------------*/
1312/* Min and Max */
1313ADOLC_API inline adouble fmin(const adouble &a, const pdouble &p) {
1314 return fmin(a, adouble(p));
1315}
1316ADOLC_API inline adouble fmin(const pdouble &p, const adouble &a) {
1317 return fmin(adouble(p), a);
1318}
1319ADOLC_API inline adouble fmin(const pdouble &p, const pdouble &q) {
1320 return fmin(adouble(p), adouble(q));
1321}
1322ADOLC_API inline adouble fmin(const double coval, const pdouble &p) {
1323 return fmin(coval, adouble(p));
1324}
1325ADOLC_API inline adouble fmin(const pdouble &p, const double coval) {
1326 return fmin(adouble(p), coval);
1327}
1328
1329ADOLC_API inline adouble min(const adouble &a, const pdouble &p) {
1330 return fmin(a, p);
1331}
1332ADOLC_API inline adouble min(const pdouble &p, const adouble &a) {
1333 return fmin(p, a);
1334}
1335ADOLC_API inline adouble min(const pdouble &p, const pdouble &q) {
1336 return fmin(p, q);
1337}
1338ADOLC_API inline adouble min(const double coval, const pdouble &p) {
1339 return fmin(coval, p);
1340}
1341ADOLC_API inline adouble min(const pdouble &p, const double coval) {
1342 return fmin(p, coval);
1343}
1344
1345/*--------------------------------------------------------------------------*/
1346ADOLC_API inline adouble fmax(const adouble &a, const pdouble &p) {
1347 return fmax(a, adouble(p));
1348}
1349ADOLC_API inline adouble fmax(const pdouble &p, const adouble &a) {
1350 return fmax(adouble(p), a);
1351}
1352ADOLC_API inline adouble fmax(const pdouble &p, const pdouble &q) {
1353 return fmax(adouble(p), adouble(q));
1354}
1355ADOLC_API inline adouble fmax(const double coval, const pdouble &p) {
1356 return fmax(coval, adouble(p));
1357}
1358ADOLC_API inline adouble fmax(const pdouble &p, const double coval) {
1359 return fmax(adouble(p), coval);
1360}
1361
1362ADOLC_API inline adouble max(const adouble &a, const pdouble &p) {
1363 return fmax(a, p);
1364}
1365ADOLC_API inline adouble max(const pdouble &p, const adouble &a) {
1366 return fmax(p, a);
1367}
1368ADOLC_API inline adouble max(const pdouble &p, const pdouble &q) {
1369 return fmax(p, q);
1370}
1371ADOLC_API inline adouble max(const double coval, const pdouble &p) {
1372 return fmax(coval, p);
1373}
1374ADOLC_API inline adouble max(const pdouble &p, const double coval) {
1375 return fmax(p, coval);
1376}
1377
1378/*--------------------------------------------------------------------------*/
1379/* ldexp and frexp */
1380ADOLC_API inline adouble ldexp(const pdouble &p, const int exp) {
1381 return ldexp(adouble(p), exp);
1382}
1383ADOLC_API inline adouble frexp(const pdouble &p, int *exp) {
1384 return frexp(adouble(p), exp);
1385}
1386/*--------------------------------------------------------------------------*/
1387/* power function */
1388ADOLC_API inline adouble pow(const adouble &a, const pdouble &p) {
1389 return pow(a, adouble(p));
1390}
1391ADOLC_API inline adouble pow(const pdouble &p, const adouble &a) {
1392 return pow(adouble(p), a);
1393}
1394ADOLC_API inline adouble pow(const pdouble &p, const double coval) {
1395 return pow(adouble(p), coval);
1396}
1397
1398/*--------------------------------------------------------------------------*/
1399/* atan(x, y) */
1400ADOLC_API inline adouble atan2(const pdouble &p, const adouble &a) {
1401 return atan2(adouble(p), a);
1402}
1403ADOLC_API inline adouble atan2(const adouble &a, const pdouble &p) {
1404 return atan2(a, adouble(p));
1405}
1406
1407//-----------------------------------------------------------
1408/* User defined version of logarithm to test extend_quad macro */
1409ADOLC_API double myquad(double x);
1410
1417template <> struct ADOLC_API std::numeric_limits<adouble> {
1418 static constexpr bool is_specialized = true;
1419
1420 static constexpr double min() noexcept {
1421 return std::numeric_limits<double>::min();
1422 }
1423
1424 static constexpr double max() noexcept {
1425 return std::numeric_limits<double>::max();
1426 }
1427
1428 static constexpr double lowest() noexcept {
1429 return std::numeric_limits<double>::lowest();
1430 }
1431
1432 static constexpr int digits = std::numeric_limits<double>::digits;
1433 static constexpr int digits10 = std::numeric_limits<double>::digits10;
1434 static constexpr int max_digits10 = std::numeric_limits<double>::max_digits10;
1435 static constexpr bool is_signed = std::numeric_limits<double>::is_signed;
1436 static constexpr bool is_integer = std::numeric_limits<double>::is_integer;
1437 static constexpr bool is_exact = std::numeric_limits<double>::is_exact;
1438 static constexpr int radix = std::numeric_limits<double>::radix;
1439
1440 static constexpr double epsilon() noexcept {
1441 return std::numeric_limits<double>::epsilon();
1442 }
1443
1444 static constexpr double round_error() noexcept {
1445 return std::numeric_limits<double>::round_error();
1446 }
1447
1448 static constexpr int min_exponent = std::numeric_limits<double>::min_exponent;
1449 static constexpr int min_exponent10 =
1450 std::numeric_limits<double>::min_exponent10;
1451 static constexpr int max_exponent = std::numeric_limits<double>::max_exponent;
1452 static constexpr int max_exponent10 =
1453 std::numeric_limits<double>::max_exponent10;
1454
1455 static constexpr bool has_infinity =
1456 std::numeric_limits<double>::has_infinity;
1457 static constexpr bool has_quiet_NaN =
1458 std::numeric_limits<double>::has_quiet_NaN;
1459 static constexpr bool has_signaling_NaN =
1460 std::numeric_limits<double>::has_signaling_NaN;
1461 static constexpr float_denorm_style has_denorm =
1462 std::numeric_limits<double>::has_denorm;
1463 static constexpr bool has_denorm_loss =
1464 std::numeric_limits<double>::has_denorm_loss;
1465
1466 static constexpr double infinity() noexcept {
1467 return std::numeric_limits<double>::infinity();
1468 }
1469
1470 static constexpr double quiet_NaN() noexcept {
1471 return std::numeric_limits<double>::quiet_NaN();
1472 }
1473
1474 static constexpr double signaling_NaN() noexcept {
1475 return std::numeric_limits<double>::signaling_NaN();
1476 }
1477
1478 static constexpr double denorm_min() noexcept {
1479 return std::numeric_limits<double>::denorm_min();
1480 }
1481
1482 static constexpr bool is_iec559 = std::numeric_limits<double>::is_iec559;
1483 static constexpr bool is_bounded = std::numeric_limits<double>::is_bounded;
1484 static constexpr bool is_modulo = std::numeric_limits<double>::is_modulo;
1485
1486 static constexpr bool traps = std::numeric_limits<double>::traps;
1487 static constexpr bool tinyness_before =
1488 std::numeric_limits<double>::tinyness_before;
1489 static constexpr float_round_style round_style =
1490 std::numeric_limits<double>::round_style;
1491};
1492
1493#endif // ADOLC_AD_TYPES_H
#define CURRENT_LOCATION
Definition adolcerror.h:26
#define ADOLC_API
Definition adolcexport.h:16
void ADOLC_API adolc_vec_dot(adouble *const dest, const adouble *const src, size_t size)
ADOLC_API bool isfinite(const adouble &a)
This is an overload of std::isfinite for adoubles and not traced on the tape. The value of the adoubl...
Definition adtb_types.h:752
ADOLC_API adouble fmax(const adouble &a, const adouble &b)
Definition adtb_types.h:922
ADOLC_API bool isnormal(const adouble &a)
This is an overload of std::isnormal for adoubles and not traced on the tape. The value of the adoubl...
Definition adtb_types.h:726
ADOLC_API adouble abs(const adouble &a)
Definition adtb_types.h:870
ADOLC_API void operator>>=(std::span< adouble > deps, std::span< double > outputs)
Stores a contiguous sequence of adouble values into passive storage and marks them as dependent varia...
Definition adtb_types.h:538
ADOLC_API adouble max(const adouble &a, const adouble &b)
Definition adtb_types.h:947
ADOLC_API adouble asinh(const adouble &a)
ADOLC_API adouble atan(const adouble &a)
ADOLC_API bool operator>=(const double coval, const adouble &a)
ADOLC_API void condeqassign(adouble &res, const adouble &cond, const adouble &arg1, const adouble &arg2)
ADOLC_API adouble log10(const adouble &a)
Definition adtb_types.h:764
ADOLC_API adouble fabs(const adouble &a)
ADOLC_API adouble operator+(const adouble &a)
ADOLC_API adouble fmin(const adouble &a, const adouble &b)
ADOLC_API adouble pow(const adouble &a, const double exp)
ADOLC_API std::ostream & operator<<(std::ostream &, const adouble &)
ADOLC_API adouble frexp(const adouble &a, int *exp)
Definition adtb_types.h:986
ADOLC_API adouble sqrt(const adouble &a)
ADOLC_API void condassign(adouble &res, const adouble &cond, const adouble &arg1, const adouble &arg2)
ADOLC_API void operator<<=(std::span< adouble > indeps, std::span< const double > inputs)
Assigns passive values to a contiguous sequence of adoubles and marks them as independent variables.
Definition adtb_types.h:518
ADOLC_API adouble operator*(const adouble &a, const adouble &b)
ADOLC_API adouble sin(const adouble &a)
ADOLC_API adouble erfc(const adouble &a)
ADOLC_API adouble tan(const adouble &a)
Definition adtb_types.h:783
ADOLC_API adouble erf(const adouble &a)
ADOLC_API adouble tanh(const adouble &a)
Definition adtb_types.h:826
ADOLC_API std::istream & operator>>(std::istream &, const adouble &)
ADOLC_API adouble exp(const adouble &a)
ADOLC_API adouble atan2(const adouble &a, const adouble &b)
Definition adtb_types.h:1057
ADOLC_API adouble cbrt(const adouble &a)
ADOLC_API adouble ldexp(const adouble &a, const int exp)
Definition adtb_types.h:977
ADOLC_API bool isnan(const adouble &a)
This is an overload of std::isnan for adoubles and not traced on the tape. The value of the adouble o...
Definition adtb_types.h:736
ADOLC_API adouble asin(const adouble &a)
void ADOLC_API adolc_vec_copy(adouble *const dest, const adouble *const src, size_t size)
ADOLC_API bool operator<(const double coval, const adouble &a)
void ADOLC_API adolc_vec_axpy(adouble *const res, const adouble &a, const adouble *const vec_a, const adouble *const vec_b, size_t size)
ADOLC_API adouble atanh(const adouble &a)
ADOLC_API adouble cosh(const adouble &a)
Definition adtb_types.h:816
ADOLC_API adouble floor(const adouble &a)
ADOLC_API adouble operator-(const adouble &a)
ADOLC_API adouble operator/(const adouble &a, const adouble &b)
ADOLC_API bool operator>(const double coval, const adouble &a)
ADOLC_API bool operator==(const double coval, const adouble &a)
ADOLC_API adouble ceil(const adouble &a)
ADOLC_API adouble sinh(const adouble &a)
Definition adtb_types.h:796
ADOLC_API bool operator!=(const adouble &a, const double coval)
ADOLC_API adouble min(const adouble &a, const adouble &b)
Definition adtb_types.h:895
ADOLC_API adouble acosh(const adouble &a)
ADOLC_API adouble acos(const adouble &a)
ADOLC_API double myquad(double x)
ADOLC_API adouble log(const adouble &a)
ADOLC_API adouble cos(const adouble &a)
ADOLC_API bool isinf(const adouble &a)
This is an overload of std::isinf for adoubles and not traced on the tape. The value of the adouble o...
Definition adtb_types.h:744
ADOLC_API bool operator<=(const double coval, const adouble &a)
size_t p_next_loc()
Definition valuetape.h:522
double get_ad_value(size_t loc) const
Definition valuetape.h:534
void set_ad_value(size_t loc, double coval)
Definition valuetape.h:535
void set_pd_value(size_t loc, double coval)
Definition valuetape.h:540
size_t next_loc()
Definition valuetape.h:520
void free_loc(size_t loc) const
Definition valuetape.h:525
double get_pd_value(size_t loc) const
Definition valuetape.h:539
Taped active scalar for reusable forward and reverse differentiation.
Definition adtb_types.h:211
adouble & operator-=(const adouble &a)
adouble & operator=(const adouble &a)
Copy an active value and record the assignment while tracing.
void declareIndependent()
Declares the adouble as an independent variable on the tape.
size_t loc() const
Retrieves the location of the adouble on the tape.
Definition adtb_types.h:332
double value() const
Retrieves the current value stored at the tape location.
Definition adtb_types.h:323
adouble & operator=(const double coval)
Assign a passive value and record the assignment while tracing.
static adouble borrow_location(size_t loc)
Constructs an adouble borrowing an existing tape location.
Definition adtb_types.h:261
void declareDependent()
Declares the adouble as a dependent variable on the tape.
adouble & operator=(adouble &&other) noexcept
Move assignment.
Definition adtb_types.h:301
adouble & operator+=(const adouble &a)
adouble & operator=(const pdouble &p)
Registers the assignment of the pdouble to the adouble.
adouble(adouble &&other) noexcept
Move constructor.
Definition adtb_types.h:253
adouble & operator*=(const adouble &a)
adouble & operator-=(const double coval)
adouble & operator--()
adouble operator--(int)
adouble operator++(int)
adouble & operator-=(adouble &&a)
adouble & operator++()
adouble & operator>>=(double &out)
Stores the value of adouble in the provided reference and marks the adouble as a dependent variable.
adouble()
Allocate an active-value location on the current tape.
void value(const double coval)
Updates the value stored at the tape location.
Definition adtb_types.h:342
adouble & operator*=(const double coval)
adouble & operator+=(const double coval)
bool is_valid() const
Definition adtb_types.h:273
adouble & operator<<=(const double input)
Registers the assignment of the input value to the adouble and marks the adouble as an independent va...
~adouble()=default
Default destructor.
adouble & operator+=(adouble &&a)
adouble(double coval)
Allocate a location on the current tape and initialize its value.
adouble & operator/=(const double coval)
Definition adtb_types.h:638
size_t release_loc()
Releases ownership of this adouble's location.
Definition adtb_types.h:272
adouble(const adouble &a)
Copy constructor.
Mutable passive parameter stored on a recorded tape.
Definition adtb_types.h:431
pdouble & operator=(pdouble &&other) noexcept
Move assignment.
Definition adtb_types.h:463
pdouble(const double pval)
Allocate a parameter location on the current tape and set its value.
pdouble()=delete
Deleted default constructor.
void value(const double pval)
Updates the value stored at the tape location.
Definition adtb_types.h:502
pdouble & operator=(const pdouble &)=delete
size_t loc() const
Retrieves the location on the tape of the pdouble.
Definition adtb_types.h:490
pdouble(pdouble &&other) noexcept
Move constructor.
Definition adtb_types.h:453
~pdouble()=default
Default destructor.
pdouble(const pdouble &)=delete
Deleted copy constructor and assignment.
double value() const
Retrieves the current value stored at the tape location.
Definition adtb_types.h:496
RAII type for a location in the current tape's value store.
Definition adtb_types.h:57
tape_location(size_t loc, ownership_mode mode=OWNING)
Constructs a tape location from an existing location.
Definition adtb_types.h:135
tape_location(tape_location &&other) noexcept
Transfer the location and its ownership state; invalidate the source.
Definition adtb_types.h:150
~tape_location()
Release an owned active-value location; leave borrowed locations alone.
Definition adtb_types.h:117
ownership_mode
Definition adtb_types.h:107
@ OWNING
Definition adtb_types.h:109
@ INVALID
Definition adtb_types.h:108
@ BORROWED
Definition adtb_types.h:110
tape_location()
Constructs a tape_location with the next available location on the tape.
Definition adtb_types.h:127
size_t loc() const
Retrieves the tape location.
Definition adtb_types.h:182
bool owns_location() const
Returns whether this location owns tape memory.
Definition adtb_types.h:187
tape_location & operator=(tape_location &&other) noexcept
Release the old owned location and transfer the source state.
Definition adtb_types.h:161
bool is_valid() const
Definition adtb_types.h:188
tape_location & operator=(const tape_location &)=delete
Deleted copy assignment operator.
tape_location(const tape_location &)=delete
Deleted copy constructor.
size_t release()
Return the location index and invalidate this token.
Definition adtb_types.h:195
Concept to check if a type is either adouble or pdouble.
Definition adtb_types.h:42
void ADOLC_API fail(ErrorType error, const source_location LocInfo, const FailInfo &failinfo=FailInfo())
Numeric limits for taped active scalars.
Definition adtb_types.h:1417
static constexpr double signaling_NaN() noexcept
Definition adtb_types.h:1474
static constexpr double min() noexcept
Definition adtb_types.h:1420
static constexpr double quiet_NaN() noexcept
Definition adtb_types.h:1470
static constexpr double denorm_min() noexcept
Definition adtb_types.h:1478
static constexpr double epsilon() noexcept
Definition adtb_types.h:1440
static constexpr double lowest() noexcept
Definition adtb_types.h:1428
static constexpr double max() noexcept
Definition adtb_types.h:1424
static constexpr double infinity() noexcept
Definition adtb_types.h:1466
static constexpr double round_error() noexcept
Definition adtb_types.h:1444
ValueTape & currentTape()
Returns a reference to the current ValueTape.
Definition taperegistry.h:113
ADOLC_API ValueTape *& currentTapePtr()
Returns a thread-local reference to the pointer to the current ValueTape.
Definition taperegistry.h:99