pure subroutine get_partial_divide_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
do concurrent( s = 1 : size(output,2), i = 1 : size(output,1) )
output(i,s) = (-upstream_grad(i,s) * this%left_operand%val(1,1)) / &
(this%right_operand%val(i,1) * this%right_operand%val(i,1))
end do
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)) / &
(this%right_operand%val(i,1) * this%right_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,s)) / &
(this%right_operand%val(i,1) * this%right_operand%val(i,1))
end do
else
do concurrent( s = 1 : size(output,2), i = 1 : size(output,1) )
output(i,s) = (-upstream_grad(i,s) * this%left_operand%val(i,s)) / &
(this%right_operand%val(i,s) * this%right_operand%val(i,s))
end do
end if
end subroutine get_partial_divide_right_val