Coverage for cuda/core/graph/_graph_definition.pyx: 70.68%

133 statements  

« prev     ^ index     » next       coverage.py v7.17.2, created at 2026-11-05 01:11 +0000

1# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 

2# 

3# SPDX-License-Identifier: Apache-2.0 

4  

5"""GraphDefinition: explicit CUDA graph definition.""" 

6  

7from __future__ import annotations 

8  

9from libc.stddef cimport size_t 

10from libc.stdint cimport uintptr_t 

11  

12from libcpp.vector cimport vector 

13  

14from cuda.bindings cimport cydriver 

15  

16from cuda.core.graph._graph_node cimport GraphNode 

17from cuda.core._rt cimport ( 

18 GraphHandle, 

19 as_cu, 

20 as_intptr, 

21 as_py, 

22 create_graph_handle, 

23 create_graph_node_handle, 

24) 

25from cuda.core._utils.cuda_utils cimport HANDLE_RETURN 

26  

27from typing import TYPE_CHECKING 

28  

29from cuda.core._utils.cuda_utils import driver 

30  

31from cuda.core.typing import GraphMemoryType 

32  

33if TYPE_CHECKING: 

34 from collections.abc import Callable 

35  

36 from cuda.core._device import Device 

37 from cuda.core._event import Event 

38 from cuda.core._launch_config import LaunchConfig 

39 from cuda.core._memory._buffer import Buffer 

40 from cuda.core._module import Kernel 

41 from cuda.core._utils.pycompat import BufferProtocol 

42 from cuda.core.graph._graph_builder import ( 

43 Graph, 

44 GraphCompleteOptions, 

45 GraphDebugPrintOptions, 

46 ) 

47 from cuda.core.graph._subclasses import ( 

48 AllocNode, 

49 ChildGraphNode, 

50 EmptyNode, 

51 EventRecordNode, 

52 EventWaitNode, 

53 FreeNode, 

54 HostCallbackNode, 

55 IfElseNode, 

56 IfNode, 

57 KernelNode, 

58 MemcpyNode, 

59 MemsetNode, 

60 SwitchNode, 

61 WhileNode, 

62 ) 

63  

64__all__ = ['GraphCondition', 'GraphDefinition'] 

65  

66  

67cdef class GraphCondition: 

68 """A condition variable for conditional graph nodes. 

69  

70 Created by :meth:`GraphDefinition.create_condition` (or 

71 :meth:`GraphBuilder.create_condition`) and passed to 

72 conditional-node builder methods (:meth:`~GraphDefinition.if_then`, 

73 :meth:`~GraphDefinition.if_else`, :meth:`~GraphDefinition.while_loop`, 

74 :meth:`~GraphDefinition.switch`). The underlying value is set at 

75 runtime by device code via ``cudaGraphSetConditional``. 

76  

77 A :class:`GraphCondition` may be passed directly as a kernel 

78 argument to ``launch()``: the launcher unwraps it to the underlying 

79 ``CUgraphConditionalHandle`` value so device code can update the 

80 condition. 

81 """ 

82  

83 @staticmethod 

84 cdef GraphCondition _from_handle(cydriver.CUgraphConditionalHandle c_handle): 

85 cdef GraphCondition self = GraphCondition.__new__(GraphCondition) 2UbYhBbZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=hp E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 mbVb2 nbx y z A e f g h a b c d i j k l m ?h@hEb3 4 5 6 Fb7 8 9 ! Gb# $ % ' n Hb( ) * + Ib, - . / Jb: ; = ? Kb@ [ ] ^ Lb_ ` { | Mb} ~ abbbNbcbdbebfbObgbhbibjb

86 self._c_handle = c_handle 2UbYhBbZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=hp E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 mbVb2 nbx y z A e f g h a b c d i j k l m ?h@hEb3 4 5 6 Fb7 8 9 ! Gb# $ % ' n Hb( ) * + Ib, - . / Jb: ; = ? Kb@ [ ] ^ Lb_ ` { | Mb} ~ abbbNbcbdbebfbObgbhbibjb

87 return self 2UbYhBbZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=hp E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 mbVb2 nbx y z A e f g h a b c d i j k l m ?h@hEb3 4 5 6 Fb7 8 9 ! Gb# $ % ' n Hb( ) * + Ib, - . / Jb: ; = ? Kb@ [ ] ^ Lb_ ` { | Mb} ~ abbbNbcbdbebfbObgbhbibjb

88  

89 def __repr__(self) -> str: 

90 return f"<GraphCondition handle=0x{<unsigned long long>self._c_handle:x}>" 2Bi

91  

92 def __eq__(self, other: object) -> bool: 

93 if not isinstance(other, GraphCondition): 2wixiyizi'b(bxd)b[h]hAitiui

94 return NotImplemented 2[h]h

95 return self._c_handle == (<GraphCondition>other)._c_handle 2wixiyizi'b(bxd)b[hAitiui

96  

97 def __hash__(self) -> int: 

98 return hash(<unsigned long long>self._c_handle) 2CiDiEiFitiui

99  

100 @property 

101 def handle(self) -> driver.CUgraphConditionalHandle: 

102 """The raw CUgraphConditionalHandle as an int.""" 

103 return <unsigned long long>self._c_handle 2UbYhBbZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h

104  

105  

106cdef class GraphDefinition: 

107 """A graph definition. 

108  

109 A GraphDefinition is used to construct a graph explicitly by adding nodes 

110 and specifying dependencies. Once construction is complete, call 

111 instantiate() to obtain an executable Graph. 

112  

113 Notes 

114 ----- 

115 Definitions that view the same root, child, or conditional graph hierarchy 

116 share underlying graph state. Mutations anywhere in that hierarchy must be 

117 externally synchronized. 

118 """ 

119  

120 def __init__(self): 

121 """Create a new empty graph definition.""" 

