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

131 statements  

« prev     ^ index     » next       coverage.py v7.16.2, created at 2026-10-16 01:23 +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 cuda.core._device import Device 

35 from cuda.core._event import Event 

36 from cuda.core._launch_config import LaunchConfig 

37 from cuda.core._memory._buffer import Buffer 

38 from cuda.core._module import Kernel 

39 from cuda.core.graph._graph_builder import ( 

40 Graph, 

41 GraphCompleteOptions, 

42 GraphDebugPrintOptions, 

43 ) 

44 from cuda.core.graph._subclasses import ( 

45 AllocNode, 

46 ChildGraphNode, 

47 EmptyNode, 

48 EventRecordNode, 

49 EventWaitNode, 

50 FreeNode, 

51 HostCallbackNode, 

52 IfElseNode, 

53 IfNode, 

54 KernelNode, 

55 MemcpyNode, 

56 MemsetNode, 

57 SwitchNode, 

58 WhileNode, 

59 ) 

60  

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

62  

63  

64cdef class GraphCondition: 

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

66  

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

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

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

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

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

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

73  

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

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

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

77 condition. 

78 """ 

79  

80 @staticmethod 

81 cdef GraphCondition _from_handle(cydriver.CUgraphConditionalHandle c_handle): 

82 cdef GraphCondition self = GraphCondition.__new__(GraphCondition) 2UbShAbThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!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 lbVbmbx y z A i j k l e f g h a b c d m -h.hEb2 3 4 5 Fb6 7 8 9 Gb! # $ % n Hb' ( ) * Ib+ , - . Jb/ : ; = Kb? @ [ ] Lb^ _ ` { Mb| } ~ abNbbbcbdbebObfbgbhbib

83 self._c_handle = c_handle 2UbShAbThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!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 lbVbmbx y z A i j k l e f g h a b c d m -h.hEb2 3 4 5 Fb6 7 8 9 Gb! # $ % n Hb' ( ) * Ib+ , - . Jb/ : ; = Kb? @ [ ] Lb^ _ ` { Mb| } ~ abNbbbcbdbebObfbgbhbib

84 return self 2UbShAbThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!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 lbVbmbx y z A i j k l e f g h a b c d m -h.hEb2 3 4 5 Fb6 7 8 9 Gb! # $ % n Hb' ( ) * Ib+ , - . Jb/ : ; = Kb? @ [ ] Lb^ _ ` { Mb| } ~ abNbbbcbdbebObfbgbhbib

85  

86 def __repr__(self) -> str: 

87 return f"<GraphCondition handle=0x{<unsigned long long>self._c_handle:x}>" 2a b c d vi

88  

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

90 if not isinstance(other, GraphCondition): 2qirisiti'b(bsd)b/h:huinioi

91 return NotImplemented 2/h:h

92 return self._c_handle == (<GraphCondition>other)._c_handle 2qirisiti'b(bsd)b/huinioi

93  

94 def __hash__(self) -> int: 

95 return hash(<unsigned long long>self._c_handle) 2wixiyizinioi

96  

97 @property 

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

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

100 return <unsigned long long>self._c_handle 2UbShAbThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h

101  

102  

103cdef class GraphDefinition: 

104 """A graph definition. 

105  

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

107 and specifying dependencies. Once construction is complete, call 

108 instantiate() to obtain an executable Graph. 

109  

110 Notes 

111 ----- 

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

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

114 externally synchronized. 

