646 <<
"Taylor buffer size: " << counts[13] <<
'\n'
647 <<
"Number of eq_*_prod for sparsity pattern: " << counts[14] <<
'\n'
648 <<
"Use of 'min_op', deferred to 'abs_op' for piecewise calculations: "
649 << counts[15] <<
'\n'
650 <<
"Number of 'abs' calls that can switch branch: " << counts[16]
652 <<
"Number of parameters (doubles) interchangeable without retaping: "
653 << counts[17] <<
'\n'
658 template <
typename ADNumberType>
662 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
666 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
669 const std::vector<scalar_type> &independent_variables)
const
671 Assert(is_registered_tape(active_tape_index),
672 ExcMessage(
"This tape has not yet been recorded."));
674 scalar_type value = 0.0;
676 status[active_tape_index] =
677 ::function(active_tape_index,
679 independent_variables.size(),
680 const_cast<double *
>(independent_variables.data()),
687 template <
typename ADNumberType>
691 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
694 const std::vector<scalar_type> &independent_variables,
702 Assert(gradient.size() == independent_variables.size(),
704 independent_variables.size()));
705 Assert(is_registered_tape(active_tape_index),
706 ExcMessage(
"This tape has not yet been recorded."));
711 status[active_tape_index] =
712 ::gradient(active_tape_index,
713 independent_variables.size(),
714 const_cast<scalar_type *
>(independent_variables.data()),
719 template <
typename ADNumberType>
721 TapedDrivers<ADNumberType,
723 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
726 const std::vector<scalar_type> &independent_variables,
734 Assert(hessian.m() == independent_variables.size(),
736 Assert(hessian.n() == independent_variables.size(),
738 Assert(is_registered_tape(active_tape_index),
739 ExcMessage(
"This tape has not yet been recorded."));
741 const unsigned int n_independent_variables = independent_variables.size();
742 std::vector<scalar_type *> H(n_independent_variables);
743 for (
unsigned int i = 0; i < n_independent_variables; ++i)
744 H[i] = &hessian[i][0];
746 status[active_tape_index] =
747 ::hessian(active_tape_index,
748 n_independent_variables,
749 const_cast<scalar_type *
>(independent_variables.data()),
755 for (
unsigned int i = 0; i < n_independent_variables; ++i)
756 for (
unsigned int j = 0; j < i; ++j)
757 hessian[j][i] = hessian[i][j];
761 template <
typename ADNumberType>
763 TapedDrivers<ADNumberType,
765 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
768 const unsigned int n_dependent_variables,
769 const std::vector<scalar_type> &independent_variables,
772 Assert(values.size() == n_dependent_variables,
774 Assert(is_registered_tape(active_tape_index),
775 ExcMessage(
"This tape has not yet been recorded."));
780 status[active_tape_index] =
781 ::function(active_tape_index,
782 n_dependent_variables,
783 independent_variables.size(),
784 const_cast<scalar_type *
>(independent_variables.data()),
789 template <
typename ADNumberType>
791 TapedDrivers<ADNumberType,
793 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
796 const unsigned int n_dependent_variables,
797 const std::vector<scalar_type> &independent_variables,
800 Assert(AD::ADNumberTraits<ADNumberType>::n_supported_derivative_levels >=
803 AD::ADNumberTraits<ADNumberType>::n_supported_derivative_levels,
805 Assert(jacobian.
m() == n_dependent_variables,
807 Assert(jacobian.
n() == independent_variables.size(),
809 Assert(is_registered_tape(active_tape_index),
810 ExcMessage(
"This tape has not yet been recorded."));
812 std::vector<scalar_type *>
J(n_dependent_variables);
813 for (
unsigned int i = 0; i < n_dependent_variables; ++i)
814 J[i] = &jacobian[i][0];
816 status[active_tape_index] = ::jacobian(active_tape_index,
817 n_dependent_variables,
818 independent_variables.size(),
819 independent_variables.data(),
827 template <
typename ADNumberType>
829 TapedDrivers<ADNumberType,
831 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
840 template <
typename ADNumberType>
845 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
853 template <
typename ADNumberType>
855 TapedDrivers<ADNumberType,
857 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
859 keep_independent_values()
const
866 template <
typename ADNumberType>
868 TapedDrivers<ADNumberType,
870 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
879 template <
typename ADNumberType>
881 TapedDrivers<ADNumberType,
883 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
885 set_tape_buffer_sizes(
895 template <
typename ADNumberType>
897 TapedDrivers<ADNumberType,
899 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
907 template <
typename ADNumberType>
909 TapedDrivers<ADNumberType,
911 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
919 template <
typename ADNumberType>
920 std::vector<typename Types<ADNumberType>::tape_index>
921 TapedDrivers<ADNumberType,
923 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
925 get_registered_tape_indices()
const
928 return std::vector<typename Types<ADNumberType>::tape_index>();
932 template <
typename ADNumberType>
934 TapedDrivers<ADNumberType,
936 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
944 template <
typename ADNumberType>
946 TapedDrivers<ADNumberType,
948 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
957 template <
typename ADNumberType>
959 TapedDrivers<ADNumberType,
961 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
963 last_action_requires_retaping()
const
970 template <
typename ADNumberType>
972 TapedDrivers<ADNumberType,
974 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
982 template <
typename ADNumberType>
984 TapedDrivers<ADNumberType,
986 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
993 template <
typename ADNumberType>
995 TapedDrivers<ADNumberType,
997 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1005 template <
typename ADNumberType>
1007 TapedDrivers<ADNumberType,
1009 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1012 std::ostream &)
const
1018 template <
typename ADNumberType>
1019 typename TapedDrivers<
1022 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1024 TapedDrivers<ADNumberType,
1026 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1029 const std::vector<scalar_type> &)
const
1036 template <
typename ADNumberType>
1038 TapedDrivers<ADNumberType,
1040 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1043 const std::vector<scalar_type> &,
1050 template <
typename ADNumberType>
1052 TapedDrivers<ADNumberType,
1054 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1057 const std::vector<scalar_type> &,
1064 template <
typename ADNumberType>
1066 TapedDrivers<ADNumberType,
1068 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1072 const std::vector<scalar_type> &,
1079 template <
typename ADNumberType>
1081 TapedDrivers<ADNumberType,
1083 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1087 const std::vector<scalar_type> &,
1099 template <
typename ADNumberType>
1101 TapedDrivers<ADNumberType,
1103 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1109 return taped_driver.is_recording();
1113 template <
typename ADNumberType>
1118 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1123 return taped_driver.active_tape_index();
1127 template <
typename ADNumberType>
1129 TapedDrivers<ADNumberType,
1131 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1133 keep_independent_values()
const
1135 return taped_driver.keep_independent_values();
1139 template <
typename ADNumberType>
1141 TapedDrivers<ADNumberType,
1143 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1150 return taped_driver.is_registered_tape(tape_index);
1154 template <
typename ADNumberType>
1156 TapedDrivers<ADNumberType,
1158 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1160 set_tape_buffer_sizes(
1168 taped_driver.set_tape_buffer_sizes(obufsize,
1175 template <
typename ADNumberType>
1177 TapedDrivers<ADNumberType,
1179 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1182 const bool keep_independent_values)
1186 taped_driver.start_taping(tape_index, keep_independent_values);
1190 template <
typename ADNumberType>
1192 TapedDrivers<ADNumberType,
1194 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1198 const bool write_tapes_to_file)
1202 taped_driver.stop_taping(active_tape_index, write_tapes_to_file);
1206 template <
typename ADNumberType>
1207 std::vector<typename Types<ADNumberType>::tape_index>
1208 TapedDrivers<ADNumberType,
1210 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1212 get_registered_tape_indices()
const
1214 return taped_driver.get_registered_tape_indices();
1218 template <
typename ADNumberType>
1220 TapedDrivers<ADNumberType,
1222 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1226 taped_driver.activate_tape(tape_index);
1230 template <
typename ADNumberType>
1232 TapedDrivers<ADNumberType,
1234 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1239 return taped_driver.requires_retaping(tape_index);
1243 template <
typename ADNumberType>
1245 TapedDrivers<ADNumberType,
1247 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1249 last_action_requires_retaping()
const
1251 return taped_driver.last_action_requires_retaping();
1255 template <
typename ADNumberType>
1257 TapedDrivers<ADNumberType,
1259 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1263 taped_driver.remove_tape(tape_index);
1267 template <
typename ADNumberType>
1269 TapedDrivers<ADNumberType,
1271 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1273 reset(
const bool clear_registered_tapes)
1275 taped_driver.reset(clear_registered_tapes);
1279 template <
typename ADNumberType>
1281 TapedDrivers<ADNumberType,
1283 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1288 taped_driver.print(stream);
1292 template <
typename ADNumberType>
1294 TapedDrivers<ADNumberType,
1296 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1300 std::ostream &stream)
const
1304 taped_driver.print_tape_stats(tape_index, stream);
1308 template <
typename ADNumberType>
1309 typename TapedDrivers<
1312 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1314 TapedDrivers<ADNumberType,
1316 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1319 const std::vector<scalar_type> &independent_variables)
const
1323 return taped_driver.value(active_tape_index,
1324 vector_float_to_double(independent_variables));
1328 template <
typename ADNumberType>
1330 TapedDrivers<ADNumberType,
1332 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1335 const std::vector<scalar_type> &independent_variables,
1341 taped_driver.gradient(active_tape_index,
1342 vector_float_to_double(independent_variables),
1348 template <
typename ADNumberType>
1350 TapedDrivers<ADNumberType,
1352 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1355 const std::vector<scalar_type> &independent_variables,
1361 taped_driver.hessian(active_tape_index,
1362 vector_float_to_double(independent_variables),
1368 template <
typename ADNumberType>
1370 TapedDrivers<ADNumberType,
1372 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1375 const unsigned int n_dependent_variables,
1376 const std::vector<scalar_type> &independent_variables,
1382 taped_driver.values(active_tape_index,
1383 n_dependent_variables,
1384 vector_float_to_double(independent_variables),
1390 template <
typename ADNumberType>
1392 TapedDrivers<ADNumberType,
1394 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1397 const unsigned int n_dependent_variables,
1398 const std::vector<scalar_type> &independent_variables,
1404 taped_driver.jacobian(active_tape_index,
1405 n_dependent_variables,
1406 vector_float_to_double(independent_variables),
1408 jacobian = jacobian_double;
1413 template <
typename ADNumberType>
1415 TapedDrivers<ADNumberType,
1417 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1419 vector_float_to_double(
const std::vector<float> &in)
const
1421 std::vector<double> out(in.size());
1422 std::copy(in.begin(), in.end(), out.begin());
1431 template <
typename ADNumberType,
typename ScalarType,
typename T>
1439 template <
typename ADNumberType,
typename ScalarType,
typename T>
1447 template <
typename ADNumberType,
typename ScalarType,
typename T>
1455 template <
typename ADNumberType,
typename ScalarType,
typename T>
1465 template <
typename ADNumberType,
typename ScalarType,
typename T>
1468 const std::vector<ADNumberType> &)
const
1471 return ScalarType(0.0);
1475 template <
typename ADNumberType,
typename ScalarType,
typename T>
1478 const std::vector<ADNumberType> &,
1479 const std::vector<ADNumberType> &,
1486 template <
typename ADNumberType,
typename ScalarType,
typename T>
1489 const std::vector<ADNumberType> &,
1490 const std::vector<ADNumberType> &,
1497 template <
typename ADNumberType,
typename ScalarType,
typename T>
1500 const std::vector<ADNumberType> &,
1507 template <
typename ADNumberType,
typename ScalarType,
typename T>
1510 const std::vector<ADNumberType> &,
1511 const std::vector<ADNumberType> &,
1524 template <
typename ADNumberType>
1532# ifdef DEAL_II_TRILINOS_WITH_SACADO
1543 template <
typename ADNumberType>
1548 ADNumberType &dependent_variable)
1558 ADNumberType::Outvar_Gradcomp(dependent_variable);
1568 template <
typename ADNumberType>
1575# ifdef DEAL_II_WITH_ADOLC
1585 template <
typename ADNumberType>
1586 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1590# ifdef DEAL_II_ADOLC_WITH_TAPELESS_REFCOUNTING
1605 const std::size_t n_live_variables = adtl::refcounter::getNumLiveVar();
1606 if (n_live_variables == 0)
1608 adtl::setNumDir(n_directional_derivatives);
1617 const std::size_t n_set_directional_derivatives = adtl::getNumDir();
1618 if (n_directional_derivatives > n_set_directional_derivatives)
1620 n_live_variables == 0,
1622 "There are currently " + std::to_string(n_live_variables) +
1624 "adtl::adouble variables in existence. They currently "
1626 std::to_string(n_set_directional_derivatives) +
1627 " directional derivatives "
1628 "but you wish to increase this to " +
1629 std::to_string(n_directional_derivatives) +
1631 "To safely change (or more specifically in this case, "
1632 "increase) the number of directional derivatives, there "
1633 "must be no tapeless doubles in local/global scope."));
1639 adtl::setNumDir(n_directional_derivatives);
1645 template <
typename ADNumberType>
1646 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1664 template <
typename ADNumberType,
typename ScalarType>
1668 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1670 ADNumberTraits<ADNumberType>::type_code ==
1672 : dependent_variable_marking_safe(false)
1677 template <
typename ADNumberType,
typename ScalarType>
1679 TapelessDrivers<ADNumberType,
1681 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1683 ADNumberTraits<ADNumberType>::type_code ==
1685 initialize_global_environment(
const unsigned int n_independent_variables)
1687 internal::configure_tapeless_mode<ADNumberType>(n_independent_variables);
1691 template <
typename ADNumberType,
typename ScalarType>
1698 ADNumberTraits<ADNumberType>::type_code ==
1701 dependent_variable_marking_safe =
true;
1705 template <
typename ADNumberType,
typename ScalarType>
1712 ADNumberTraits<ADNumberType>::type_code ==
1715 dependent_variable_marking_safe =
false;
1719 template <
typename ADNumberType,
typename ScalarType>
1721 TapelessDrivers<ADNumberType,
1723 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1725 ADNumberTraits<ADNumberType>::type_code ==
1727 is_dependent_variable_marking_allowed()
const
1729 return dependent_variable_marking_safe;
1733 template <
typename ADNumberType,
typename ScalarType>
1735 TapelessDrivers<ADNumberType,
1737 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1739 ADNumberTraits<ADNumberType>::type_code ==
1741 value(
const std::vector<ADNumberType> &dependent_variables)
const
1743 Assert(dependent_variables.size() == 1,
1745 return ADNumberTraits<ADNumberType>::get_scalar_value(
1746 dependent_variables[0]);
1750 template <
typename ADNumberType,
typename ScalarType>
1752 TapelessDrivers<ADNumberType,
1754 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1756 ADNumberTraits<ADNumberType>::type_code ==
1758 gradient(
const std::vector<ADNumberType> &independent_variables,
1759 const std::vector<ADNumberType> &dependent_variables,
1762 Assert(AD::ADNumberTraits<ADNumberType>::n_supported_derivative_levels >=
1765 AD::ADNumberTraits<ADNumberType>::n_supported_derivative_levels,
1767 Assert(dependent_variables.size() == 1,
1771 independent_variables.size()));
1776 const_cast<ADNumberType &
>(dependent_variables[0]));
1777 const std::size_t n_independent_variables = independent_variables.size();
1778 for (
unsigned int i = 0; i < n_independent_variables; ++i)
1780 ADNumberTraits<ADNumberType>::get_directional_derivative(
1781 independent_variables[i], 0 ));
1785 template <
typename ADNumberType,
typename ScalarType>
1787 TapelessDrivers<ADNumberType,
1789 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1791 ADNumberTraits<ADNumberType>::type_code ==
1793 hessian(
const std::vector<ADNumberType> &independent_variables,
1794 const std::vector<ADNumberType> &dependent_variables,
1797 Assert(AD::ADNumberTraits<ADNumberType>::n_supported_derivative_levels >=
1800 AD::ADNumberTraits<ADNumberType>::n_supported_derivative_levels,
1802 Assert(dependent_variables.size() == 1,
1812 const_cast<ADNumberType &
>(dependent_variables[0]));
1813 const std::size_t n_independent_variables = independent_variables.size();
1814 for (
unsigned int i = 0; i < n_independent_variables; ++i)
1816 using derivative_type =
1817 typename ADNumberTraits<ADNumberType>::derivative_type;
1818 const derivative_type gradient_i =
1819 ADNumberTraits<ADNumberType>::get_directional_derivative(
1820 independent_variables[i], i);
1822 for (
unsigned int j = 0; j <= i; ++j)
1827 const ScalarType hessian_ij =
1829 ADNumberTraits<derivative_type>::get_directional_derivative(
1839 template <
typename ADNumberType,
typename ScalarType>
1841 TapelessDrivers<ADNumberType,
1843 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1845 ADNumberTraits<ADNumberType>::type_code ==
1847 values(
const std::vector<ADNumberType> &dependent_variables,
1853 const std::size_t n_dependent_variables = dependent_variables.size();
1854 for (
unsigned int i = 0; i < n_dependent_variables; ++i)
1855 values[i] = ADNumberTraits<ADNumberType>::get_scalar_value(
1856 dependent_variables[i]);
1860 template <
typename ADNumberType,
typename ScalarType>
1862 TapelessDrivers<ADNumberType,
1864 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1866 ADNumberTraits<ADNumberType>::type_code ==
1868 jacobian(
const std::vector<ADNumberType> &independent_variables,
1869 const std::vector<ADNumberType> &dependent_variables,
1872 Assert(AD::ADNumberTraits<ADNumberType>::n_supported_derivative_levels >=
1875 AD::ADNumberTraits<ADNumberType>::n_supported_derivative_levels,
1877 Assert(jacobian.
m() == dependent_variables.size(),
1879 Assert(jacobian.
n() == independent_variables.size(),
1882 const std::size_t n_independent_variables = independent_variables.size();
1883 const std::size_t n_dependent_variables = dependent_variables.size();
1894 using accumulation_type =
1895 typename ADNumberTraits<ADNumberType>::derivative_type;
1896 std::vector<accumulation_type> rad_accumulation(
1897 n_independent_variables,
1900 for (
unsigned int i = 0; i < n_dependent_variables; ++i)
1903 const_cast<ADNumberType &
>(dependent_variables[i]));
1904 for (
unsigned int j = 0; j < n_independent_variables; ++j)
1906 const accumulation_type df_i_dx_j =
1907 ADNumberTraits<ADNumberType>::get_directional_derivative(
1908 independent_variables[j],
1910 rad_accumulation[j];
1913 rad_accumulation[j] += df_i_dx_j;
1925 template <
typename ADNumberType,
typename ScalarType>
1929 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1931 ADNumberTraits<ADNumberType>::type_code ==
1933 ADNumberTraits<ADNumberType>::type_code ==
1935 : dependent_variable_marking_safe(false)
1940 template <
typename ADNumberType,
typename ScalarType>
1942 TapelessDrivers<ADNumberType,
1944 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1946 ADNumberTraits<ADNumberType>::type_code ==
1948 ADNumberTraits<ADNumberType>::type_code ==
1950 initialize_global_environment(
const unsigned int n_independent_variables)
1952 internal::configure_tapeless_mode<ADNumberType>(n_independent_variables);
1956 template <
typename ADNumberType,
typename ScalarType>
1962 ADNumberTraits<ADNumberType>::type_code ==
1965 ADNumberTraits<ADNumberType>::type_code ==
1968 dependent_variable_marking_safe =
true;
1972 template <
typename ADNumberType,
typename ScalarType>
1978 ADNumberTraits<ADNumberType>::type_code ==
1981 ADNumberTraits<ADNumberType>::type_code ==
1984 dependent_variable_marking_safe =
false;
1988 template <
typename ADNumberType,
typename ScalarType>
1990 TapelessDrivers<ADNumberType,
1992 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1994 ADNumberTraits<ADNumberType>::type_code ==
1996 ADNumberTraits<ADNumberType>::type_code ==
1998 is_dependent_variable_marking_allowed()
const
2000 return dependent_variable_marking_safe;
2004 template <
typename ADNumberType,
typename ScalarType>
2006 TapelessDrivers<ADNumberType,
2008 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
2010 ADNumberTraits<ADNumberType>::type_code ==
2012 ADNumberTraits<ADNumberType>::type_code ==
2014 value(
const std::vector<ADNumberType> &dependent_variables)
const
2016 Assert(dependent_variables.size() == 1,
2018 return ADNumberTraits<ADNumberType>::get_scalar_value(
2019 dependent_variables[0]);
2023 template <
typename ADNumberType,
typename ScalarType>
2025 TapelessDrivers<ADNumberType,
2027 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
2029 ADNumberTraits<ADNumberType>::type_code ==
2031 ADNumberTraits<ADNumberType>::type_code ==
2033 gradient(
const std::vector<ADNumberType> &independent_variables,
2034 const std::vector<ADNumberType> &dependent_variables,
2037 Assert(AD::ADNumberTraits<ADNumberType>::n_supported_derivative_levels >=
2040 AD::ADNumberTraits<ADNumberType>::n_supported_derivative_levels,
2042 Assert(dependent_variables.size() == 1,
2046 independent_variables.size()));
2050 const std::size_t n_independent_variables = independent_variables.size();
2051 for (
unsigned int i = 0; i < n_independent_variables; ++i)
2053 ADNumberTraits<ADNumberType>::get_directional_derivative(
2054 dependent_variables[0], i));
2058 template <
typename ADNumberType,
typename ScalarType>
2060 TapelessDrivers<ADNumberType,
2062 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
2064 ADNumberTraits<ADNumberType>::type_code ==
2066 ADNumberTraits<ADNumberType>::type_code ==
2068 hessian(
const std::vector<ADNumberType> &independent_variables,
2069 const std::vector<ADNumberType> &dependent_variables,
2072 Assert(AD::ADNumberTraits<ADNumberType>::n_supported_derivative_levels >=
2075 AD::ADNumberTraits<ADNumberType>::n_supported_derivative_levels,
2077 Assert(dependent_variables.size() == 1,
2086 const std::size_t n_independent_variables = independent_variables.size();
2087 for (
unsigned int i = 0; i < n_independent_variables; ++i)
2089 using derivative_type =
2090 typename ADNumberTraits<ADNumberType>::derivative_type;
2091 const derivative_type gradient_i =
2092 ADNumberTraits<ADNumberType>::get_directional_derivative(
2093 dependent_variables[0], i);
2095 for (
unsigned int j = 0; j <= i; ++j)
2100 const ScalarType hessian_ij =
2102 ADNumberTraits<derivative_type>::get_directional_derivative(
2112 template <
typename ADNumberType,
typename ScalarType>
2114 TapelessDrivers<ADNumberType,
2116 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
2118 ADNumberTraits<ADNumberType>::type_code ==
2120 ADNumberTraits<ADNumberType>::type_code ==
2122 values(
const std::vector<ADNumberType> &dependent_variables,
2128 const std::size_t n_dependent_variables = dependent_variables.size();
2129 for (
unsigned int i = 0; i < n_dependent_variables; ++i)
2130 values[i] = ADNumberTraits<ADNumberType>::get_scalar_value(
2131 dependent_variables[i]);
2135 template <
typename ADNumberType,
typename ScalarType>
2137 TapelessDrivers<ADNumberType,
2139 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
2141 ADNumberTraits<ADNumberType>::type_code ==
2143 ADNumberTraits<ADNumberType>::type_code ==
2145 jacobian(
const std::vector<ADNumberType> &independent_variables,
2146 const std::vector<ADNumberType> &dependent_variables,
2149 Assert(AD::ADNumberTraits<ADNumberType>::n_supported_derivative_levels >=
2152 AD::ADNumberTraits<ADNumberType>::n_supported_derivative_levels,
2154 Assert(jacobian.
m() == dependent_variables.size(),
2156 Assert(jacobian.
n() == independent_variables.size(),
2159 const std::size_t n_independent_variables = independent_variables.size();
2160 const std::size_t n_dependent_variables = dependent_variables.size();
2164 for (
unsigned int i = 0; i < n_dependent_variables; ++i)
2165 for (
unsigned int j = 0; j < n_independent_variables; ++j)
2167 ADNumberTraits<ADNumberType>::get_directional_derivative(
2168 dependent_variables[i], j));
2182# include "differentiation/ad/ad_drivers.inst"
2183# ifdef DEAL_II_WITH_ADOLC
2184# include "differentiation/ad/ad_drivers.inst1"
2186# ifdef DEAL_II_TRILINOS_WITH_SACADO
2187# include "differentiation/ad/ad_drivers.inst2"