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>
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>
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>
793 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
796 const unsigned int n_dependent_variables,
797 const std::vector<scalar_type> &independent_variables,
798 FullMatrix<scalar_type> &jacobian)
const
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>
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>
857 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
859 keep_independent_values()
const
866 template <
typename ADNumberType>
870 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
879 template <
typename ADNumberType>
883 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
885 set_tape_buffer_sizes(
895 template <
typename ADNumberType>
899 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
907 template <
typename ADNumberType>
911 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
919 template <
typename ADNumberType>
920 std::vector<typename Types<ADNumberType>::tape_index>
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>
936 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
944 template <
typename ADNumberType>
948 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
957 template <
typename ADNumberType>
961 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
963 last_action_requires_retaping()
const
970 template <
typename ADNumberType>
974 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
982 template <
typename ADNumberType>
986 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
993 template <
typename ADNumberType>
997 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1005 template <
typename ADNumberType>
1009 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1012 std::ostream &)
const
1018 template <
typename ADNumberType>
1022 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1026 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1029 const std::vector<scalar_type> &)
const
1036 template <
typename ADNumberType>
1040 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1043 const std::vector<scalar_type> &,
1044 Vector<scalar_type> &)
const
1050 template <
typename ADNumberType>
1054 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1057 const std::vector<scalar_type> &,
1058 FullMatrix<scalar_type> &)
const
1064 template <
typename ADNumberType>
1068 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1072 const std::vector<scalar_type> &,
1073 Vector<scalar_type> &)
const
1079 template <
typename ADNumberType>
1083 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1087 const std::vector<scalar_type> &,
1088 FullMatrix<scalar_type> &)
const
1099 template <
typename 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>
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>
1143 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1150 return taped_driver.is_registered_tape(tape_index);
1154 template <
typename 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>
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>
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>
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>
1222 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1226 taped_driver.activate_tape(tape_index);
1230 template <
typename ADNumberType>
1234 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1239 return taped_driver.requires_retaping(tape_index);
1243 template <
typename 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>
1259 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1263 taped_driver.remove_tape(tape_index);
1267 template <
typename 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>
1283 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1288 taped_driver.print(stream);
1292 template <
typename 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>
1312 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
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>
1332 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1335 const std::vector<scalar_type> &independent_variables,
1336 Vector<scalar_type> &gradient)
const
1338 Vector<double> gradient_double(
gradient.size());
1341 taped_driver.gradient(active_tape_index,
1342 vector_float_to_double(independent_variables),
1348 template <
typename ADNumberType>
1352 std::enable_if_t<ADNumberTraits<ADNumberType>::type_code ==
1355 const std::vector<scalar_type> &independent_variables,
1356 FullMatrix<scalar_type> &hessian)
const
1361 taped_driver.hessian(active_tape_index,
1362 vector_float_to_double(independent_variables),
1368 template <
typename 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,
1377 Vector<scalar_type> &values)
const
1379 Vector<double> values_double(
values.size());
1382 taped_driver.values(active_tape_index,
1383 n_dependent_variables,
1384 vector_float_to_double(independent_variables),
1390 template <
typename 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,
1399 FullMatrix<scalar_type> &jacobian)
const
1401 FullMatrix<double> jacobian_double(jacobian.
m(), jacobian.
n());
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>
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> &,