115 """ 

116  

117 def __init__(self): 

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

119 cdef cydriver.CUgraph graph = NULL 2fcgcbecedeeefegep PbWbybheieje;htdkeleme#gQhhcicjckclcneoepeqerevbseB mcncocpc*bqcrcsc=h?htcucvcwcxc+b,b-b.byczcAcBc@hDhEhFhCcDcEcudvdwdnbobC teuevewexdydxeyezeAeBeE F CezdDeEeFeGeG H HeIeAdBdJeKeLeMeNeI J OeCdPeQeReSeK L TeUeVe[hDdWeXeYeZe0eEd1e2e3e4eFdGd5e6e7e8e9eM N !eHd#e$e%e'eO P (e)eIdJd*e+e,e-e.eQ R /eKd:e;e=e?eS T @e[eLdMd]e^e_e`e{eU V |eNd}e~eafbfW X cfdfOdPdefffgfhfifY Z jfQdkflfmfnf0 1 ofpfqfRdrfsftfufvfSdwfxfyfzfAfBfTdCfDflb]h^h_h`hVb{hBbEfFf|h}hGfHfIfFcmbGcJfHcx y z A i j k l UdIcJcKcwbpbLcQbqbkde f g h a b c d KfLfMfVdMcNfOfPfQfRfSfTfWdUfNcOcPcXdVfQcYdRcWfXfYfScTcZdZfUcVcWc/b:b0d1d;brbxbXcsbYcm tbub0fq r s t u 1f2f3f4fo 5fRbw 6f7fv 8f5b=b9fD Zc?b0c1c2c3c4c5c6c7c@b[b]b!f#f$f%f'f(f)f*f+f,f2d3dzbCbDbXbYbZb0b1b2b3b4bSbTb8c9c!c#c$c%c'c(c^b)cjb*c_b+c,c-c.c/c:c;c=c`b{b|b?ckb@c}b[c]c^c_c`c{c|c}c~bacbccc-f.f~cad/fldmdbdcddc6becddednd:f4dEb5d;f=f?f~h@f2 3 [f6d]f$g4 5 7d^f8dFb9d_f`f{fai|f6 7 }f!d~f%g8 9 ag#dGb$dbgcgdgbieg! # fg%dgg'g$ % n hg'dHb(digjgkgcilg' ( mg)dng(g) * og*dIb+dpgqgrgdisg+ , tg,dug)g- . vg-dJb.dwgxgygeizg/ : Ag/dBg*g; = Cg:dKb;dDgEgFgfiGg? @ Hg=dIg+g[ ] Jg?dLb@dKgLgMggiNg^ _ Og[dPg,g` { Qg]dMb^dRgSgTghiUg| } Vg_dWg-g~ abXg`dNb{dYgZg0gii1gbbcb2g|d3g.gdbeb4g}dOb~d5g6g7gji8gfbgb9gae!g/ghbib

120 with nogil: 2fcgcbecedeeefegep PbWbybheieje;htdkeleme#gQhhcicjckclcneoepeqerevbseB mcncocpc*bqcrcsc=h?htcucvcwcxc+b,b-b.byczcAcBc@hDhEhFhCcDcEcudvdwdnbobC teuevewexdydxeyezeAeBeE F CezdDeEeFeGeG H HeIeAdBdJeKeLeMeNeI J OeCdPeQeReSeK L TeUeVe[hDdWeXeYeZe0eEd1e2e3e4eFdGd5e6e7e8e9eM N !eHd#e$e%e'eO P (e)eIdJd*e+e,e-e.eQ R /eKd:e;e=e?eS T @e[eLdMd]e^e_e`e{eU V |eNd}e~eafbfW X cfdfOdPdefffgfhfifY Z jfQdkflfmfnf0 1 ofpfqfRdrfsftfufvfSdwfxfyfzfAfBfTdCfDflb]h^h_h`hVb{hBbEfFf|h}hGfHfIfFcmbGcJfHcx y z A i j k l UdIcJcKcwbpbLcQbqbkde f g h a b c d KfLfMfVdMcNfOfPfQfRfSfTfWdUfNcOcPcXdVfQcYdRcWfXfYfScTcZdZfUcVcWc/b:b0d1d;brbxbXcsbYcm tbub0fq r s t u 1f2f3f4fo 5fRbw 6f7fv 8f5b=b9fD Zc?b0c1c2c3c4c5c6c7c@b[b]b!f#f$f%f'f(f)f*f+f,f2d3dzbCbDbXbYbZb0b1b2b3b4bSbTb8c9c!c#c$c%c'c(c^b)cjb*c_b+c,c-c.c/c:c;c=c`b{b|b?ckb@c}b[c]c^c_c`c{c|c}c~bacbccc-f.f~cad/fldmdbdcddc6becddednd:f4dEb5d;f=f?f~h@f2 3 [f6d]f$g4 5 7d^f8dFb9d_f`f{fai|f6 7 }f!d~f%g8 9 ag#dGb$dbgcgdgbieg! # fg%dgg'g$ % n hg'dHb(digjgkgcilg' ( mg)dng(g) * og*dIb+dpgqgrgdisg+ , tg,dug)g- . vg-dJb.dwgxgygeizg/ : Ag/dBg*g; = Cg:dKb;dDgEgFgfiGg? @ Hg=dIg+g[ ] Jg?dLb@dKgLgMggiNg^ _ Og[dPg,g` { Qg]dMb^dRgSgTghiUg| } Vg_dWg-g~ abXg`dNb{dYgZg0gii1gbbcb2g|d3g.gdbeb4g}dOb~d5g6g7gji8gfbgb9gae!g/ghbib

121 HANDLE_RETURN(cydriver.cuGraphCreate(&graph, 0)) 2fcgcbecedeeefegep PbWbybheieje;htdkeleme#gQhhcicjckclcneoepeqerevbseB mcncocpc*bqcrcsc=h?htcucvcwcxc+b,b-b.byczcAcBc@hDhEhFhCcDcEcudvdwdnbobC teuevewexdydxeyezeAeBeE F CezdDeEeFeGeG H HeIeAdBdJeKeLeMeNeI J OeCdPeQeReSeK L TeUeVe[hDdWeXeYeZe0eEd1e2e3e4eFdGd5e6e7e8e9eM N !eHd#e$e%e'eO P (e)eIdJd*e+e,e-e.eQ R /eKd:e;e=e?eS T @e[eLdMd]e^e_e`e{eU V |eNd}e~eafbfW X cfdfOdPdefffgfhfifY Z jfQdkflfmfnf0 1 ofpfqfRdrfsftfufvfSdwfxfyfzfAfBfTdCfDflb]h^h_h`hVb{hBbEfFf|h}hGfHfIfFcmbGcJfHcx y z A i j k l UdIcJcKcwbpbLcQbqbkde f g h a b c d KfLfMfVdMcNfOfPfQfRfSfTfWdUfNcOcPcXdVfQcYdRcWfXfYfScTcZdZfUcVcWc/b:b0d1d;brbxbXcsbYcm tbub0fq r s t u 1f2f3f4fo 5fRbw 6f7fv 8f5b=b9fD Zc?b0c1c2c3c4c5c6c7c@b[b]b!f#f$f%f'f(f)f*f+f,f2d3dzbCbDbXbYbZb0b1b2b3b4bSbTb8c9c!c#c$c%c'c(c^b)cjb*c_b+c,c-c.c/c:c;c=c`b{b|b?ckb@c}b[c]c^c_c`c{c|c}c~bacbccc-f.f~cad/fldmdbdcddc6becddednd:f4dEb5d;f=f?f~h@f2 3 [f6d]f$g4 5 7d^f8dFb9d_f`f{fai|f6 7 }f!d~f%g8 9 ag#dGb$dbgcgdgbieg! # fg%dgg'g$ % n hg'dHb(digjgkgcilg' ( mg)dng(g) * og*dIb+dpgqgrgdisg+ , tg,dug)g- . vg-dJb.dwgxgygeizg/ : Ag/dBg*g; = Cg:dKb;dDgEgFgfiGg? @ Hg=dIg+g[ ] Jg?dLb@dKgLgMggiNg^ _ Og[dPg,g` { Qg]dMb^dRgSgTghiUg| } Vg_dWg-g~ abXg`dNb{dYgZg0gii1gbbcb2g|d3g.gdbeb4g}dOb~d5g6g7gji8gfbgb9gae!g/ghbib

122 self._h_graph = create_graph_handle(graph) 2fcgcbecedeeefegep PbWbybheieje;htdkeleme#gQhhcicjckclcneoepeqerevbseB mcncocpc*bqcrcsc=h?htcucvcwcxc+b,b-b.byczcAcBc@hDhEhFhCcDcEcudvdwdnbobC teuevewexdydxeyezeAeBeE F CezdDeEeFeGeG H HeIeAdBdJeKeLeMeNeI J OeCdPeQeReSeK L TeUeVe[hDdWeXeYeZe0eEd1e2e3e4eFdGd5e6e7e8e9eM N !eHd#e$e%e'eO P (e)eIdJd*e+e,e-e.eQ R /eKd:e;e=e?eS T @e[eLdMd]e^e_e`e{eU V |eNd}e~eafbfW X cfdfOdPdefffgfhfifY Z jfQdkflfmfnf0 1 ofpfqfRdrfsftfufvfSdwfxfyfzfAfBfTdCfDflb]h^h_h`hVb{hBbEfFf|h}hGfHfIfFcmbGcJfHcx y z A i j k l UdIcJcKcwbpbLcQbqbkde f g h a b c d KfLfMfVdMcNfOfPfQfRfSfTfWdUfNcOcPcXdVfQcYdRcWfXfYfScTcZdZfUcVcWc/b:b0d1d;brbxbXcsbYcm tbub0fq r s t u 1f2f3f4fo 5fRbw 6f7fv 8f5b=b9fD Zc?b0c1c2c3c4c5c6c7c@b[b]b!f#f$f%f'f(f)f*f+f,f2d3dzbCbDbXbYbZb0b1b2b3b4bSbTb8c9c!c#c$c%c'c(c^b)cjb*c_b+c,c-c.c/c:c;c=c`b{b|b?ckb@c}b[c]c^c_c`c{c|c}c~bacbccc-f.f~cad/fldmdbdcddc6becddednd:f4dEb5d;f=f?f~h@f2 3 [f6d]f$g4 5 7d^f8dFb9d_f`f{fai|f6 7 }f!d~f%g8 9 ag#dGb$dbgcgdgbieg! # fg%dgg'g$ % n hg'dHb(digjgkgcilg' ( mg)dng(g) * og*dIb+dpgqgrgdisg+ , tg,dug)g- . vg-dJb.dwgxgygeizg/ : Ag/dBg*g; = Cg:dKb;dDgEgFgfiGg? @ Hg=dIg+g[ ] Jg?dLb@dKgLgMggiNg^ _ Og[dPg,g` { Qg]dMb^dRgSgTghiUg| } Vg_dWg-g~ abXg`dNb{dYgZg0gii1gbbcb2g|d3g.gdbeb4g}dOb~d5g6g7gji8gfbgb9gae!g/ghbib

123  

124 @staticmethod 

125 cdef GraphDefinition _from_handle(GraphHandle h_graph): 

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

127 cdef GraphDefinition g = GraphDefinition.__new__(GraphDefinition) 2UbAbodpdqdkip vbrdE F G H 7bI J K L GhHhIhJhKhLhM N O P Q R S T U V W X Y Z 0 1 x y z A i j k l fdwbpbQbqbe f g h a b c d rbxbsbm tbubRbD ]bzb8bjbkb9b!b#b$b%b2 3 4 5 6 7 8 9 ! # $ % n ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbib

128 g._h_graph = h_graph 2UbAbodpdqdkip vbrdE F G H 7bI J K L GhHhIhJhKhLhM N O P Q R S T U V W X Y Z 0 1 x y z A i j k l fdwbpbQbqbe f g h a b c d rbxbsbm tbubRbD ]bzb8bjbkb9b!b#b$b%b2 3 4 5 6 7 8 9 ! # $ % n ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbib

129 return g 2UbAbodpdqdkip vbrdE F G H 7bI J K L GhHhIhJhKhLhM N O P Q R S T U V W X Y Z 0 1 x y z A i j k l fdwbpbQbqbe f g h a b c d rbxbsbm tbubRbD ]bzb8bjbkb9b!b#b$b%b2 3 4 5 6 7 8 9 ! # $ % n ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbib

130  

131 def __repr__(self) -> str: 

132 return f"<GraphDefinition handle=0x{as_intptr(self._h_graph):x}>" 2fdpbkda b c d rbsbtbRb5b=bccdc6bAi

133  

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

135 if not isinstance(other, GraphDefinition): 27b'b(b)bGhHhIhJhKhLhQbD Rh:hpilimi

136 return NotImplemented 2Rh:h

137 return ( 27b'b(b)bGhHhIhJhKhLhQbD Rhpilimi

138 <uintptr_t>self._h_graph.get() 

139 == <uintptr_t>(<GraphDefinition>other)._h_graph.get() 27b'b(b)bGhHhIhJhKhLhQbD Rhpilimi

140 ) 

141  

142 def __hash__(self) -> int: 

143 return hash(<uintptr_t>self._h_graph.get()) 2QbBiCiDiEilimi

144  

145 @property 

146 def is_valid(self) -> bool: 

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

148 return as_intptr(self._h_graph) != 0 2Rb7d

149  

150 @property 

151 def _entry(self) -> GraphNode: 

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

153 GD_check_valid(self) 2fcAbgcbecedeeefegep PbWbybheiejetdkeleme#ghcicjckclcneoepeqerevbseB mcncocpc*bqcrcsctcucvcwcxc+b,b-b.byczcAcBcCcDcEcudvdwdnbobC teuevewexdydxeyezeAeBeE F CezdDeEeFeGeG H HeIeAdBdJeKeLeMeNeI J OeCdPeQeReSeK L TeUeVeDdWeXeYeZe0eEd1e2e3e4eFdGd5e6e7e8e9eM N !eHd#e$e%e'eO P (e)eIdJd*e+e,e-e.eQ R /eKd:e;e=e?eS T @e[eLdMd]e^e_e`e{eU V |eNd}e~eafbfW X cfdfOdPdefffgfhfifY Z jfQdkflfmfnf0 1 ofpfqfRdrfsftfufvfSdwfxfyfzfAfBfTdCfDflbBbEfFfGfHfIfFcmbGcJfHcx y z A i j k l UdIcJcKcwbpbLcQbqbkde f g h a b c d KfLfMfVdMcNfOfPfQfRfSfTfWdUfNcOcPcXdVfQcYdRcWfXfYfScTcZdZfUcVcWc/b:b0d1d;brbxbXcsbYcm tbub0fq r s t u 1f2f3f4fo 5fRbw 6f7fv 8f5b=b9fD Zc?b0c1c2c3c4c5c6c7c@b[b]b!f#f$f%f'f(f)f*f+f,f2d3dzbCbDbXbYbZb0b1b2b3b4bSbTb8c9c!c#c$c%c'c(c^b)cjb*c_b+c,c-c.c/c:c;c=c`b{b|b?ckb@c}b[c]c^c_c`c{c|c}c~bacbccc-f.f~cad/fldmdbdcddc6becddednd:f4d5d;f=f?f@f2 3 [f6d]f$g4 5 7d^f8d9d_f`f{f|f6 7 }f!d~f%g8 9 ag#d$dbgcgdgeg! # fg%dgg'g$ % n hg'd(digjgkglg' ( mg)dng(g) * og*d+dpgqgrgsg+ , tg,dug)g- . vg-d.dwgxgygzg/ : Ag/dBg*g; = Cg:d;dDgEgFgGg? @ Hg=dIg+g[ ] Jg?d@dKgLgMgNg^ _ Og[dPg,g` { Qg]d^dRgSgTgUg| } Vg_dWg-g~ abXg`d{dYgZg0g1gbbcb2g|d3g.gdbeb4g}d~d5g6g7g8gfbgb9gae!g/ghbib

154 cdef GraphNode n = GraphNode.__new__(GraphNode) 2fcAbgcbecedeeefegep PbWbybheiejetdkeleme#ghcicjckclcneoepeqerevbseB mcncocpc*bqcrcsctcucvcwcxc+b,b-b.byczcAcBcCcDcEcudvdwdnbobC teuevewexdydxeyezeAeBeE F CezdDeEeFeGeG H HeIeAdBdJeKeLeMeNeI J OeCdPeQeReSeK L TeUeVeDdWeXeYeZe0eEd1e2e3e4eFdGd5e6e7e8e9eM N !eHd#e$e%e'eO P (e)eIdJd*e+e,e-e.eQ R /eKd:e;e=e?eS T @e[eLdMd]e^e_e`e{eU V |eNd}e~eafbfW X cfdfOdPdefffgfhfifY Z jfQdkflfmfnf0 1 ofpfqfRdrfsftfufvfSdwfxfyfzfAfBfTdCfDflbBbEfFfGfHfIfFcmbGcJfHcx y z A i j k l UdIcJcKcwbpbLcQbqbkde f g h a b c d KfLfMfVdMcNfOfPfQfRfSfTfWdUfNcOcPcXdVfQcYdRcWfXfYfScTcZdZfUcVcWc/b:b0d1d;brbxbXcsbYcm tbub0fq r s t u 1f2f3f4fo 5fRbw 6f7fv 8f5b=b9fD Zc?b0c1c2c3c4c5c6c7c@b[b]b!f#f$f%f'f(f)f*f+f,f2d3dzbCbDbXbYbZb0b1b2b3b4bSbTb8c9c!c#c$c%c'c(c^b)cjb*c_b+c,c-c.c/c:c;c=c`b{b|b?ckb@c}b[c]c^c_c`c{c|c}c~bacbccc-f.f~cad/fldmdbdcddc6becddednd:f4d5d;f=f?f@f2 3 [f6d]f$g4 5 7d^f8d9d_f`f{f|f6 7 }f!d~f%g8 9 ag#d$dbgcgdgeg! # fg%dgg'g$ % n hg'd(digjgkglg' ( mg)dng(g) * og*d+dpgqgrgsg+ , tg,dug)g- . vg-d.dwgxgygzg/ : Ag/dBg*g; = Cg:d;dDgEgFgGg? @ Hg=dIg+g[ ] Jg?d@dKgLgMgNg^ _ Og[dPg,g` { Qg]d^dRgSgTgUg| } Vg_dWg-g~ abXg`d{dYgZg0g1gbbcb2g|d3g.gdbeb4g}d~d5g6g7g8gfbgb9gae!g/ghbib

155 n._h_node = create_graph_node_handle(<cydriver.CUgraphNode>NULL, self._h_graph) 2fcAbgcbecedeeefegep PbWbybheiejetdkeleme#ghcicjckclcneoepeqerevbseB mcncocpc*bqcrcsctcucvcwcxc+b,b-b.byczcAcBcCcDcEcudvdwdnbobC teuevewexdydxeyezeAeBeE F CezdDeEeFeGeG H HeIeAdBdJeKeLeMeNeI J OeCdPeQeReSeK L TeUeVeDdWeXeYeZe0eEd1e2e3e4eFdGd5e6e7e8e9eM N !eHd#e$e%e'eO P (e)eIdJd*e+e,e-e.eQ R /eKd:e;e=e?eS T @e[eLdMd]e^e_e`e{eU V |eNd}e~eafbfW X cfdfOdPdefffgfhfifY Z jfQdkflfmfnf0 1 ofpfqfRdrfsftfufvfSdwfxfyfzfAfBfTdCfDflbBbEfFfGfHfIfFcmbGcJfHcx y z A i j k l UdIcJcKcwbpbLcQbqbkde f g h a b c d KfLfMfVdMcNfOfPfQfRfSfTfWdUfNcOcPcXdVfQcYdRcWfXfYfScTcZdZfUcVcWc/b:b0d1d;brbxbXcsbYcm tbub0fq r s t u 1f2f3f4fo 5fRbw 6f7fv 8f5b=b9fD Zc?b0c1c2c3c4c5c6c7c@b[b]b!f#f$f%f'f(f)f*f+f,f2d3dzbCbDbXbYbZb0b1b2b3b4bSbTb8c9c!c#c$c%c'c(c^b)cjb*c_b+c,c-c.c/c:c;c=c`b{b|b?ckb@c}b[c]c^c_c`c{c|c}c~bacbccc-f.f~cad/fldmdbdcddc6becddednd:f4d5d;f=f?f@f2 3 [f6d]f$g4 5 7d^f8d9d_f`f{f|f6 7 }f!d~f%g8 9 ag#d$dbgcgdgeg! # fg%dgg'g$ % n hg'd(digjgkglg' ( mg)dng(g) * og*d+dpgqgrgsg+ , tg,dug)g- . vg-d.dwgxgygzg/ : Ag/dBg*g; = Cg:d;dDgEgFgGg? @ Hg=dIg+g[ ] Jg?d@dKgLgMgNg^ _ Og[dPg,g` { Qg]d^dRgSgTgUg| } Vg_dWg-g~ abXg`d{dYgZg0g1gbbcb2g|d3g.gdbeb4g}d~d5g6g7g8gfbgb9gae!g/ghbib

156 n._is_entry = True 2fcAbgcbecedeeefegep PbWbybheiejetdkeleme#ghcicjckclcneoepeqerevbseB mcncocpc*bqcrcsctcucvcwcxc+b,b-b.byczcAcBcCcDcEcudvdwdnbobC teuevewexdydxeyezeAeBeE F CezdDeEeFeGeG H HeIeAdBdJeKeLeMeNeI J OeCdPeQeReSeK L TeUeVeDdWeXeYeZe0eEd1e2e3e4eFdGd5e6e7e8e9eM N !eHd#e$e%e'eO P (e)eIdJd*e+e,e-e.eQ R /eKd:e;e=e?eS T @e[eLdMd]e^e_e`e{eU V |eNd}e~eafbfW X cfdfOdPdefffgfhfifY Z jfQdkflfmfnf0 1 ofpfqfRdrfsftfufvfSdwfxfyfzfAfBfTdCfDflbBbEfFfGfHfIfFcmbGcJfHcx y z A i j k l UdIcJcKcwbpbLcQbqbkde f g h a b c d KfLfMfVdMcNfOfPfQfRfSfTfWdUfNcOcPcXdVfQcYdRcWfXfYfScTcZdZfUcVcWc/b:b0d1d;brbxbXcsbYcm tbub0fq r s t u 1f2f3f4fo 5fRbw 6f7fv 8f5b=b9fD Zc?b0c1c2c3c4c5c6c7c@b[b]b!f#f$f%f'f(f)f*f+f,f2d3dzbCbDbXbYbZb0b1b2b3b4bSbTb8c9c!c#c$c%c'c(c^b)cjb*c_b+c,c-c.c/c:c;c=c`b{b|b?ckb@c}b[c]c^c_c`c{c|c}c~bacbccc-f.f~cad/fldmdbdcddc6becddednd:f4d5d;f=f?f@f2 3 [f6d]f$g4 5 7d^f8d9d_f`f{f|f6 7 }f!d~f%g8 9 ag#d$dbgcgdgeg! # fg%dgg'g$ % n hg'd(digjgkglg' ( mg)dng(g) * og*d+dpgqgrgsg+ , tg,dug)g- . vg-d.dwgxgygzg/ : Ag/dBg*g; = Cg:d;dDgEgFgGg? @ Hg=dIg+g[ ] Jg?d@dKgLgMgNg^ _ Og[dPg,g` { Qg]d^dRgSgTgUg| } Vg_dWg-g~ abXg`d{dYgZg0g1gbbcb2g|d3g.gdbeb4g}d~d5g6g7g8gfbgb9gae!g/ghbib

157 return n 2fcAbgcbecedeeefegep PbWbybheiejetdkeleme#ghcicjckclcneoepeqerevbseB mcncocpc*bqcrcsctcucvcwcxc+b,b-b.byczcAcBcCcDcEcudvdwdnbobC teuevewexdydxeyezeAeBeE F CezdDeEeFeGeG H HeIeAdBdJeKeLeMeNeI J OeCdPeQeReSeK L TeUeVeDdWeXeYeZe0eEd1e2e3e4eFdGd5e6e7e8e9eM N !eHd#e$e%e'eO P (e)eIdJd*e+e,e-e.eQ R /eKd:e;e=e?eS T @e[eLdMd]e^e_e`e{eU V |eNd}e~eafbfW X cfdfOdPdefffgfhfifY Z jfQdkflfmfnf0 1 ofpfqfRdrfsftfufvfSdwfxfyfzfAfBfTdCfDflbBbEfFfGfHfIfFcmbGcJfHcx y z A i j k l UdIcJcKcwbpbLcQbqbkde f g h a b c d KfLfMfVdMcNfOfPfQfRfSfTfWdUfNcOcPcXdVfQcYdRcWfXfYfScTcZdZfUcVcWc/b:b0d1d;brbxbXcsbYcm tbub0fq r s t u 1f2f3f4fo 5fRbw 6f7fv 8f5b=b9fD Zc?b0c1c2c3c4c5c6c7c@b[b]b!f#f$f%f'f(f)f*f+f,f2d3dzbCbDbXbYbZb0b1b2b3b4bSbTb8c9c!c#c$c%c'c(c^b)cjb*c_b+c,c-c.c/c:c;c=c`b{b|b?ckb@c}b[c]c^c_c`c{c|c}c~bacbccc-f.f~cad/fldmdbdcddc6becddednd:f4d5d;f=f?f@f2 3 [f6d]f$g4 5 7d^f8d9d_f`f{f|f6 7 }f!d~f%g8 9 ag#d$dbgcgdgeg! # fg%dgg'g$ % n hg'd(digjgkglg' ( mg)dng(g) * og*d+dpgqgrgsg+ , tg,dug)g- . vg-d.dwgxgygzg/ : Ag/dBg*g; = Cg:d;dDgEgFgGg? @ Hg=dIg+g[ ] Jg?d@dKgLgMgNg^ _ Og[dPg,g` { Qg]d^dRgSgTgUg| } Vg_dWg-g~ abXg`d{dYgZg0g1gbbcb2g|d3g.gdbeb4g}d~d5g6g7g8gfbgb9gae!g/ghbib

158  

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

160 memory_type: GraphMemoryType = GraphMemoryType.DEVICE, 

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

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

163  

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

165 """ 

