void backward( ccube_p<real> const & g ) { guard gg(m); ZI_ASSERT(last_input); in_nodes->backward(in_num, convolve_sparse_inverse(*g, filter_.W(), filter_stride)); pending_ = manager.schedule_unprivileged(&filter_ds_edge::do_update, this, g); }
inline void convolve_sparse_inverse_add( cube<T> const & a, cube<T> const & b, vec3i const & s, cube<T> & r ) noexcept { if ( s == vec3i::one ) { convolve_inverse_add(a,b,r); return; } auto radd = convolve_sparse_inverse(a,b,s); r += *radd; }
void backward( ccube_p<real> const & g ) { ZI_ASSERT(last_input); if ( in_nodes->is_input() ) { in_nodes->backward(in_num, cube_p<real>()); } else { in_nodes->backward(in_num, convolve_sparse_inverse(*g, filter_.W(), filter_stride)); } pending_ = manager.schedule_unprivileged(&filter_edge::do_update, this, g); }
inline cube_p<T> convolve_sparse_inverse( ccube_p<T> const & a, ccube_p<T> const & b, vec3i const & s ) { return convolve_sparse_inverse(*a,*b,s); }