Commit 0b962a44 authored by Cianciosa, Mark's avatar Cianciosa, Mark
Browse files

Add pre item iterface.

parent b9df6d91
Loading
Loading
Loading
Loading
+101 −2
Original line number Diff line number Diff line
@@ -12,6 +12,10 @@

      IMPLICIT NONE

!>  A null array for empty
      INTEGER(C_INTPTR_T), DIMENSION(0) :: graph_null_array
!>  A

!-------------------------------------------------------------------------------
!>  @brief Class object for the binding.
!-------------------------------------------------------------------------------
@@ -69,6 +73,7 @@
                                      piecewise_2D_cdouble
         PROCEDURE :: get_max_concurrency => graph_context_get_max_concurrency
         PROCEDURE :: set_device_number => graph_context_set_device_number
         PROCEDURE :: add_pre_item => graph_context_add_pre_item
      END TYPE

!*******************************************************************************
@@ -802,10 +807,66 @@
         INTEGER(C_LONG), VALUE :: num
         END SUBROUTINE

!-------------------------------------------------------------------------------
!>  @brief Add pre workflow item.
!>
!>  @param[in] c             The graph C context.
!>  @param[in] inputs        Array of input nodes.
!>  @param[in] num_inputs    Number of inputs.
!>  @param[in] outputs       Array of output nodes.
!>  @param[in] num_outputs   Number of outputs.
!>  @param[in] map_inputs    Array of map input nodes.
!>  @param[in] map_outputs   Array of map output nodes.
!>  @param[in] num_maps      Number of maps.
!>  @param[in] random_state  Optional random state, can be NULL if not used.
!>  @param[in] name          Name for the kernel.
!>  @param[in] num_particles Number of elements to operate on.
!-------------------------------------------------------------------------------
         SUBROUTINE graph_add_pre_item(c, inputs, num_inputs,                  &
                                       outputs, num_outputs,                   &
                                       map_inputs, map_outputs, num_maps,      &
                                       random_state, name, num_particles)      &
         BIND(C, NAME='graph_add_pre_item')
         USE, INTRINSIC :: ISO_C_BINDING
         IMPLICIT NONE
         TYPE(C_PTR), VALUE                   :: c
         INTEGER(C_INTPTR_T), VALUE           :: inputs
         INTEGER(C_LONG), VALUE               :: num_inputs
         INTEGER(C_INTPTR_T), VALUE           :: outputs
         INTEGER(C_LONG), VALUE               :: num_outputs
         INTEGER(C_INTPTR_T), VALUE           :: map_inputs
         INTEGER(C_INTPTR_T), VALUE           :: map_outputs
         INTEGER(C_LONG), VALUE               :: num_maps
         TYPE(C_PTR), VALUE                   :: random_state
         CHARACTER(kind=C_CHAR), DIMENSION(*) :: name
         INTEGER(C_LONG), VALUE               :: num_particles
         END SUBROUTINE

      END INTERFACE

      CONTAINS

!*******************************************************************************
!  Utilities
!*******************************************************************************
!-------------------------------------------------------------------------------
!>  @brief Convert a node to the pointer value.
!>
!>  @return The pointer value.
!-------------------------------------------------------------------------------
      FUNCTION graph_ptr(node)

      IMPLICIT NONE

!  Declare Arguments
      INTEGER(C_INTPTR_T)     :: graph_ptr
      TYPE(C_PTR), INTENT(IN) :: node

!  Start of executable code.
      graph_ptr = TRANSFER(node, 0_C_INTPTR_T)

      END FUNCTION

!*******************************************************************************
!  CONSTRUCTION SUBROUTINES
!*******************************************************************************
@@ -1753,7 +1814,7 @@
!-------------------------------------------------------------------------------
!>  @brief Choose the device number.
!>
!>  @param[in,out] c   The graph C context.
!>  @param[in] this @ref graph_context instance.
!>  @param[in] num The device number.
!-------------------------------------------------------------------------------
      SUBROUTINE graph_context_set_device_number(this, num)
