pure subroutine get_partial_multiply_right_val(this, upstream_grad, output)
implicit none
class(array_type), intent(in) :: this
real(real32), dimension(:,:), intent(in) :: upstream_grad
real(real32), dimension(:,:), intent(out) :: output
integer :: i, s
if(this%left_operand%is_scalar)then
output = upstream_grad * this%left_operand%val(1,1)
elseif(.not.this%left_operand%is_sample_dependent)then
do concurrent( s = 1 : size(output,2), i = 1 : size(output,1) )
output(i,s) = upstream_grad(i,s) * this%left_operand%val(i,1)
end do
elseif(.not.this%right_operand%is_sample_dependent)then
do concurrent( s = 1 : size(output,2), i = 1 : size(output,1) )
output(i,s) = upstream_grad(i,s) * this%left_operand%val(i,1)
end do
elseif(size(upstream_grad,2).ne.size(output,2))then
do concurrent( s = 1 : size(output,2), i = 1 : size(output,1) )
output(i,s) = upstream_grad(i,s) * this%left_operand%val(i,1)
end do
else
output = upstream_grad * this%left_operand%val
end if
end subroutine get_partial_multiply_right_val