166 return self._entry.allocate(size, device=device, memory_type=memory_type, peer_access=peer_access) 2becedeeefegePbWbybheiejetdkelememcncocpc+b,b-b.byczcAcBcCcDcEcudvdwdveweydxeyezeCezdDeEeFeGeHeIeBdJeKeLeOeCdPeQeReSeTeUeVeDdWeXeYeZe0eEd1e2e3e4eGd5e6e7e!eHd#e$e%e'e(e)eJd*e+e,e/eKd:e;e=e?e@e[eMd]e^e_e|eNd}e~eafbfcfdfPdefffgfjfQdkflfmfnfofpfqfRdrfsftfufvfSdwfxfzfAfBfTdCfDfFfIfGcLfNfPfQfTfWdv :f5d?f6d]f^f9d{f!d~fag$ddg%dggn hg(dkg)dngog+drg,dugvg.dyg/dBgCg;dFg=dIgJg@dMg[dPgQg^dTg_dWgXg{d0g|d3g4g~d7gae!g

167  

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

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

170  

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

172 """ 

173 return self._entry.deallocate(dptr) 2Ef

174  

175 def memset( 

176 self, 

177 dst: Buffer | int, 

178 value, 

179 size_t width, 

180 size_t height=1, 

181 size_t pitch=0, 

182 *, 

183 dst_owner=None, 

184 ) -> MemsetNode: 

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

186  

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

188 """ 