@@ -1769,4 +1830,42 @@

      END SUBROUTINE

!-------------------------------------------------------------------------------
!>  @brief Add pre workflow item.
!>
!>  @param[in,out] this          @ref graph_context instance.
!>  @param[in]     inputs        Array of input nodes.
!>  @param[in]     outputs       Array of output nodes.
!>  @param[in]     map_inputs    Array of map input nodes.
!>  @param[in]     map_outputs   Array of map output nodes.
!>  @param[in]     random_state  Optional random state, can be NULL if not used.
!>  @param[in]     name          Name for the kernel.
!>  @param[in]     num_particles Number of elements to operate on.
!-------------------------------------------------------------------------------
      SUBROUTINE graph_context_add_pre_item(this, inputs, outputs,             &
                                            map_inputs, map_outputs,           &
                                            random_state, name, num_particles)

      IMPLICIT NONE

!  Declare Arguments
      CLASS(graph_context), INTENT(INOUT)           :: this
      INTEGER(C_INTPTR_T), DIMENSION(:), INTENT(IN) :: inputs
      INTEGER(C_INTPTR_T), DIMENSION(:), INTENT(IN) :: outputs
      INTEGER(C_INTPTR_T), DIMENSION(:), INTENT(IN) :: map_inputs
      INTEGER(C_INTPTR_T), DIMENSION(:), INTENT(IN) :: map_outputs
      TYPE(C_PTR), INTENT(IN)                       :: random_state
      CHARACTER(kind=C_CHAR,len=*), INTENT(IN)      :: name
      INTEGER(C_LONG), INTENT(IN)                   :: num_particles

!  Start of executable.
      CALL graph_add_pre_item(this%c_context,                                  &
                              LOC(inputs), INT(SIZE(inputs), KIND=C_LONG),     &
                              LOC(outputs), INT(SIZE(outputs), KIND=C_LONG),   &
                              LOC(map_inputs), LOC(map_outputs),               &
                              INT(SIZE(map_inputs), KIND=C_LONG),              &
                              random_state, name, num_particles)

      END SUBROUTINE

      END MODULE
+98 −70
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@
      TYPE(C_PTR)                                    :: zero
      INTEGER(C_LONG)                                :: size
      TYPE(C_PTR)                                    :: rand
      TYPE(C_PTR)                                    :: state
      REAL(C_FLOAT), DIMENSION(3)                    :: buffer1D
      TYPE(C_PTR)                                    :: p1
      TYPE(C_PTR)                                    :: i
