| 220 | } |
| 221 | |
| 222 | void LoopGrad::AssignorGradOpr::init_assignee_info( |
| 223 | const VarNodeArray& assignees, SymbolVar loss) { |
| 224 | mgb_assert(!m_assignee_grads_init && m_assignee_grads.empty()); |
| 225 | m_assignee_grads.reserve(assignees.size()); |
| 226 | for (auto i : assignees) { |
| 227 | auto grad = cg::grad(loss, i, false, false).node(); |
| 228 | if (grad) { |
| 229 | m_assignee_grads.push_back(grad); |
| 230 | } |
| 231 | } |
| 232 | m_assignee_grads_init = true; |
| 233 | m_assignee_grads_buf_init = true; |
| 234 | m_assignee_grads_empty = m_assignee_grads.empty(); |
| 235 | } |
| 236 | |
| 237 | void LoopGrad::AssignorGradOpr::scn_do_execute() { |
| 238 | if (should_fwd()) { |