122 cdef cydriver.CUgraph graph = NULL 2bcccheiejekelemep PbWbzbneoepe^hydqerese*gWhdcecfcgchcteuevewexesbyeB icjckclc*bmcncoc_h`hpcqcrcsctc+b,b-b.bucvcwcxc{hJhKhLhyczcAczdAdBdobpbC zeAeBeCeCdDdDeEeFeGeHeE F IeEdJeKeLeMeG H NeOeFdGdPeQeReSeTeI J UeHdVeWeXeYeK L Ze0e1e|hId2e3e4e5e6eJd7e8e9e!eKdLd#e$e%e'e(eM N )eMd*e+e,e-eO P .e/eNdOd:e;e=e?e@eQ R [ePd]e^e_e`eS T {e|eQdRd}e~eafbfcfU V dfSdefffgfhfW X ifjfTdUdkflfmfnfofY Z pfVdqfrfsftf0 1 ufvfwfWdxfyfzfAfBfXdCfDfEfFfGfHfYdIfJfmb}h~haibiVbBcCcciCbKfDc2 LfdieiMfNfOfEcnbFcPfGcx y z A e f g h ZdHcIcJctbubKcQbqb0da b c d i j k l QfRfSf1dLcTfUfVfWfXfYfZf2d0fMcNcOc3d1fPc4dQc2f3f4fRcSc5d5fTcUcVc/b:b6d7d;bvbwbWcxbXcm ybrb6fq r s t u 7f8f9f!fo #fRbw $f%fv 'f=bYc(fD Zc0c1c2c3c4c5c6c7c8c?b@b[b)f*f+f,f-f.f/f:f;f=f8d9dAbXbDbYbZb0b1b2b3b4b5bSbTb9c!c#c$c%c'c(c)c]b*ckb+c,c-c.c/c:c;c=c?c@c^b_b`b[clb]c^c_c`c{c|c}c~cadbd{b|b}bcd?f@fdded[fpdqdfdgdhd~bacidjdkd6brd]f!dEb#d^f_f`ffi{f3 4 |f$d}f+g5 6 %d~f'dFb(dagbgcggidg7 8 eg)dfg,g9 ! gg*dGb+dhgigjghikg# $ lg,dmg-g% ' n ng-dHb.dogpgqgiirg( ) sg/dtg.g* + ug:dIb;dvgwgxgjiyg, - zg=dAg/g. / Bg?dJb@dCgDgEgkiFg: ; Gg[dHg:g= ? Ig]dKb^dJgKgLgliMg@ [ Ng_dOg;g] ^ Pg`dLb{dQgRgSgmiTg_ ` Ug|dVg=g{ | Wg}dMb~dXgYgZgni0g} ~ 1gae2g?gabbb3gbeNbce4g5g6goi7gcbdb8gde9g@gebfb!geeObfe#g$g%gpi'ggbhb(gge)g[gibjb

123 with nogil: 2bcccheiejekelemep PbWbzbneoepe^hydqerese*gWhdcecfcgchcteuevewexesbyeB icjckclc*bmcncoc_h`hpcqcrcsctc+b,b-b.bucvcwcxc{hJhKhLhyczcAczdAdBdobpbC zeAeBeCeCdDdDeEeFeGeHeE F IeEdJeKeLeMeG H NeOeFdGdPeQeReSeTeI J UeHdVeWeXeYeK L Ze0e1e|hId2e3e4e5e6eJd7e8e9e!eKdLd#e$e%e'e(eM N )eMd*e+e,e-eO P .e/eNdOd:e;e=e?e@eQ R [ePd]e^e_e`eS T {e|eQdRd}e~eafbfcfU V dfSdefffgfhfW X ifjfTdUdkflfmfnfofY Z pfVdqfrfsftf0 1 ufvfwfWdxfyfzfAfBfXdCfDfEfFfGfHfYdIfJfmb}h~haibiVbBcCcciCbKfDc2 LfdieiMfNfOfEcnbFcPfGcx y z A e f g h ZdHcIcJctbubKcQbqb0da b c d i j k l QfRfSf1dLcTfUfVfWfXfYfZf2d0fMcNcOc3d1fPc4dQc2f3f4fRcSc5d5fTcUcVc/b:b6d7d;bvbwbWcxbXcm ybrb6fq r s t u 7f8f9f!fo #fRbw $f%fv 'f=bYc(fD Zc0c1c2c3c4c5c6c7c8c?b@b[b)f*f+f,f-f.f/f:f;f=f8d9dAbXbDbYbZb0b1b2b3b4b5bSbTb9c!c#c$c%c'c(c)c]b*ckb+c,c-c.c/c:c;c=c?c@c^b_b`b[clb]c^c_c`c{c|c}c~cadbd{b|b}bcd?f@fdded[fpdqdfdgdhd~bacidjdkd6brd]f!dEb#d^f_f`ffi{f3 4 |f$d}f+g5 6 %d~f'dFb(dagbgcggidg7 8 eg)dfg,g9 ! gg*dGb+dhgigjghikg# $ lg,dmg-g% ' n ng-dHb.dogpgqgiirg( ) sg/dtg.g* + ug:dIb;dvgwgxgjiyg, - zg=dAg/g. / Bg?dJb@dCgDgEgkiFg: ; Gg[dHg:g= ? Ig]dKb^dJgKgLgliMg@ [ Ng_dOg;g] ^ Pg`dLb{dQgRgSgmiTg_ ` Ug|dVg=g{ | Wg}dMb~dXgYgZgni0g} ~ 1gae2g?gabbb3gbeNbce4g5g6goi7gcbdb8gde9g@gebfb!geeObfe#g$g%gpi'ggbhb(gge)g[gibjb

124 HANDLE_RETURN(cydriver.cuGraphCreate(&graph, 0)) 2bcccheiejekelemep PbWbzbneoepe^hydqerese*gWhdcecfcgchcteuevewexesbyeB icjckclc*bmcncoc_h`hpcqcrcsctc+b,b-b.bucvcwcxc{hJhKhLhyczcAczdAdBdobpbC zeAeBeCeCdDdDeEeFeGeHeE F IeEdJeKeLeMeG H NeOeFdGdPeQeReSeTeI J UeHdVeWeXeYeK L Ze0e1e|hId2e3e4e5e6eJd7e8e9e!eKdLd#e$e%e'e(eM N )eMd*e+e,e-eO P .e/eNdOd:e;e=e?e@eQ R [ePd]e^e_e`eS T {e|eQdRd}e~eafbfcfU V dfSdefffgfhfW X ifjfTdUdkflfmfnfofY Z pfVdqfrfsftf0 1 ufvfwfWdxfyfzfAfBfXdCfDfEfFfGfHfYdIfJfmb}h~haibiVbBcCcciCbKfDc2 LfdieiMfNfOfEcnbFcPfGcx y z A e f g h ZdHcIcJctbubKcQbqb0da b c d i j k l QfRfSf1dLcTfUfVfWfXfYfZf2d0fMcNcOc3d1fPc4dQc2f3f4fRcSc5d5fTcUcVc/b:b6d7d;bvbwbWcxbXcm ybrb6fq r s t u 7f8f9f!fo #fRbw $f%fv 'f=bYc(fD Zc0c1c2c3c4c5c6c7c8c?b@b[b)f*f+f,f-f.f/f:f;f=f8d9dAbXbDbYbZb0b1b2b3b4b5bSbTb9c!c#c$c%c'c(c)c]b*ckb+c,c-c.c/c:c;c=c?c@c^b_b`b[clb]c^c_c`c{c|c}c~cadbd{b|b}bcd?f@fdded[fpdqdfdgdhd~bacidjdkd6brd]f!dEb#d^f_f`ffi{f3 4 |f$d}f+g5 6 %d~f'dFb(dagbgcggidg7 8 eg)dfg,g9 ! gg*dGb+dhgigjghikg# $ lg,dmg-g% ' n ng-dHb.dogpgqgiirg( ) sg/dtg.g* + ug:dIb;dvgwgxgjiyg, - zg=dAg/g. / Bg?dJb@dCgDgEgkiFg: ; Gg[dHg:g= ? Ig]dKb^dJgKgLgliMg@ [ Ng_dOg;g] ^ Pg`dLb{dQgRgSgmiTg_ ` Ug|dVg=g{ | Wg}dMb~dXgYgZgni0g} ~ 1gae2g?gabbb3gbeNbce4g5g6goi7gcbdb8gde9g@gebfb!geeObfe#g$g%gpi'ggbhb(gge)g[gibjb

