本文整理汇总了C++中var::dual_numbers方法的典型用法代码示例。如果您正苦于以下问题:C++ var::dual_numbers方法的具体用法?C++ var::dual_numbers怎么用?C++ var::dual_numbers使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类var
的用法示例。
在下文中一共展示了var::dual_numbers方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: nomad_output_value_error
inline var<AutodiffOrder, StrictSmoothness, ValidateIO>
operator/(const var<AutodiffOrder, StrictSmoothness, ValidateIO>& v1,
const var<AutodiffOrder, StrictSmoothness, ValidateIO>& v2) {
if (ValidateIO) {
validate_input(v1.first_val(), "operator/");
validate_input(v2.first_val(), "operator/");
}
const short partials_order = 3;
const unsigned int n_inputs = 2;
create_node<binary_var_node<AutodiffOrder, partials_order>>(n_inputs);
double x = v1.first_val();
double y_inv = 1.0 / v2.first_val();
double val = x * y_inv;
try {
push_dual_numbers<AutodiffOrder, ValidateIO>(val);
} catch (nomad_error) {
throw nomad_output_value_error("operator/");
}
push_inputs(v1.dual_numbers());
push_inputs(v2.dual_numbers());
double y_inv_n = y_inv * y_inv;
if (AutodiffOrder >= 1) {
push_partials<ValidateIO>(y_inv);
push_partials<ValidateIO>(- val * y_inv);
}
if (AutodiffOrder >= 2) {
push_partials<ValidateIO>(0);
push_partials<ValidateIO>(-y_inv_n);
push_partials<ValidateIO>(2 * val * y_inv_n);
}
if (AutodiffOrder >= 3) {
y_inv_n *= y_inv;
push_partials<ValidateIO>(0);
push_partials<ValidateIO>(0);
push_partials<ValidateIO>(2 * y_inv_n);
push_partials<ValidateIO>(-6 * val * y_inv_n);
}
return var<AutodiffOrder, StrictSmoothness, ValidateIO>(next_node_idx_ - 1);
}
示例2: nomad_output_value_error
inline var<AutodiffOrder, StrictSmoothness, ValidateIO>
binary_prod_cubes(const var<AutodiffOrder, StrictSmoothness, ValidateIO>& v1,
const var<AutodiffOrder, StrictSmoothness, ValidateIO>& v2) {
if (ValidateIO) {
validate_input(v1.first_val(), "binary_prod_cubes");
validate_input(v2.first_val(), "binary_prod_cubes");
}
const short partials_order = 3;
const unsigned int n_inputs = 2;
create_node<binary_var_node<AutodiffOrder, partials_order>>(n_inputs);
double x = v1.first_val();
double y = v2.first_val();
try {
push_dual_numbers<AutodiffOrder, ValidateIO>(binary_prod_cubes(x, y));
} catch (nomad_error) {
throw nomad_output_value_error("binary_prod_cubes");
}
push_inputs(v1.dual_numbers());
push_inputs(v2.dual_numbers());
try {
if (AutodiffOrder >= 1) {
push_partials<ValidateIO>(3 * x * x * y * y * y);
push_partials<ValidateIO>(3 * x * x * x * y * y);
}
if (AutodiffOrder >= 2) {
push_partials<ValidateIO>(6 * x * y * y * y);
push_partials<ValidateIO>(9 * x * x * y * y);
push_partials<ValidateIO>(6 * x * x * x * y);
}
if (AutodiffOrder >= 3) {
push_partials<ValidateIO>(6 * y * y * y);
push_partials<ValidateIO>(18 * x * y * y);
push_partials<ValidateIO>(18 * x * x * y);
push_partials<ValidateIO>(6 * x * x * x);
}
} catch (nomad_error) {
throw nomad_output_partial_error("binary_prod_cubes");
}
return var<AutodiffOrder, StrictSmoothness, ValidateIO>(next_node_idx_ - 1);
}
示例3: nomad_output_value_error
inline var<AutodiffOrder, StrictSmoothness, ValidateIO>
lgamma(const var<AutodiffOrder, StrictSmoothness, ValidateIO>& input) {
if (ValidateIO) validate_input(input.first_val(), "lgamma");
const short partials_order = 3;
const unsigned int n_inputs = 1;
create_node<unary_var_node<AutodiffOrder, partials_order>>(n_inputs);
double val = input.first_val();
try {
push_dual_numbers<AutodiffOrder, ValidateIO>(lgamma(val));
} catch (nomad_error) {
throw nomad_output_value_error("lgamma");
}
push_inputs(input.dual_numbers());
try {
if (AutodiffOrder >= 1) push_partials<ValidateIO>(digamma(val));
if (AutodiffOrder >= 2) push_partials<ValidateIO>(trigamma(val));
if (AutodiffOrder >= 3) push_partials<ValidateIO>(quadrigamma(val));
} catch (nomad_error) {
throw nomad_output_partial_error("lgamma");
}
return var<AutodiffOrder, StrictSmoothness, ValidateIO>(next_node_idx_ - 1);
}
示例4: nomad_output_value_error
inline var<AutodiffOrder, StrictSmoothness, ValidateIO>
inv_logit(const var<AutodiffOrder, StrictSmoothness, ValidateIO>& input) {
if (ValidateIO) validate_input(input.first_val(), "inv_logit");
const short partials_order = 3;
const unsigned int n_inputs = 1;
create_node<unary_var_node<AutodiffOrder, partials_order>>(n_inputs);
double s = inv_logit(input.first_val());
try {
push_dual_numbers<AutodiffOrder, ValidateIO>(s);
} catch (nomad_error) {
throw nomad_output_value_error("inv_logit");
}
push_inputs(input.dual_numbers());
double ds = s * (1 - s);
try {
if (AutodiffOrder >= 1) push_partials<ValidateIO>(ds);
if (AutodiffOrder >= 2) push_partials<ValidateIO>(ds * (1 - 2 * s) );
if (AutodiffOrder >= 3) push_partials<ValidateIO>(ds * (1 - 6 * s * (1 - s)) );
} catch (nomad_error) {
throw nomad_output_partial_error("inv_logit");
}
return var<AutodiffOrder, StrictSmoothness, ValidateIO>(next_node_idx_ - 1);
}
示例5: nomad_output_value_error
inline var<AutodiffOrder, StrictSmoothness, ValidateIO>
operator++(const var<AutodiffOrder, StrictSmoothness, ValidateIO>& v1, int /* dummy */) {
if (ValidateIO) validate_input(v1.first_val(), "operator++");
create_node<unary_plus_var_node<AutodiffOrder>>(1);
try {
push_dual_numbers<AutodiffOrder, ValidateIO>(v1.first_val() + 1.0);
} catch (nomad_error) {
throw nomad_output_value_error("operator++");
}
push_inputs(v1.dual_numbers());
return var<AutodiffOrder, StrictSmoothness, ValidateIO>(next_node_idx_ - 1);
}
示例6: nomad_output_value_error
inline var<AutodiffOrder, StrictSmoothness, ValidateIO>
log2(const var<AutodiffOrder, StrictSmoothness, ValidateIO>& input) {
if (ValidateIO) {
double val = input.first_val();
validate_input(val, "log2");
validate_lower_bound(val, 0, "log2");
}
const short partials_order = 3;
const unsigned int n_inputs = 1;
create_node<unary_var_node<AutodiffOrder, partials_order>>(n_inputs);
double val = input.first_val();
try {
push_dual_numbers<AutodiffOrder, ValidateIO>(log2(val));
} catch (nomad_error) {
throw nomad_output_value_error("log2");
}
push_inputs(input.dual_numbers());
double val_inv = 1.0 / val;
try {
if (AutodiffOrder >= 1) push_partials<ValidateIO>(val = val_inv * 1.44269504088896);
if (AutodiffOrder >= 2) push_partials<ValidateIO>(val *= - val_inv);
if (AutodiffOrder >= 3) push_partials<ValidateIO>(val *= - 2.0 * val_inv);
} catch (nomad_error) {
throw nomad_output_partial_error("log2");
}
return var<AutodiffOrder, StrictSmoothness, ValidateIO>(next_node_idx_ - 1);
}
示例7: nomad_output_value_error
inline var<AutodiffOrder, StrictSmoothness, ValidateIO>
sqrt(const var<AutodiffOrder, StrictSmoothness, ValidateIO>& input) {
if (ValidateIO) {
double val = input.first_val();
validate_input(val, "sqrt");
validate_lower_bound(val, 0, "sqrt");
}
const short partials_order = 3;
const unsigned int n_inputs = 1;
create_node<unary_var_node<AutodiffOrder, partials_order>>(n_inputs);
double val = std::sqrt(input.first_val());
try {
push_dual_numbers<AutodiffOrder, ValidateIO>(val);
} catch (nomad_error) {
throw nomad_output_value_error("sqrt");
}
push_inputs(input.dual_numbers());
double d2 = 1.0 / input.first_val();
try {
if (AutodiffOrder >= 1) push_partials<ValidateIO>(val *= 0.5 * d2);
if (AutodiffOrder >= 2) push_partials<ValidateIO>(val *= - 0.5 * d2);
if (AutodiffOrder >= 3) push_partials<ValidateIO>(val *= - 1.5 * d2);
} catch (nomad_error) {
throw nomad_output_partial_error("sqrt");
}
return var<AutodiffOrder, StrictSmoothness, ValidateIO>(next_node_idx_ - 1);
}