189 return self._entry.memset( 2/b:b0d1d;bo w @b[b2d3dSbTb^b`b{b~bacldmdnd

190 dst, value, width, height=height, pitch=pitch, dst_owner=dst_owner 2/b:b0d1d;bo w @b[b2d3dSbTb^b`b{b~bacldmdnd

191 ) 

192  

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

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

195  

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

197 """ 

198 return self._entry.launch(config, kernel, *args) 2Ab*btcucvcwcxcteuexdAdFdIdLdOdFci j k l wbPcXdVfQcYdRcxbq r s t u o 2c3c4c'f(f)fZb0b1b9c!c#c$c%c'c)c-c.c/c|b^c_c`c-f.fbddd4d[f8d}f#dfgn 'dmg*dtg-dAg:dHg?dOg]dVg`d2g}d9g

199  

200 def empty(self) -> EmptyNode: 

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

202  

203 Returns 

204 ------- 

205 EmptyNode 

206 A new EmptyNode with no dependencies. 

207 """ 

208 return self._entry.join() 2fcgcB nbobC yfBbGfHf1f2f3f4f5fRb6f7f8f|bbc6bec7d

209  

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

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

212  

213 Parameters 

214 ---------- 

215 *nodes : GraphNode 

216 Nodes to merge. 

217  

218 Returns 

219 ------- 

220 EmptyNode 

221 A new EmptyNode that depends on all input nodes. 

222 """ 

223 return self._entry.join(*nodes) 2td+b,b-b.budvdwdydzdBdCdDdEdGdHdJdKdMdNdPdQdRdSdTdWdq r s t u 5d6d9d!d$d%dn (d)d+d,d.d/d;d=d@d[d^d_d{d|d~dae

224  

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

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

227  

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

229 """ 

230 return self._entry.memcpy(dst, src, size, dst_owner=dst_owner, src_owner=src_owner) 2JfLcUfNcOcWfXfYfScTcZdZfUcVcWc5c6c7c*f+f,f2b3b4b(c:c;c=c{c|c}c~cad/fldmdnd

231  

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

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

234  

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

236 """ 

237 return self._entry.embed(child) 2vb*bxdAdFdIdLdOdwbpbQbqbkdrbxbsbtbub5bD ]bzbjbkb4d8d#dn 'd*d-d:d?d]d`d}d

238  

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

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

241  

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

243 """ 

244 return self._entry.record(event) 2qcKfMfVdMcRf;f_fbgn igpgwgDgKgRgYg5g

245  

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

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

248  

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

250 """ 

251 return self._entry.wait(event) 2OfSf?b#fDb_b}b=f`fcgn jgqgxgEgLgSgZg6g

252  

253 def callback(self, fn, *, user_data=None) -> HostCallbackNode: 

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

255  

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

257 """ 

258 return self._entry.callback(fn, user_data=user_data) 2hcicjckclcneoepeqerevbsercscAeBeMeNe8e9e-e.e`e{ehfifHcUdIcJcKcpbqbkde f g h a b c d rbXcsbYctbub0f5b=b9fD Zc?b0c1c]b!f$f%fzbCbXbYb8cjb*c_b+c,c?ckb@c}b[c]cbccccddc6beced@f|fegn lgsgzgGgNgUg1g8g

259  

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

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

262  

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

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

265 via ``cudaGraphSetConditional``. 

266  

267 Parameters 

268 ---------- 

269 default_value : int, optional 

270 The default value to assign to the condition. 

271 If None, no default is assigned. 

272  

273 Returns 

274 ------- 

275 GraphCondition 

276 A condition variable for controlling conditional execution. 

277 """ 

278 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 lbVbmbx y z A i j k l e f g h a b c d m Eb2 3 4 5 Fb6 7 8 9 Gb! # $ % n Hb' ( ) * Ib+ , - . Jb/ : ; = Kb? @ [ ] Lb^ _ ` { Mb| } ~ abNbbbcbdbebObfbgbhbib

279 cdef cydriver.CUgraphConditionalHandle c_handle 

280 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 lbVbmbx y z A i j k l e f g h a b c d m Eb2 3 4 5 Fb6 7 8 9 Gb! # $ % n Hb' ( ) * Ib+ , - . Jb/ : ; = Kb? @ [ ] Lb^ _ ` { Mb| } ~ abNbbbcbdbebObfbgbhbib

281 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 lbVbmbx y z A i j k l e f g h a b c d m Eb2 3 4 5 Fb6 7 8 9 Gb! # $ % n Hb' ( ) * Ib+ , - . Jb/ : ; = Kb? @ [ ] Lb^ _ ` { Mb| } ~ abNbbbcbdbebObfbgbhbib

282  

283 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 lbVbmbx y z A i j k l e f g h a b c d m Eb2 3 4 5 Fb6 7 8 9 Gb! # $ % n Hb' ( ) * Ib+ , - . Jb/ : ; = Kb? @ [ ] Lb^ _ ` { Mb| } ~ abNbbbcbdbebObfbgbhbib

284 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 lbmbx y z A i j k l e f g h a b c d m Eb2 3 4 5 Fb6 7 8 9 Gb! # $ % n Hb' ( ) * Ib+ , - . Jb/ : ; = Kb? @ [ ] Lb^ _ ` { Mb| } ~ abNbbbcbdbebObfbgbhbib

285 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 lbmbx y z A i j k l e f g h a b c d m Eb2 3 4 5 Fb6 7 8 9 Gb! # $ % n Hb' ( ) * Ib+ , - . Jb/ : ; = Kb? @ [ ] Lb^ _ ` { Mb| } ~ abNbbbcbdbebObfbgbhbib

286  

287 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 lbVbmbx y z A i j k l e f g h a b c d m Eb2 3 4 5 Fb6 7 8 9 Gb! # $ % n Hb' ( ) * Ib+ , - . Jb/ : ; = Kb? @ [ ] Lb^ _ ` { Mb| } ~ abNbbbcbdbebObfbgbhbib

288 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 lbVbmbx y z A i j k l e f g h a b c d m Eb2 3 4 5 Fb6 7 8 9 Gb! # $ % n Hb' ( ) * Ib+ , - . Jb/ : ; = Kb? @ [ ] Lb^ _ ` { Mb| } ~ abNbbbcbdbebObfbgbhbib

289 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 lbVbmbx y z A i j k l e f g h a b c d m Eb2 3 4 5 Fb6 7 8 9 Gb! # $ % n Hb' ( ) * Ib+ , - . Jb/ : ; = Kb? @ [ ] Lb^ _ ` { Mb| } ~ abNbbbcbdbebObfbgbhbib

290 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 lbVbmbx y z A i j k l e f g h a b c d m Eb2 3 4 5 Fb6 7 8 9 Gb! # $ % n Hb' ( ) * Ib+ , - . Jb/ : ; = Kb? @ [ ] Lb^ _ ` { Mb| } ~ abNbbbcbdbebObfbgbhbib

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

292  

293 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 lbVbmbx y z A i j k l e f g h a b c d m Eb2 3 4 5 Fb6 7 8 9 Gb! # $ % n Hb' ( ) * Ib+ , - . Jb/ : ; = Kb? @ [ ] Lb^ _ ` { Mb| } ~ abNbbbcbdbebObfbgbhbib

294  

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

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

297  

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

299 """ 

300 return self._entry.if_then(condition) 2p F J N R V Z lbx i e a 3 7 # n ( , : @ _ } cbgb

301  

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

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

304  

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

306 """ 

307 return self._entry.if_else(condition) 2E I M Q U Y y j f b 2 6 ! n ' + / ? ^ | bbfb

308  

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

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

311  

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

313 """ 

314 return self._entry.while_loop(condition) 2H L P T X 1 A l h d m 5 9 % n * . = ] { abebib

315  

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

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

318  

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

320 """ 

321 return self._entry.switch(condition, count) 2G K O S W 0 mbz k g c 4 8 $ n ) - ; [ ` ~ dbhb

322  

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

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

325  

326 Parameters 

327 ---------- 

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

329 Customizable dataclass for graph instantiation options. 

330  

331 Returns 

332 ------- 

333 Graph 

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

335 """ 

336 GD_check_valid(self) 2fcgchcicjckclcmcncocpc*bqcrcsctcucvcwcxc+b,b-b.byczcAcBcDhEhFhCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWc/b:b;bXcYcq r s t u o Rbv 5b=bD Zc?b0c1c2c3c4c5c6c7c@b[b8c9c!c#c$c%c8b'c(c^b)cjb*c_b+c,c-c.c/c:c;c=c`b{b|b?ckb@c}b[c]c^c_c`c{c|c}c~bacbccc~cad9b!b#b$b%bbdcddc6becdded

337 from cuda.core.graph._graph_builder import _instantiate_graph 2fcgchcicjckclcmcncocpc*bqcrcsctcucvcwcxc+b,b-b.byczcAcBcDhEhFhCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWc/b:b;bXcYcq r s t u o v 5b=bD Zc?b0c1c2c3c4c5c6c7c@b[b8c9c!c#c$c%c8b'c(c^b)cjb*c_b+c,c-c.c/c:c;c=c`b{b|b?ckb@c}b[c]c^c_c`c{c|c}c~bacbccc~cad9b!b#b$b%bbdcddc6becdded

338  

339 return _instantiate_graph(self, options) 2fcgchcicjckclcmcncocpc*bqcrcsctcucvcwcxc+b,b-b.byczcAcBcDhEhFhCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWc/b:b;bXcYcq r s t u o v 5b=bD Zc?b0c1c2c3c4c5c6c7c@b[b8c9c!c#c$c%c8b'c(c^b)cjb*c_b+c,c-c.c/c:c;c=c`b{b|b?ckb@c}b[c]c^c_c`c{c|c}c~bacbccc~cad9b!b#b$b%bbdcddc6becdded

340  

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

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

343  

344 Parameters 

345 ---------- 

346 path : str 

347 File path for the DOT output. 

348 options : GraphDebugPrintOptions, optional 

349 Customizable options for the debug print. 

350 """ 

351 GD_check_valid(self) 2PbWbyb

352 from cuda.core.graph._graph_builder import GraphDebugPrintOptions 2PbWbyb

353  

354 cdef unsigned int flags = 0 2PbWbyb

355 if options is not None: 2PbWbyb

356 if not isinstance(options, GraphDebugPrintOptions): 2Wbyb

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

358 flags = options._to_flags() 2yb

359  

360 cdef bytes path_bytes = path.encode('utf-8') 2Pbyb

361 cdef const char* c_path = path_bytes 2Pbyb

362 with nogil: 2Pbyb

363 HANDLE_RETURN(cydriver.cuGraphDebugDotPrint(as_cu(self._h_graph), c_path, flags)) 2Pbyb

364  

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

366 """Return all nodes in the graph. 

367  

368 Returns 

369 ------- 

370 set of GraphNode 

371 All nodes in the graph. 

372 """ 

373 GD_check_valid(self) 2UbAbodpdqdp vbB C rd:g;g7b=g?g@g[g'b(b]g^g_g`g{g|gsd)b}g~gahMhbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChBbx y z A i j k l fdwbpbqbe f g h a b c d rbxbsbm tbubq r s t u o Rbw v D zbCbDbXbYbZb0b1b2b3b4bSbTb8bjbkb9b!b#b$b%b

374 cdef vector[cydriver.CUgraphNode] nodes_vec 

375 cdef size_t num_nodes = 0 2UbAbodpdqdp vbB C rd:g;g7b=g?g@g[g'b(b]g^g_g`g{g|gsd)b}g~gahMhbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChBbx y z A i j k l fdwbpbqbe f g h a b c d rbxbsbm tbubq r s t u o w v D zbCbDbXbYbZb0b1b2b3b4bSbTb8bjbkb9b!b#b$b%b

376  

377 with nogil: 2UbAbodpdqdp vbB C rd:g;g7b=g?g@g[g'b(b]g^g_g`g{g|gsd)b}g~gahMhbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChBbx y z A i j k l fdwbpbqbe f g h a b c d rbxbsbm tbubq r s t u o w v D zbCbDbXbYbZb0b1b2b3b4bSbTb8bjbkb9b!b#b$b%b

378 HANDLE_RETURN(cydriver.cuGraphGetNodes(as_cu(self._h_graph), NULL, &num_nodes)) 2UbAbodpdqdp vbB C rd:g;g7b=g?g@g[g'b(b]g^g_g`g{g|gsd)b}g~gahMhbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChBbx y z A i j k l fdwbpbqbe f g h a b c d rbxbsbm tbubq r s t u o w v D zbCbDbXbYbZb0b1b2b3b4bSbTb8bjbkb9b!b#b$b%b

379  

380 if num_nodes == 0: 2UbAbodpdqdp vbB C rd:g;g7b=g?g@g[g'b(b]g^g_g`g{g|gsd)b}g~gahMhbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChBbx y z A i j k l fdwbpbqbe f g h a b c d rbxbsbm tbubq r s t u o w v D zbCbDbXbYbZb0b1b2b3b4bSbTb8bjbkb9b!b#b$b%b

381 return set() 2AbMhx y z A m zbXbYbZb0b1b2b3b4bSbTb

382  

383 nodes_vec.resize(num_nodes) 2Ubodpdqdp vbB C rd:g;g7b=g?g@g[g'b(b]g^g_g`g{g|gsd)b}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChBbi j k l fdwbpbqbe f g h a b c d rbxbsbm tbubq r s t u o w v D CbDb8bjbkb9b!b#b$b%b

384 with nogil: 2Ubodpdqdp vbB C rd:g;g7b=g?g@g[g'b(b]g^g_g`g{g|gsd)b}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChBbi j k l fdwbpbqbe f g h a b c d rbxbsbm tbubq r s t u o w v D CbDb8bjbkb9b!b#b$b%b

385 HANDLE_RETURN(cydriver.cuGraphGetNodes(as_cu(self._h_graph), nodes_vec.data(), &num_nodes)) 2Ubodpdqdp vbB C rd:g;g7b=g?g@g[g'b(b]g^g_g`g{g|gsd)b}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChBbi j k l fdwbpbqbe f g h a b c d rbxbsbm tbubq r s t u o w v D CbDb8bjbkb9b!b#b$b%b

386  

387 return {GraphNode._create(self._h_graph, nodes_vec[i]) for i in range(num_nodes)} 2Ubodpdqdp vbB C rd:g;g7b=g?g@g[g'b(b]g^g_g`g{g|gsd)b}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChBbi j k l fdwbpbqbe f g h a b c d rbxbsbm tbubq r s t u o w v D CbDb8bjbkb9b!b#b$b%b

388  

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

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

391  

392 Returns 

393 ------- 

394 set of tuple 

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

396 a dependency edge in the graph. 

397 """ 

398 GD_check_valid(self) 2gdhdNhOhidjdPhB nbobC q r s t u o w v

399 cdef vector[cydriver.CUgraphNode] from_nodes 

400 cdef vector[cydriver.CUgraphNode] to_nodes 

401 cdef size_t num_edges = 0 2gdhdNhOhidjdPhB nbobC q r s t u o w v

402  

403 with nogil: 2gdhdNhOhidjdPhB nbobC q r s t u o w v

404 IF CUDA_CORE_BUILD_MAJOR >= 13: 

405 HANDLE_RETURN(cydriver.cuGraphGetEdges( 2gdhdNhOhidjdPhB nbobC q r s t u o w v

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

407 ELSE: 

408 HANDLE_RETURN(cydriver.cuGraphGetEdges( 

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

410  

411 if num_edges == 0: 2gdhdNhOhidjdPhB nbobC q r s t u o w v

412 return set() 2NhOhPhnbobw

413  

414 from_nodes.resize(num_edges) 2gdhdidjdB nbobC q r s t u o w v

415 to_nodes.resize(num_edges) 2gdhdidjdB nbobC q r s t u o w v

416 with nogil: 2gdhdidjdB nbobC q r s t u o w v

417 IF CUDA_CORE_BUILD_MAJOR >= 13: 

418 HANDLE_RETURN(cydriver.cuGraphGetEdges( 2gdhdidjdB nbobC q r s t u o w v

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

420 ELSE: 

421 HANDLE_RETURN(cydriver.cuGraphGetEdges( 

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

423  

424 return { 2gdhdidjdB nbobC q r s t u o w v

425 (GraphNode._create(self._h_graph, from_nodes[i]), 2gdhdidjdB nbobC q r s t u o w v

426 GraphNode._create(self._h_graph, to_nodes[i])) 2gdhdidjdB nbobC q r s t u o w v

427 for i in range(num_edges) 2gdhdidjdB nbobC q r s t u o w v

428 } 

429  

430 @property 

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

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

433 return as_py(self._h_graph) 2kiQhUdqbe f g h VdXdYdZdubRh