125 self._h_graph = create_graph_handle(graph) 2bcccheiejekelemep PbWbzbneoepe^hydqerese*gWhdcecfcgchcteuevewexesbyeB icjckclc*bmcncoc_h`hpcqcrcsctc+b,b-b.bucvcwcxc{hJhKhLhyczcAczdAdBdobpbC zeAeBeCeCdDdDeEeFeGeHeE F IeEdJeKeLeMeG H NeOeFdGdPeQeReSeTeI J UeHdVeWeXeYeK L Ze0e1e|hId2e3e4e5e6eJd7e8e9e!eKdLd#e$e%e'e(eM N )eMd*e+e,e-eO P .e/eNdOd:e;e=e?e@eQ R [ePd]e^e_e`eS T {e|eQdRd}e~eafbfcfU V dfSdefffgfhfW X ifjfTdUdkflfmfnfofY Z pfVdqfrfsftf0 1 ufvfwfWdxfyfzfAfBfXdCfDfEfFfGfHfYdIfJfmb}h~haibiVbBcCcciCbKfDc2 LfdieiMfNfOfEcnbFcPfGcx y z A e f g h ZdHcIcJctbubKcQbqb0da b c d i j k l QfRfSf1dLcTfUfVfWfXfYfZf2d0fMcNcOc3d1fPc4dQc2f3f4fRcSc5d5fTcUcVc/b:b6d7d;bvbwbWcxbXcm ybrb6fq r s t u 7f8f9f!fo #fRbw $f%fv 'f=bYc(fD Zc0c1c2c3c4c5c6c7c8c?b@b[b)f*f+f,f-f.f/f:f;f=f8d9dAbXbDbYbZb0b1b2b3b4b5bSbTb9c!c#c$c%c'c(c)c]b*ckb+c,c-c.c/c:c;c=c?c@c^b_b`b[clb]c^c_c`c{c|c}c~cadbd{b|b}bcd?f@fdded[fpdqdfdgdhd~bacidjdkd6brd]f!dEb#d^f_f`ffi{f3 4 |f$d}f+g5 6 %d~f'dFb(dagbgcggidg7 8 eg)dfg,g9 ! gg*dGb+dhgigjghikg# $ lg,dmg-g% ' n ng-dHb.dogpgqgiirg( ) sg/dtg.g* + ug:dIb;dvgwgxgjiyg, - zg=dAg/g. / Bg?dJb@dCgDgEgkiFg: ; Gg[dHg:g= ? Ig]dKb^dJgKgLgliMg@ [ Ng_dOg;g] ^ Pg`dLb{dQgRgSgmiTg_ ` Ug|dVg=g{ | Wg}dMb~dXgYgZgni0g} ~ 1gae2g?gabbb3gbeNbce4g5g6goi7gcbdb8gde9g@gebfb!geeObfe#g$g%gpi'ggbhb(gge)g[gibjb

126  

127 @staticmethod 

128 cdef GraphDefinition _from_handle(GraphHandle h_graph): 

129 """Create a GraphDefinition from an existing GraphHandle (internal use).""" 

