Return true when the expanded-ONNX node cluster for prefix is a Duvenaud message-passing layer.
Duvenaud layers contain ReduceSum, Clip, and Div nodes within their subgraph.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| character(len=*), | intent(in) | :: | prefix |
Layer prefix (e.g. "node_2") |
||
| type(onnx_node_type), | intent(in) | :: | nodes(:) |
Parsed ONNX nodes |
||
| integer, | intent(in) | :: | num_nodes |
Number of valid node entries |
Return value: true when the cluster matches the Duvenaud pattern
function classify_duvenaud_onnx_expanded_gnn( & prefix, nodes, num_nodes) result(is_duvenaud) !! Return true when the expanded-ONNX node cluster !! for prefix is a Duvenaud message-passing layer. !! !! Duvenaud layers contain ReduceSum, Clip, and Div !! nodes within their subgraph. implicit none ! Arguments character(*), intent(in) :: prefix !! Layer prefix (e.g. "node_2") type(onnx_node_type), intent(in) :: nodes(:) !! Parsed ONNX nodes integer, intent(in) :: num_nodes !! Number of valid node entries logical :: is_duvenaud !! Return value: true when the cluster matches the Duvenaud pattern ! Local variables integer :: i character(128) :: cluster_prefix logical :: has_reducesum, has_clip, has_div has_reducesum = .false. has_clip = .false. has_div = .false. write(cluster_prefix, '(A,"_")') trim(prefix) do i = 1, num_nodes if(index(trim(nodes(i)%name), & trim(cluster_prefix)) .ne. 1) cycle select case(trim(nodes(i)%op_type)) case('ReduceSum') has_reducesum = .true. case('Clip') has_clip = .true. case('Div') has_div = .true. end select if(has_reducesum .and. has_clip & .and. has_div) exit end do is_duvenaud = & has_reducesum .and. has_clip .and. has_div end function classify_duvenaud_onnx_expanded_gnn