93 if(dxda == 0.0) {
return; }
97 std::vector<dep_sd_ptr> zero_contributions{};
99 for(
const auto& [dep, deriv] : deps) {
100 if(m_x_.m_deps_.count(dep)) {
101 m_x_.m_deps_[dep] += dxda * deriv;
102 if(m_x_.m_deps_[dep] == 0.0) {
103 zero_contributions.emplace_back(dep);
107 m_x_.m_deps_.emplace(dep, dxda * deriv);
117 if(n_updated > (m_x_.m_deps_.size() / 2)) {
119 for(
const auto& dep : zero_contributions) {
120 m_x_.m_deps_.erase(dep);
125 for(
const auto& [dep, deriv] : m_x_.m_deps_) {
126 m_x_.m_sd_ += std::pow(*dep.get() * deriv, 2.0);
130 m_x_.m_sd_ = std::pow(m_x_.m_sd_, 2.0);
134 for(
const auto& [dep, deriv] : deps) {
135 auto old_deriv = m_x_.m_deps_[dep] - dxda * deriv;
138 if(m_x_.m_deps_[dep] != 0.0) {
139 m_x_.m_sd_ += std::pow(*dep.get() * m_x_.m_deps_[dep], 2.0);
143 if(old_deriv != 0.0) {
144 m_x_.m_sd_ -= std::pow(*dep.get() * old_deriv, 2.0);
149 for(
const auto& dep : zero_contributions) {
150 m_x_.m_deps_.erase(dep);
154 m_x_.m_sd_ = std::sqrt(m_x_.m_sd_);