130 cdef GraphDefinition g = GraphDefinition.__new__(GraphDefinition) 2UbBbsdtdudqip sbvdE F G H 7bI J K L MhNhOhPhQhRhM N O P Q R S T U V W X Y Z 0 1 x y z A e f g h wdtbubQbqba b c d i j k l vbwbxbm ybrbRbD [bAb8bkblb9b!b#b$b%b3 4 5 6 7 8 9 ! # $ % ' n ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjb

131 g._h_graph = h_graph 2UbBbsdtdudqip sbvdE F G H 7bI J K L MhNhOhPhQhRhM N O P Q R S T U V W X Y Z 0 1 x y z A e f g h wdtbubQbqba b c d i j k l vbwbxbm ybrbRbD [bAb8bkblb9b!b#b$b%b3 4 5 6 7 8 9 ! # $ % ' n ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjb

132 return g 2UbBbsdtdudqip sbvdE F G H 7bI J K L MhNhOhPhQhRhM N O P Q R S T U V W X Y Z 0 1 x y z A e f g h wdtbubQbqba b c d i j k l vbwbxbm ybrbRbD [bAb8bkblb9b!b#b$b%b3 4 5 6 7 8 9 ! # $ % ' n ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjb

133  

134 def __repr__(self) -> str: 

135 return f"<GraphDefinition handle=0x{as_intptr(self._h_graph):x}>" 2RbGi

136  

137 def __eq__(self, other: object) -> bool: 

138 if not isinstance(other, GraphDefinition): 27b'b(b)bMhNhOhPhQhRhQbD Xh]hvirisi

139 return NotImplemented 2Xh]h

140 return ( 27b'b(b)bMhNhOhPhQhRhQbD Xhvirisi

141 <uintptr_t>self._h_graph.get() 

142 == <uintptr_t>(<GraphDefinition>other)._h_graph.get() 27b'b(b)bMhNhOhPhQhRhQbD Xhvirisi

143 ) 

144  

145 def __hash__(self) -> int: 

146 return hash(<uintptr_t>self._h_graph.get()) 2QbHiIiJiKirisi

147  

148 @property 

149 def is_valid(self) -> bool: 

150 """Whether this graph definition remains valid.""" 

151 return as_intptr(self._h_graph) != 0 2Rb%d

152  

153 @property 

154 def _entry(self) -> GraphNode: 

155 """Return the internal entry-point GraphNode (no dependencies).""" 

156 GD_check_valid(self) 2bcBbccheiejekelemep PbWbzbneoepeydqerese*gdcecfcgchcteuevewexesbyeB icjckclc*bmcncocpcqcrcsctc+b,b-b.bucvcwcxcyczcAczdAdBdobpbC zeAeBeCeCdDdDeEeFeGeHeE F IeEdJeKeLeMeG H NeOeFdGdPeQeReSeTeI J UeHdVeWeXeYeK L Ze0e1eId2e3e4e5e6eJd7e8e9e!eKdLd#e$e%e'e(eM N )eMd*e+e,e-eO P .e/eNdOd:e;e=e?e@eQ R [ePd]e^e_e`eS T {e|eQdRd}e~eafbfcfU V dfSdefffgfhfW X ifjfTdUdkflfmfnfofY Z pfVdqfrfsftf0 1 ufvfwfWdxfyfzfAfBfXdCfDfEfFfGfHfYdIfJfmbBcCcCbKfDc2 LfMfNfOfEcnbFcPfGcx y z A e f g h ZdHcIcJctbubKcQbqb0da b c d i j k l QfRfSf1dLcTfUfVfWfXfYfZf2d0fMcNcOc3d1fPc4dQc2f3f4fRcSc5d5fTcUcVc/b:b6d7d;bvbwbWcxbXcm ybrb6fq r s t u 7f8f9f!fo #fRbw $f%fv 'f=bYc(fD Zc0c1c2c3c4c5c6c7c8c?b@b[b)f*f+f,f-f.f/f:f;f=f8d9dAbXbDbYbZb0b1b2b3b4b5bSbTb9c!c#c$c%c'c(c)c]b*ckb+c,c-c.c/c:c;c=c?c@c^b_b`b[clb]c^c_c`c{c|c}c~cadbd{b|b}bcd?f@fdded[fpdqdfdgdhd~bacidjdkd6brd]f!d#d^f_f`f{f3 4 |f$d}f+g5 6 %d~f'd(dagbgcgdg7 8 eg)dfg,g9 ! gg*d+dhgigjgkg# $ lg,dmg-g% ' n ng-d.dogpgqgrg( ) sg/dtg.g* + ug:d;dvgwgxgyg, - zg=dAg/g. / Bg?d@dCgDgEgFg: ; Gg[dHg:g= ? Ig]d^dJgKgLgMg@ [ Ng_dOg;g] ^ Pg`d{dQgRgSgTg_ ` Ug|dVg=g{ | Wg}d~dXgYgZg0g} ~ 1gae2g?gabbb3gbece4g5g6g7gcbdb8gde9g@gebfb!geefe#g$g%g'ggbhb(gge)g[gibjb

157 cdef GraphNode n = GraphNode.__new__(GraphNode) 2bcBbccheiejekelemep PbWbzbneoepeydqerese*gdcecfcgchcteuevewexesbyeB icjckclc*bmcncocpcqcrcsctc+b,b-b.bucvcwcxcyczcAczdAdBdobpbC zeAeBeCeCdDdDeEeFeGeHeE F IeEdJeKeLeMeG H NeOeFdGdPeQeReSeTeI J UeHdVeWeXeYeK L Ze0e1eId2e3e4e5e6eJd7e8e9e!eKdLd#e$e%e'e(eM N )eMd*e+e,e-eO P .e/eNdOd:e;e=e?e@eQ R [ePd]e^e_e`eS T {e|eQdRd}e~eafbfcfU V dfSdefffgfhfW X ifjfTdUdkflfmfnfofY Z pfVdqfrfsftf0 1 ufvfwfWdxfyfzfAfBfXdCfDfEfFfGfHfYdIfJfmbBcCcCbKfDc2 LfMfNfOfEcnbFcPfGcx y z A e f g h ZdHcIcJctbubKcQbqb0da b c d i j k l QfRfSf1dLcTfUfVfWfXfYfZf2d0fMcNcOc3d1fPc4dQc2f3f4fRcSc5d5fTcUcVc/b:b6d7d;bvbwbWcxbXcm ybrb6fq r s t u 7f8f9f!fo #fRbw $f%fv 'f=bYc(fD Zc0c1c2c3c4c5c6c7c8c?b@b[b)f*f+f,f-f.f/f:f;f=f8d9dAbXbDbYbZb0b1b2b3b4b5bSbTb9c!c#c$c%c'c(c)c]b*ckb+c,c-c.c/c:c;c=c?c@c^b_b`b[clb]c^c_c`c{c|c}c~cadbd{b|b}bcd?f@fdded[fpdqdfdgdhd~bacidjdkd6brd]f!d#d^f_f`f{f3 4 |f$d}f+g5 6 %d~f'd(dagbgcgdg7 8 eg)dfg,g9 ! gg*d+dhgigjgkg# $ lg,dmg-g% ' n ng-d.dogpgqgrg( ) sg/dtg.g* + ug:d;dvgwgxgyg, - zg=dAg/g. / Bg?d@dCgDgEgFg: ; Gg[dHg:g= ? Ig]d^dJgKgLgMg@ [ Ng_dOg;g] ^ Pg`d{dQgRgSgTg_ ` Ug|dVg=g{ | Wg}d~dXgYgZg0g} ~ 1gae2g?gabbb3gbece4g5g6g7gcbdb8gde9g@gebfb!geefe#g$g%g'ggbhb(gge)g[gibjb

158 n._h_node = create_graph_node_handle(<cydriver.CUgraphNode>NULL, self._h_graph) 2bcBbccheiejekelemep PbWbzbneoepeydqerese*gdcecfcgchcteuevewexesbyeB icjckclc*bmcncocpcqcrcsctc+b,b-b.bucvcwcxcyczcAczdAdBdobpbC zeAeBeCeCdDdDeEeFeGeHeE F IeEdJeKeLeMeG H NeOeFdGdPeQeReSeTeI J UeHdVeWeXeYeK L Ze0e1eId2e3e4e5e6eJd7e8e9e!eKdLd#e$e%e'e(eM N )eMd*e+e,e-eO P .e/eNdOd:e;e=e?e@eQ R [ePd]e^e_e`eS T {e|eQdRd}e~eafbfcfU V dfSdefffgfhfW X ifjfTdUdkflfmfnfofY Z pfVdqfrfsftf0 1 ufvfwfWdxfyfzfAfBfXdCfDfEfFfGfHfYdIfJfmbBcCcCbKfDc2 LfMfNfOfEcnbFcPfGcx y z A e f g h ZdHcIcJctbubKcQbqb0da b c d i j k l QfRfSf1dLcTfUfVfWfXfYfZf2d0fMcNcOc3d1fPc4dQc2f3f4fRcSc5d5fTcUcVc/b:b6d7d;bvbwbWcxbXcm ybrb6fq r s t u 7f8f9f!fo #fRbw $f%fv 'f=bYc(fD Zc0c1c2c3c4c5c6c7c8c?b@b[b)f*f+f,f-f.f/f:f;f=f8d9dAbXbDbYbZb0b1b2b3b4b5bSbTb9c!c#c$c%c'c(c)c]b*ckb+c,c-c.c/c:c;c=c?c@c^b_b`b[clb]c^c_c`c{c|c}c~cadbd{b|b}bcd?f@fdded[fpdqdfdgdhd~bacidjdkd6brd]f!d#d^f_f`f{f3 4 |f$d}f+g5 6 %d~f'd(dagbgcgdg7 8 eg)dfg,g9 ! gg*d+dhgigjgkg# $ lg,dmg-g% ' n ng-d.dogpgqgrg( ) sg/dtg.g* + ug:d;dvgwgxgyg, - zg=dAg/g. / Bg?d@dCgDgEgFg: ; Gg[dHg:g= ? Ig]d^dJgKgLgMg@ [ Ng_dOg;g] ^ Pg`d{dQgRgSgTg_ ` Ug|dVg=g{ | Wg}d~dXgYgZg0g} ~ 1gae2g?gabbb3gbece4g5g6g7gcbdb8gde9g@gebfb!geefe#g$g%g'ggbhb(gge)g[gibjb

159 n._is_entry = True 2bcBbccheiejekelemep PbWbzbneoepeydqerese*gdcecfcgchcteuevewexesbyeB icjckclc*bmcncocpcqcrcsctc+b,b-b.bucvcwcxcyczcAczdAdBdobpbC zeAeBeCeCdDdDeEeFeGeHeE F IeEdJeKeLeMeG H NeOeFdGdPeQeReSeTeI J UeHdVeWeXeYeK L Ze0e1eId2e3e4e5e6eJd7e8e9e!eKdLd#e$e%e'e(eM N )eMd*e+e,e-eO P .e/eNdOd:e;e=e?e@eQ R [ePd]e^e_e`eS T {e|eQdRd}e~eafbfcfU V dfSdefffgfhfW X ifjfTdUdkflfmfnfofY Z pfVdqfrfsftf0 1 ufvfwfWdxfyfzfAfBfXdCfDfEfFfGfHfYdIfJfmbBcCcCbKfDc2 LfMfNfOfEcnbFcPfGcx y z A e f g h ZdHcIcJctbubKcQbqb0da b c d i j k l QfRfSf1dLcTfUfVfWfXfYfZf2d0fMcNcOc3d1fPc4dQc2f3f4fRcSc5d5fTcUcVc/b:b6d7d;bvbwbWcxbXcm ybrb6fq r s t u 7f8f9f!fo #fRbw $f%fv 'f=bYc(fD Zc0c1c2c3c4c5c6c7c8c?b@b[b)f*f+f,f-f.f/f:f;f=f8d9dAbXbDbYbZb0b1b2b3b4b5bSbTb9c!c#c$c%c'c(c)c]b*ckb+c,c-c.c/c:c;c=c?c@c^b_b`b[clb]c^c_c`c{c|c}c~cadbd{b|b}bcd?f@fdded[fpdqdfdgdhd~bacidjdkd6brd]f!d#d^f_f`f{f3 4 |f$d}f+g5 6 %d~f'd(dagbgcgdg7 8 eg)dfg,g9 ! gg*d+dhgigjgkg# $ lg,dmg-g% ' n ng-d.dogpgqgrg( ) sg/dtg.g* + ug:d;dvgwgxgyg, - zg=dAg/g. / Bg?d@dCgDgEgFg: ; Gg[dHg:g= ? Ig]d^dJgKgLgMg@ [ Ng_dOg;g] ^ Pg`d{dQgRgSgTg_ ` Ug|dVg=g{ | Wg}d~dXgYgZg0g} ~ 1gae2g?gabbb3gbece4g5g6g7gcbdb8gde9g@gebfb!geefe#g$g%g'ggbhb(gge)g[gibjb

160 return n 2bcBbccheiejekelemep PbWbzbneoepeydqerese*gdcecfcgchcteuevewexesbyeB icjckclc*bmcncocpcqcrcsctc+b,b-b.bucvcwcxcyczcAczdAdBdobpbC zeAeBeCeCdDdDeEeFeGeHeE F IeEdJeKeLeMeG H NeOeFdGdPeQeReSeTeI J UeHdVeWeXeYeK L Ze0e1eId2e3e4e5e6eJd7e8e9e!eKdLd#e$e%e'e(eM N )eMd*e+e,e-eO P .e/eNdOd:e;e=e?e@eQ R [ePd]e^e_e`eS T {e|eQdRd}e~eafbfcfU V dfSdefffgfhfW X ifjfTdUdkflfmfnfofY Z pfVdqfrfsftf0 1 ufvfwfWdxfyfzfAfBfXdCfDfEfFfGfHfYdIfJfmbBcCcCbKfDc2 LfMfNfOfEcnbFcPfGcx y z A e f g h ZdHcIcJctbubKcQbqb0da b c d i j k l QfRfSf1dLcTfUfVfWfXfYfZf2d0fMcNcOc3d1fPc4dQc2f3f4fRcSc5d5fTcUcVc/b:b6d7d;bvbwbWcxbXcm ybrb6fq r s t u 7f8f9f!fo #fRbw $f%fv 'f=bYc(fD Zc0c1c2c3c4c5c6c7c8c?b@b[b)f*f+f,f-f.f/f:f;f=f8d9dAbXbDbYbZb0b1b2b3b4b5bSbTb9c!c#c$c%c'c(c)c]b*ckb+c,c-c.c/c:c;c=c?c@c^b_b`b[clb]c^c_c`c{c|c}c~cadbd{b|b}bcd?f@fdded[fpdqdfdgdhd~bacidjdkd6brd]f!d#d^f_f`f{f3 4 |f$d}f+g5 6 %d~f'd(dagbgcgdg7 8 eg)dfg,g9 ! gg*d+dhgigjgkg# $ lg,dmg-g% ' n ng-d.dogpgqgrg( ) sg/dtg.g* + ug:d;dvgwgxgyg, - zg=dAg/g. / Bg?d@dCgDgEgFg: ; Gg[dHg:g= ? Ig]d^dJgKgLgMg@ [ Ng_dOg;g] ^ Pg`d{dQgRgSgTg_ ` Ug|dVg=g{ | Wg}d~dXgYgZg0g} ~ 1gae2g?gabbb3gbece4g5g6g7gcbdb8gde9g@gebfb!geefe#g$g%g'ggbhb(gge)g[gibjb

161  

162 def allocate(self, size_t size, *, device: Device | int | None = None, 

163 memory_type: GraphMemoryType = GraphMemoryType.DEVICE, 

164 peer_access: list[Device | int] | None = None) -> AllocNode: 

165 """Add an entry-point memory allocation node (no dependencies). 

166  

167 See :meth:`GraphNode.allocate` for full documentation. 

168 """ 

169 return self._entry.allocate(size, device=device, memory_type=memory_type, peer_access=peer_access) 2heiejekelemePbWbzbneoepeydqereseicjckclc+b,b-b.bucvcwcxcyczcAczdAdBdBeCeDdDeEeFeIeEdJeKeLeMeNeOeGdPeQeReUeHdVeWeXeYeZe0e1eId2e3e4e5e6eJd7e8e9e!eLd#e$e%e)eMd*e+e,e-e.e/eOd:e;e=e[ePd]e^e_e`e{e|eRd}e~eafdfSdefffgfhfifjfUdkflfmfpfVdqfrfsftfufvfwfWdxfyfzfAfBfXdCfDfFfGfHfYdIfJfLfOfFcRfTfVfWfZf2dv ]f#d`f$d}f~f(dcg)dfggg+djg,dmgn ng.dqg/dtgug;dxg=dAgBg@dEg[dHgIg^dLg_dOgPg{dSg|dVgWg~dZgae2g3gce6gde9g!gfe%gge)g

170  

171 def deallocate(self, dptr: int) -> FreeNode: 

172 """Add an entry-point memory free node (no dependencies). 

173  

174 See :meth:`GraphNode.deallocate` for full documentation. 

175 """ 

176 return self._entry.deallocate(dptr) 2Kf

177  

178 def memset( 

179 self, 

180 dst: Buffer | int, 

181 value, 

182 size_t width, 

183 size_t height=1, 

184 size_t pitch=0, 

185 *, 

186 dst_owner=None, 

187 ) -> MemsetNode: 

188 """Add an entry-point memset node (no dependencies). 

189  

190 See :meth:`GraphNode.memset` for full documentation. 

191 """ 

192 return self._entry.memset( 2/b:b6d7d;bo w ?b@b8d9dSbTb]b^b_b{b|bpdqd6brd

193 dst, value, width, height=height, pitch=pitch, dst_owner=dst_owner 2/b:b6d7d;bo w ?b@b8d9dSbTb]b^b_b{b|bpdqd6brd

194 ) 

195  

196 def launch(self, config not None: LaunchConfig, kernel not None: Kernel, *args) -> KernelNode: 

197 """Add an entry-point kernel launch node (no dependencies). 

198  

199 See :meth:`GraphNode.launch` for full documentation. 

200 """ 

201 return self._entry.launch(config, kernel, *args) 2Bb*bpcqcrcsctczeAeCdFdKdNdQdTdCcEce f g h tbOc3d1fPc4dQcwbq r s t u o 3c4c5c-f.f/f0b1b2b!c#c$c%c'c(c*c/c:c;c`b{c|c}c?f@ffdid!d|f'deg*dlgn -dsg:dzg?dGg]dNg`dUg}d1gbe8gee(g

202  

203 def empty(self) -> EmptyNode: 

204 """Add an entry-point empty node (no dependencies). 

205  

206 Returns 

207 ------- 

208 EmptyNode 

209 A new EmptyNode with no dependencies. 

210 """ 

211 return self._entry.join() 2bcccB obpbC EfCbDc2 MfNf7f8f9f!f#fRb$f%f'f`b}b~bac%d

212  

213 def join(self, *nodes: GraphNode) -> EmptyNode: 

214 """Create an empty node that depends on all given nodes. 

215  

216 Parameters 

217 ---------- 

218 *nodes : GraphNode 

219 Nodes to merge. 

220  

221 Returns 

222 ------- 

223 EmptyNode 

224 A new EmptyNode that depends on all input nodes. 

225 """ 

226 return self._entry.join(*nodes) 2yd+b,b-b.bzdAdBdDdEdGdHdIdJdLdMdOdPdRdSdUdVdWdXdYd2dq r s t u #d$d(d)d+d,dn .d/d;d=d@d[d^d_d{d|d~daecedefege

227  

228 def memcpy(self, dst: Buffer | int, src: Buffer | int, size_t size, *, dst_owner=None, src_owner=None) -> MemcpyNode: 

229 """Add an entry-point memcpy node (no dependencies). 

230  

231 See :meth:`GraphNode.memcpy` for full documentation. 

232 """ 

233 return self._entry.memcpy(dst, src, size, dst_owner=dst_owner, src_owner=src_owner) 2PfKc0fMcNc2f3f4fRcSc5d5fTcUcVc6c7c8c:f;f=f3b4b5b)c=c?c@c~cadbddded[fpdqdrd

234  

235 def embed(self, GraphDefinition child not None: GraphDefinition) -> ChildGraphNode: 

236 """Add an entry-point child graph node (no dependencies). 

237  

238 See :meth:`GraphNode.embed` for full documentation. 

239 """ 

240 return self._entry.embed(child) 2sb*bCdFdKdNdQdTdtbubQbqb0dvbwbxbybrb=bD [bAbkblb!d'd*dn -d:d?d]d`d}dbeee

241  

242 def record(self, event not None: Event) -> EventRecordNode: 

243 """Add an entry-point event record node (no dependencies). 

244  

245 See :meth:`GraphNode.record` for full documentation. 

246 """ 

247 return self._entry.record(event) 2mcQfSf1dLcXfZc)fXb+c]c^faghgn ogvgCgJgQgXg4g#g

248  

249 def wait(self, event not None: Event) -> EventWaitNode: 

250 """Add an entry-point event wait node (no dependencies). 

251  

252 See :meth:`GraphNode.wait` for full documentation. 

253 """ 

254 return self._entry.wait(event) 2UfYf0c*fDb,c^c_fbgign pgwgDgKgRgYg5g$g

255  

256 def callback(self, fn: Callable[..., object], *, user_data: int | BufferProtocol | None = None) -> HostCallbackNode: 

257 """Add an entry-point host callback node (no dependencies). 

258  

259 See :meth:`GraphNode.callback` for full documentation. 

260 """ 

261 return self._entry.callback(fn, user_data=user_data) 2dcecfcgchcteuevewexesbyencocGeHeSeTe'e(e?e@ebfcfnfofBcGcZdHcIcJcubqb0da b c d i j k l vbWcxbXcybrb6f=bYc(fD 1c2c[b+f,fAbYbZb9ckb-c.c[clb_c`c}bcdgdhd~bacjdkd6b{fdgkgn rgygFgMgTg0g7g'g

262  

263 def create_condition(self, default_value: int | None = None) -> GraphCondition: 

264 """Create a condition variable for use with conditional nodes. 

265  

266 The returned :class:`GraphCondition` object is passed to conditional-node 

267 builder methods. Its value is controlled at runtime by device code 

268 via ``cudaGraphSetConditional``. 

269  

270 Parameters 

271 ---------- 

272 default_value : int, optional 

273 The default value to assign to the condition. 

274 If None, no default is assigned. 

275  

276 Returns 

277 ------- 

278 GraphCondition 

279 A condition variable for controlling conditional execution. 

280 """ 

281 GD_check_valid(self) 2p E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 mbVb2 nbx y z A e f g h a b c d i j k l m Eb3 4 5 6 Fb7 8 9 ! Gb# $ % ' n Hb( ) * + Ib, - . / Jb: ; = ? Kb@ [ ] ^ Lb_ ` { | Mb} ~ abbbNbcbdbebfbObgbhbibjb

282 cdef cydriver.CUgraphConditionalHandle c_handle 

283 cdef unsigned int flags = 0 2p E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 mbVb2 nbx y z A e f g h a b c d i j k l m Eb3 4 5 6 Fb7 8 9 ! Gb# $ % ' n Hb( ) * + Ib, - . / Jb: ; = ? Kb@ [ ] ^ Lb_ ` { | Mb} ~ abbbNbcbdbebfbObgbhbibjb

284 cdef unsigned int default_val = 0 2p E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 mbVb2 nbx y z A e f g h a b c d i j k l m Eb3 4 5 6 Fb7 8 9 ! Gb# $ % ' n Hb( ) * + Ib, - . / Jb: ; = ? Kb@ [ ] ^ Lb_ ` { | Mb} ~ abbbNbcbdbebfbObgbhbibjb

285  

286 if default_value is not None: 2p E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 mbVb2 nbx y z A e f g h a b c d i j k l m Eb3 4 5 6 Fb7 8 9 ! Gb# $ % ' n Hb( ) * + Ib, - . / Jb: ; = ? Kb@ [ ] ^ Lb_ ` { | Mb} ~ abbbNbcbdbebfbObgbhbibjb

287 default_val = <unsigned int>default_value 2p E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 mb2 nbx y z A e f g h a b c d i j k l m Eb3 4 5 6 Fb7 8 9 ! Gb# $ % ' n Hb( ) * + Ib, - . / Jb: ; = ? Kb@ [ ] ^ Lb_ ` { | Mb} ~ abbbNbcbdbebfbObgbhbibjb

288 flags = cydriver.CU_GRAPH_COND_ASSIGN_DEFAULT 2p E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 mb2 nbx y z A e f g h a b c d i j k l m Eb3 4 5 6 Fb7 8 9 ! Gb# $ % ' n Hb( ) * + Ib, - . / Jb: ; = ? Kb@ [ ] ^ Lb_ ` { | Mb} ~ abbbNbcbdbebfbObgbhbibjb

289  

290 cdef cydriver.CUcontext ctx = NULL 2p E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 mbVb2 nbx y z A e f g h a b c d i j k l m Eb3 4 5 6 Fb7 8 9 ! Gb# $ % ' n Hb( ) * + Ib, - . / Jb: ; = ? Kb@ [ ] ^ Lb_ ` { | Mb} ~ abbbNbcbdbebfbObgbhbibjb

291 with nogil: 2p E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 mbVb2 nbx y z A e f g h a b c d i j k l m Eb3 4 5 6 Fb7 8 9 ! Gb# $ % ' n Hb( ) * + Ib, - . / Jb: ; = ? Kb@ [ ] ^ Lb_ ` { | Mb} ~ abbbNbcbdbebfbObgbhbibjb

292 HANDLE_RETURN(cydriver.cuCtxGetCurrent(&ctx)) 2p E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 mbVb2 nbx y z A e f g h a b c d i j k l m Eb3 4 5 6 Fb7 8 9 ! Gb# $ % ' n Hb( ) * + Ib, - . / Jb: ; = ? Kb@ [ ] ^ Lb_ ` { | Mb} ~ abbbNbcbdbebfbObgbhbibjb

293 HANDLE_RETURN(cydriver.cuGraphConditionalHandleCreate( 2p E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 mbVb2 nbx y z A e f g h a b c d i j k l m Eb3 4 5 6 Fb7 8 9 ! Gb# $ % ' n Hb( ) * + Ib, - . / Jb: ; = ? Kb@ [ ] ^ Lb_ ` { | Mb} ~ abbbNbcbdbebfbObgbhbibjb

294 &c_handle, as_cu(self._h_graph), ctx, default_val, flags)) 

295  

296 return GraphCondition._from_handle(c_handle) 2p E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 mbVb2 nbx y z A e f g h a b c d i j k l m Eb3 4 5 6 Fb7 8 9 ! Gb# $ % ' n Hb( ) * + Ib, - . / Jb: ; = ? Kb@ [ ] ^ Lb_ ` { | Mb} ~ abbbNbcbdbebfbObgbhbibjb

297  

298 def if_then(self, GraphCondition condition not None: GraphCondition) -> IfNode: 

299 """Add an entry-point if-conditional node (no dependencies). 

300  

301 See :meth:`GraphNode.if_then` for full documentation. 

302 """ 

303 return self._entry.if_then(condition) 2p F J N R V Z mbx e a i 4 8 $ n ) - ; [ ` ~ dbhb

304  

305 def if_else(self, GraphCondition condition not None: GraphCondition) -> IfElseNode: 

306 """Add an entry-point if-else conditional node (no dependencies). 

307  

308 See :meth:`GraphNode.if_else` for full documentation. 

309 """ 

310 return self._entry.if_else(condition) 2E I M Q U Y y f b j 3 7 # n ( , : @ _ } cbgb

311  

312 def while_loop(self, GraphCondition condition not None: GraphCondition) -> WhileNode: 

313 """Add an entry-point while-loop conditional node (no dependencies). 

314  

315 See :meth:`GraphNode.while_loop` for full documentation. 

316 """ 

317 return self._entry.while_loop(condition) 2H L P T X 1 A h d l m 6 ! ' n + / ? ^ | bbfbjb

318  

319 def switch(self, GraphCondition condition not None: GraphCondition, unsigned int count) -> SwitchNode: 

320 """Add an entry-point switch conditional node (no dependencies). 

321  

322 See :meth:`GraphNode.switch` for full documentation. 

323 """ 

324 return self._entry.switch(condition, count) 2G K O S W 0 nbz g c k 5 9 % n * . = ] { abebib

325  

326 def instantiate(self, options: GraphCompleteOptions | None = None) -> Graph: 

327 """Instantiate the graph definition into an executable Graph. 

328  

329 Parameters 

330 ---------- 

331 options : :obj:`~graph.GraphCompleteOptions`, optional 

332 Customizable dataclass for graph instantiation options. 

333  

334 Returns 

335 ------- 

336 Graph 

337 An executable graph that can be launched on a stream. 

338 """ 

339 GD_check_valid(self) 2bcccdcecfcgchcicjckclc*bmcncocpcqcrcsctc+b,b-b.bucvcwcxcJhKhLhyczcAcBcCcDc2 EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVc/b:b;bWcXcq r s t u o Rbv =bYcD Zc0c1c2c3c4c5c6c7c8c?b@b9c!c#c$c%c'c8b(c)c]b*ckb+c,c-c.c/c:c;c=c?c@c^b_b`b[clb]c^c_c`c{c|c}c~cadbd{b|b}bcddded9b!b#b$b%bfdgdhd~bacidjdkd6b

340 from cuda.core.graph._graph_builder import _instantiate_graph 2bcccdcecfcgchcicjckclc*bmcncocpcqcrcsctc+b,b-b.bucvcwcxcJhKhLhyczcAcBcCcDc2 EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVc/b:b;bWcXcq r s t u o v =bYcD Zc0c1c2c3c4c5c6c7c8c?b@b9c!c#c$c%c'c8b(c)c]b*ckb+c,c-c.c/c:c;c=c?c@c^b_b`b[clb]c^c_c`c{c|c}c~cadbd{b|b}bcddded9b!b#b$b%bfdgdhd~bacidjdkd6b

341  

342 return _instantiate_graph(self, options) 2bcccdcecfcgchcicjckclc*bmcncocpcqcrcsctc+b,b-b.bucvcwcxcJhKhLhyczcAcBcCcDc2 EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVc/b:b;bWcXcq r s t u o v =bYcD Zc0c1c2c3c4c5c6c7c8c?b@b9c!c#c$c%c'c8b(c)c]b*ckb+c,c-c.c/c:c;c=c?c@c^b_b`b[clb]c^c_c`c{c|c}c~cadbd{b|b}bcddded9b!b#b$b%bfdgdhd~bacidjdkd6b

343  

344 def debug_dot_print(self, path: str, options: GraphDebugPrintOptions | None = None) -> None: 

345 """Write a GraphViz DOT representation of the graph to a file. 

346  

347 Parameters 

348 ---------- 

349 path : str 

350 File path for the DOT output. 

351 options : GraphDebugPrintOptions, optional 

352 Customizable options for the debug print. 

353 """ 

354 GD_check_valid(self) 2PbWbzb

355 from cuda.core.graph._graph_builder import GraphDebugPrintOptions 2PbWbzb

356  

357 cdef unsigned int flags = 0 2PbWbzb

358 if options is not None: 2PbWbzb

359 if not isinstance(options, GraphDebugPrintOptions): 2Wbzb

360 raise TypeError("options must be a GraphDebugPrintOptions instance") 2Wb

361 flags = options._to_flags() 2zb

362  

363 cdef bytes path_bytes = path.encode('utf-8') 2Pbzb

364 cdef const char* c_path = path_bytes 2Pbzb

365 with nogil: 2Pbzb

366 HANDLE_RETURN(cydriver.cuGraphDebugDotPrint(as_cu(self._h_graph), c_path, flags)) 2Pbzb

367  

368 def nodes(self) -> set[GraphNode]: 

369 """Return all nodes in the graph. 

370  

371 Returns 

372 ------- 

373 set of GraphNode 

374 All nodes in the graph. 

375 """ 

376 GD_check_valid(self) 2UbBbsdtdudp sbB C vd]g^g7b_g`g{g|g'b(b}g~gahbhchdhxd)behfhghShhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhCbx y z A e f g h wdtbubqba b c d i j k l vbwbxbm ybrbq r s t u o Rbw v D AbXbDbYbZb0b1b2b3b4b5bSbTb8bkblb9b!b#b$b%b

377 cdef vector[cydriver.CUgraphNode] nodes_vec 

378 cdef size_t num_nodes = 0 2UbBbsdtdudp sbB C vd]g^g7b_g`g{g|g'b(b}g~gahbhchdhxd)behfhghShhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhCbx y z A e f g h wdtbubqba b c d i j k l vbwbxbm ybrbq r s t u o w v D AbXbDbYbZb0b1b2b3b4b5bSbTb8bkblb9b!b#b$b%b

379  

380 with nogil: 2UbBbsdtdudp sbB C vd]g^g7b_g`g{g|g'b(b}g~gahbhchdhxd)behfhghShhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhCbx y z A e f g h wdtbubqba b c d i j k l vbwbxbm ybrbq r s t u o w v D AbXbDbYbZb0b1b2b3b4b5bSbTb8bkblb9b!b#b$b%b

381 HANDLE_RETURN(cydriver.cuGraphGetNodes(as_cu(self._h_graph), NULL, &num_nodes)) 2UbBbsdtdudp sbB C vd]g^g7b_g`g{g|g'b(b}g~gahbhchdhxd)behfhghShhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhCbx y z A e f g h wdtbubqba b c d i j k l vbwbxbm ybrbq r s t u o w v D AbXbDbYbZb0b1b2b3b4b5bSbTb8bkblb9b!b#b$b%b

382  

383 if num_nodes == 0: 2UbBbsdtdudp sbB C vd]g^g7b_g`g{g|g'b(b}g~gahbhchdhxd)behfhghShhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhCbx y z A e f g h wdtbubqba b c d i j k l vbwbxbm ybrbq r s t u o w v D AbXbDbYbZb0b1b2b3b4b5bSbTb8bkblb9b!b#b$b%b

384 return set() 2BbShx y z A m AbXbYbZb0b1b2b3b4b5bSbTb

385  

386 nodes_vec.resize(num_nodes) 2Ubsdtdudp sbB C vd]g^g7b_g`g{g|g'b(b}g~gahbhchdhxd)behfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhCbe f g h wdtbubqba b c d i j k l vbwbxbm ybrbq r s t u o w v D Db8bkblb9b!b#b$b%b

387 with nogil: 2Ubsdtdudp sbB C vd]g^g7b_g`g{g|g'b(b}g~gahbhchdhxd)behfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhCbe f g h wdtbubqba b c d i j k l vbwbxbm ybrbq r s t u o w v D Db8bkblb9b!b#b$b%b

388 HANDLE_RETURN(cydriver.cuGraphGetNodes(as_cu(self._h_graph), nodes_vec.data(), &num_nodes)) 2Ubsdtdudp sbB C vd]g^g7b_g`g{g|g'b(b}g~gahbhchdhxd)behfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhCbe f g h wdtbubqba b c d i j k l vbwbxbm ybrbq r s t u o w v D Db8bkblb9b!b#b$b%b

389  

390 return {GraphNode._create(self._h_graph, nodes_vec[i]) for i in range(num_nodes)} 2Ubsdtdudp sbB C vd]g^g7b_g`g{g|g'b(b}g~gahbhchdhxd)behfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhCbe f g h wdtbubqba b c d i j k l vbwbxbm ybrbq r s t u o w v D Db8bkblb9b!b#b$b%b

391  

392 def edges(self) -> set[tuple[GraphNode, GraphNode]]: 

393 """Return all edges in the graph as (from_node, to_node) pairs. 

394  

395 Returns 

396 ------- 

397 set of tuple 

398 Each element is a (from_node, to_node) pair representing 

399 a dependency edge in the graph. 

400 """ 

401 GD_check_valid(self) 2ldmdThUhndodVhB obpbC q r s t u o w v

402 cdef vector[cydriver.CUgraphNode] from_nodes 

403 cdef vector[cydriver.CUgraphNode] to_nodes 

404 cdef size_t num_edges = 0 2ldmdThUhndodVhB obpbC q r s t u o w v

405  

406 with nogil: 2ldmdThUhndodVhB obpbC q r s t u o w v

407 IF CUDA_CORE_BUILD_MAJOR >= 13: 

408 HANDLE_RETURN(cydriver.cuGraphGetEdges( 2ldmdThUhndodVhB obpbC q r s t u o w v

409 as_cu(self._h_graph), NULL, NULL, NULL, &num_edges)) 

410 ELSE: 

411 HANDLE_RETURN(cydriver.cuGraphGetEdges( 

412 as_cu(self._h_graph), NULL, NULL, &num_edges)) 

413  

414 if num_edges == 0: 2ldmdThUhndodVhB obpbC q r s t u o w v

415 return set() 2ThUhVhobpbw

416  

417 from_nodes.resize(num_edges) 2ldmdndodB obpbC q r s t u o w v

418 to_nodes.resize(num_edges) 2ldmdndodB obpbC q r s t u o w v

419 with nogil: 2ldmdndodB obpbC q r s t u o w v

420 IF CUDA_CORE_BUILD_MAJOR >= 13: 

421 HANDLE_RETURN(cydriver.cuGraphGetEdges( 2ldmdndodB obpbC q r s t u o w v

422 as_cu(self._h_graph), from_nodes.data(), to_nodes.data(), NULL, &num_edges)) 

423 ELSE: 

424 HANDLE_RETURN(cydriver.cuGraphGetEdges( 

425 as_cu(self._h_graph), from_nodes.data(), to_nodes.data(), &num_edges)) 

426  

427 return { 2ldmdndodB obpbC q r s t u o w v

428 (GraphNode._create(self._h_graph, from_nodes[i]), 2ldmdndodB obpbC q r s t u o w v

429 GraphNode._create(self._h_graph, to_nodes[i])) 2ldmdndodB obpbC q r s t u o w v

430 for i in range(num_edges) 2ldmdndodB obpbC q r s t u o w v

431 } 

432  

433 @property 

434 def handle(self) -> driver.CUgraph: 

435 """Return the underlying driver CUgraph handle.""" 

436 return as_py(self._h_graph) 2qiWhZdqba b c d 1d3d4d5drbXh