get_partial_lno_decode_poles_val Subroutine

pure subroutine get_partial_lno_decode_poles_val(this, upstream_grad, output)

dL/dmu_m per sample: output[m,s] = sum_i upstream[i,s](-tau_i)exp(-mu_mtau_i)x[m,s]

Arguments

Type IntentOptional Attributes Name
class(array_type), intent(in) :: this
real(kind=real32), intent(in), dimension(:,:) :: upstream_grad
real(kind=real32), intent(out), dimension(:,:) :: output

Source Code

  pure subroutine get_partial_lno_decode_poles_val( &
       this, upstream_grad, output)
    !! dL/dmu_m per sample:
    !!   output[m,s] = sum_i upstream[i,s]*(-tau_i)*exp(-mu_m*tau_i)*x[m,s]
    implicit none
    class(array_type), intent(in) :: this
    real(real32), dimension(:,:), intent(in)  :: upstream_grad
    real(real32), dimension(:,:), intent(out) :: output

    integer :: n_out, num_modes, mode_index, i, s, num_samples
    real(real32) :: t, mu_m, accum

    n_out = this%indices(1)
    num_modes = this%indices(2)
    num_samples = size(upstream_grad, 2)

    output = 0.0_real32
    do s = 1, num_samples
       do mode_index = 1, num_modes
          mu_m = this%right_operand%val(mode_index, 1)
          accum = 0.0_real32
          do i = 1, n_out
             if(n_out .gt. 1)then
                t = real(i-1, real32) / real(n_out-1, real32)
             else
                t = 0.0_real32
             end if
             accum = accum + upstream_grad(i, s) * (-t) * exp(-mu_m * t)
          end do
          output(mode_index, s) = accum * this%left_operand%val(mode_index, s)
       end do
    end do

  end subroutine get_partial_lno_decode_poles_val