@@ -97,9 +98,9 @@
      CALL graph%set_variable(x, value)

      px = graph%pseudo_variable(x)
      CALL assert(TRANSFER(px, 0) .ne. TRANSFER(x, 0),                         &
      CALL assert(graph_ptr(px) .ne. graph_ptr(x),                             &
                  'Expected different nodes.')
      CALL assert(TRANSFER(graph%remove_pseudo(px), 0) .eq. TRANSFER(x, 0),    &
      CALL assert(graph_ptr(graph%remove_pseudo(px)) .eq. graph_ptr(x),        &
                  'Remove pseudo failed.')

      y = graph%add(graph%mul(m, x), b)
@@ -107,26 +108,27 @@
      one = graph%constant(1.0_C_DOUBLE)
      zero = graph%constant(0.0_C_DOUBLE)

      CALL assert(TRANSFER(graph%sub(one, one), 0) .eq. TRANSFER(zero, 0),     &
      CALL assert(graph_ptr(graph%sub(one, one)) .eq. graph_ptr(zero),         &
                  'Expected 1 - 1 = 0.')
      CALL assert(TRANSFER(graph%div(one, one), 0) .eq. TRANSFER(one, 0),      &
      CALL assert(graph_ptr(graph%div(one, one)) .eq. graph_ptr(one),          &
                  'Expected 1/1 = 1.')
      CALL assert(TRANSFER(graph%sqrt(one), 0) .eq. TRANSFER(one, 0),          &
      CALL assert(graph_ptr(graph%sqrt(one)) .eq. graph_ptr(one),              &
                  'Expected sqrt(1) = 1.')
      CALL assert(TRANSFER(graph%exp(zero), 0) .eq. TRANSFER(one, 0),          &
      CALL assert(graph_ptr(graph%exp(zero)) .eq. graph_ptr(one),              &
                  'Expected exp(0) = 1.')
      CALL assert(TRANSFER(graph%log(one), 0) .eq. TRANSFER(zero, 0),          &
      CALL assert(graph_ptr(graph%log(one)) .eq. graph_ptr(zero),              &
                  'Expected log(1) = 0.')
      CALL assert(TRANSFER(graph%pow(one, zero), 0) .eq. TRANSFER(one, 0),     &
      CALL assert(graph_ptr(graph%pow(one, zero)) .eq. graph_ptr(one),         &
                  'Expected pow(1,0) = 1.')
      CALL assert(TRANSFER(graph%sin(zero), 0) .eq. TRANSFER(zero, 0),         &
      CALL assert(graph_ptr(graph%sin(zero)) .eq. graph_ptr(zero),             &
                  'Expected sin(0) = 0.')
      CALL assert(TRANSFER(graph%cos(zero), 0) .eq. TRANSFER(one, 0),          &
      CALL assert(graph_ptr(graph%cos(zero)) .eq. graph_ptr(one),              &
                  'Expected cos(0) = 1.')
      CALL assert(TRANSFER(graph%atan(one, zero), 0) .eq. TRANSFER(zero, 0),   &
      CALL assert(graph_ptr(graph%atan(one, zero)) .eq. graph_ptr(zero),       &
                  'Expected atan(one, zero) = zero.')

      rand = graph%random(graph%random_state(0))
      state = graph%random_state(0)
      rand = graph%random(state)

      i = graph%variable(1_C_LONG, 'i' // C_NULL_CHAR)
      buffer1D = (/ 2.0, 4.0, 6.0 /)
@@ -140,6 +142,11 @@

      CALL graph%set_device_number(graph%get_max_concurrency() - 1)

      CALL graph%add_pre_item(graph_null_array, (/ graph_ptr(rand) /),         &
                              graph_null_array, graph_null_array, state,       &
                              'c_binding_pre_kernel' // C_NULL_CHAR,           &
                              1_C_LONG)

      DEALLOCATE(graph)

      END SUBROUTINE
@@ -172,6 +179,7 @@
      TYPE(C_PTR)                    :: zero
      INTEGER(C_LONG)                :: size
      TYPE(C_PTR)                    :: rand
      TYPE(C_PTR)                    :: state
      REAL(C_DOUBLE), DIMENSION(3)   :: buffer1D
      TYPE(C_PTR)                    :: p1
      TYPE(C_PTR)                    :: i
@@ -190,9 +198,9 @@
      CALL graph%set_variable(x, value)

      px = graph%pseudo_variable(x)
      CALL assert(TRANSFER(px, 0) .ne. TRANSFER(x, 0),                         &
      CALL assert(graph_ptr(px) .ne. graph_ptr(x),                             &
                  'Expected different nodes.')
      CALL assert(TRANSFER(graph%remove_pseudo(px), 0) .eq. TRANSFER(x, 0),    &
      CALL assert(graph_ptr(graph%remove_pseudo(px)) .eq. graph_ptr(x),        &
                  'Remove pseudo failed.')

      y = graph%add(graph%mul(m, x), b)
@@ -200,26 +208,27 @@
      one = graph%constant(1.0_C_DOUBLE)
      zero = graph%constant(0.0_C_DOUBLE)

      CALL assert(TRANSFER(graph%sub(one, one), 0) .eq. TRANSFER(zero, 0),     &
      CALL assert(graph_ptr(graph%sub(one, one)) .eq. graph_ptr(zero),         &
                  'Expected 1 - 1 = 0.')
      CALL assert(TRANSFER(graph%div(one, one), 0) .eq. TRANSFER(one, 0),      &
      CALL assert(graph_ptr(graph%div(one, one)) .eq. graph_ptr(one),          &
                  'Expected 1/1 = 1.')
      CALL assert(TRANSFER(graph%sqrt(one), 0) .eq. TRANSFER(one, 0),          &
      CALL assert(graph_ptr(graph%sqrt(one)) .eq. graph_ptr(one),              &
                  'Expected sqrt(1) = 1.')
      CALL assert(TRANSFER(graph%exp(zero), 0) .eq. TRANSFER(one, 0),          &
      CALL assert(graph_ptr(graph%exp(zero)) .eq. graph_ptr(one),              &
                  'Expected exp(0) = 1.')
      CALL assert(TRANSFER(graph%log(one), 0) .eq. TRANSFER(zero, 0),          &
      CALL assert(graph_ptr(graph%log(one)) .eq. graph_ptr(zero),              &
                  'Expected log(1) = 0.')
      CALL assert(TRANSFER(graph%pow(one, zero), 0) .eq. TRANSFER(one, 0),     &
      CALL assert(graph_ptr(graph%pow(one, zero)) .eq. graph_ptr(one),         &
                  'Expected pow(1, 0) = 1.')
      CALL assert(TRANSFER(graph%sin(zero), 0) .eq. TRANSFER(zero, 0),         &
      CALL assert(graph_ptr(graph%sin(zero)) .eq. graph_ptr(zero),             &
                  'Expected sin(0) = 0.')
      CALL assert(TRANSFER(graph%cos(zero), 0) .eq. TRANSFER(one, 0),          &
      CALL assert(graph_ptr(graph%cos(zero)) .eq. graph_ptr(one),              &
                  'Expected cos(0) = 1.')
      CALL assert(TRANSFER(graph%atan(one, zero), 0) .eq. TRANSFER(zero, 0),   &
      CALL assert(graph_ptr(graph%atan(one, zero)) .eq. graph_ptr(zero),       &
                  'Expected atan(one, zero) = zero.')

      rand = graph%random(graph%random_state(0))
      state = graph%random_state(0)
      rand = graph%random(state)

      i = graph%variable(1_C_LONG, 'i' // C_NULL_CHAR)
      buffer1D = (/ 2.0, 4.0, 6.0 /)
@@ -233,6 +242,11 @@

      CALL graph%set_device_number(graph%get_max_concurrency() - 1)

      CALL graph%add_pre_item(graph_null_array, (/ graph_ptr(rand) /),         &
                              graph_null_array, graph_null_array, state,       &
                              'c_binding_pre_kernel' // C_NULL_CHAR,           &
                              1_C_LONG)

      DEALLOCATE(graph)

      END SUBROUTINE
@@ -265,6 +279,7 @@
      TYPE(C_PTR)                              :: zero
      INTEGER(C_LONG)                          :: size
      TYPE(C_PTR)                              :: rand
      TYPE(C_PTR)                              :: state
      COMPLEX(C_FLOAT_COMPLEX), DIMENSION(3)   :: buffer1D
      TYPE(C_PTR)                              :: p1
      TYPE(C_PTR)                              :: i
@@ -283,9 +298,9 @@
      CALL graph%set_variable(x, value)

      px = graph%pseudo_variable(x)
      CALL assert(TRANSFER(px, 0) .ne. TRANSFER(x, 0),                         &
      CALL assert(graph_ptr(px) .ne. graph_ptr(x),                             &
                  'Expected different nodes.')
      CALL assert(TRANSFER(graph%remove_pseudo(px), 0) .eq. TRANSFER(x, 0),    &
      CALL assert(graph_ptr(graph%remove_pseudo(px)) .eq. graph_ptr(x),        &
                  'Remove pseudo failed.')

      y = graph%add(graph%mul(m, x), b)
@@ -293,28 +308,29 @@
      one = graph%constant(1.0_C_DOUBLE)
      zero = graph%constant(0.0_C_DOUBLE)

      CALL assert(TRANSFER(graph%sub(one, one), 0) .eq. TRANSFER(zero, 0),     &
      CALL assert(graph_ptr(graph%sub(one, one)) .eq. graph_ptr(zero),         &
                  'Expected 1 - 1 = 0.')
      CALL assert(TRANSFER(graph%div(one, one), 0) .eq. TRANSFER(one, 0),      &
      CALL assert(graph_ptr(graph%div(one, one)) .eq. graph_ptr(one),          &
                  'Expected 1/1 = 1.')
      CALL assert(TRANSFER(graph%sqrt(one), 0) .eq. TRANSFER(one, 0),          &
      CALL assert(graph_ptr(graph%sqrt(one)) .eq. graph_ptr(one),              &
                  'Expected sqrt(1) = 1.')
      CALL assert(TRANSFER(graph%exp(zero), 0) .eq. TRANSFER(one, 0),          &
      CALL assert(graph_ptr(graph%exp(zero)) .eq. graph_ptr(one),              &
                  'Expected exp(0) = 1.')
      CALL assert(TRANSFER(graph%log(one), 0) .eq. TRANSFER(zero, 0),          &
      CALL assert(graph_ptr(graph%log(one)) .eq. graph_ptr(zero),              &
                  'Expected log(1) = 0.')
      CALL assert(TRANSFER(graph%pow(one, zero), 0) .eq. TRANSFER(one, 0),     &
      CALL assert(graph_ptr(graph%pow(one, zero)) .eq. graph_ptr(one),         &
                  'Expected pow(1,0) = 1.')
      CALL assert(TRANSFER(graph%erfi(zero), 0) .eq. TRANSFER(zero, 0),        &
      CALL assert(graph_ptr(graph%erfi(zero)) .eq. graph_ptr(zero),            &
                  'Expected erfi(0) = 0.')
      CALL assert(TRANSFER(graph%sin(zero), 0) .eq. TRANSFER(zero, 0),         &
      CALL assert(graph_ptr(graph%sin(zero)) .eq. graph_ptr(zero),             &
                  'Expected sin(0) = 0.')
      CALL assert(TRANSFER(graph%cos(zero), 0) .eq. TRANSFER(one, 0),          &
      CALL assert(graph_ptr(graph%cos(zero)) .eq. graph_ptr(one),              &
                  'Expected cos(0) = 1.')
      CALL assert(TRANSFER(graph%atan(one, zero), 0) .eq. TRANSFER(zero, 0),   &
      CALL assert(graph_ptr(graph%atan(one, zero)) .eq. graph_ptr(zero),       &
                  'Expected atan(one, zero) = zero.')

      rand = graph%random(graph%random_state(0))
      state = graph%random_state(0)
      rand = graph%random(state)

      i = graph%variable(1_C_LONG, 'i' // C_NULL_CHAR)
      buffer1D = (/ CMPLX(2.0, 0.0), CMPLX(4.0, 0.0), CMPLX(6.0, 0.0) /)
@@ -330,6 +346,11 @@

      CALL graph%set_device_number(graph%get_max_concurrency() - 1)

      CALL graph%add_pre_item(graph_null_array, (/ graph_ptr(rand) /),         &
                              graph_null_array, graph_null_array, state,       &
                              'c_binding_pre_kernel' // C_NULL_CHAR,           &
                              1_C_LONG)

      DEALLOCATE(graph)

      END SUBROUTINE
@@ -362,6 +383,7 @@
      TYPE(C_PTR)                               :: zero
      INTEGER(C_LONG)                           :: size
      TYPE(C_PTR)                               :: rand
      TYPE(C_PTR)                               :: state
      COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(3)   :: buffer1D
      TYPE(C_PTR)                               :: p1
      TYPE(C_PTR)                               :: i
@@ -380,9 +402,9 @@
      CALL graph%set_variable(x, value)

      px = graph%pseudo_variable(x)
      CALL assert(TRANSFER(px, 0) .ne. TRANSFER(x, 0),                         &
      CALL assert(graph_ptr(px) .ne. graph_ptr(x),                             &
                  'Expected different nodes.')
      CALL assert(TRANSFER(graph%remove_pseudo(px), 0) .eq. TRANSFER(x, 0),    &
      CALL assert(graph_ptr(graph%remove_pseudo(px)) .eq. graph_ptr(x),        &
                  'Remove pseudo failed.')

      y = graph%add(graph%mul(m, x), b)
@@ -390,28 +412,29 @@
      one = graph%constant(1.0_C_DOUBLE)
      zero = graph%constant(0.0_C_DOUBLE)

      CALL assert(TRANSFER(graph%sub(one, one), 0) .eq. TRANSFER(zero, 0),     &
      CALL assert(graph_ptr(graph%sub(one, one)) .eq. graph_ptr(zero),         &
                  'Expected 1 - 1 = 0.')
      CALL assert(TRANSFER(graph%div(one, one), 0) .eq. TRANSFER(one, 0),      &
      CALL assert(graph_ptr(graph%div(one, one)) .eq. graph_ptr(one),          &
                  'Expected 1/1 = 1.')
      CALL assert(TRANSFER(graph%sqrt(one), 0) .eq. TRANSFER(one, 0),          &
      CALL assert(graph_ptr(graph%sqrt(one)) .eq. graph_ptr(one),              &
                  'Expected sqrt(1) = 1.')
      CALL assert(TRANSFER(graph%exp(zero), 0) .eq. TRANSFER(one, 0),          &
      CALL assert(graph_ptr(graph%exp(zero)) .eq. graph_ptr(one),              &
                  'Expected exp(0) = 1.')
      CALL assert(TRANSFER(graph%log(one), 0) .eq. TRANSFER(zero, 0),          &
      CALL assert(graph_ptr(graph%log(one)) .eq. graph_ptr(zero),              &
                  'Expected log(1) = 0.')
      CALL assert(TRANSFER(graph%pow(one, zero), 0) .eq. TRANSFER(one, 0),     &
      CALL assert(graph_ptr(graph%pow(one, zero)) .eq. graph_ptr(one),         &
                  'Expected pow(1,0) = 1.')
      CALL assert(TRANSFER(graph%erfi(zero), 0) .eq. TRANSFER(zero, 0),        &
      CALL assert(graph_ptr(graph%erfi(zero)) .eq. graph_ptr(zero),            &
                  'Expected erfi(0) = 0.')
      CALL assert(TRANSFER(graph%sin(zero), 0) .eq. TRANSFER(zero, 0),         &
      CALL assert(graph_ptr(graph%sin(zero)) .eq. graph_ptr(zero),             &
                  'Expected sin(0) = 0.')
      CALL assert(TRANSFER(graph%cos(zero), 0) .eq. TRANSFER(one, 0),          &
      CALL assert(graph_ptr(graph%cos(zero)) .eq. graph_ptr(one),              &
                  'Expected cos(0) = 1.')
      CALL assert(TRANSFER(graph%atan(one, zero), 0) .eq. TRANSFER(zero, 0),   &
      CALL assert(graph_ptr(graph%atan(one, zero)) .eq. graph_ptr(zero),       &
                  'Expected atan(one, zero) = zero.')

      rand = graph%random(graph%random_state(0))
      state = graph%random_state(0)
      rand = graph%random(state)

      i = graph%variable(1_C_LONG, 'i' // C_NULL_CHAR)
      buffer1D = (/ CMPLX(2.0, 0.0), CMPLX(4.0, 0.0), CMPLX(6.0, 0.0) /)
@@ -427,6 +450,11 @@

      CALL graph%set_device_number(graph%get_max_concurrency() - 1)

      CALL graph%add_pre_item(graph_null_array, (/ graph_ptr(rand) /),         &
                              graph_null_array, graph_null_array, state,       &
                              'c_binding_pre_kernel' // C_NULL_CHAR,           &
                              1_C_LONG)

      DEALLOCATE(graph)

      END SUBROUTINE