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
« 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
5"""GraphDefinition: explicit CUDA graph definition."""
7from __future__ import annotations
9from libc.stddef cimport size_t
10from libc.stdint cimport uintptr_t
12from libcpp.vector cimport vector
14from cuda.bindings cimport cydriver
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
27from typing import TYPE_CHECKING
29from cuda.core._utils.cuda_utils import driver
31from cuda.core.typing import GraphMemoryType
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 )
61__all__ = ['GraphCondition', 'GraphDefinition']
64cdef class GraphCondition:
65 """A condition variable for conditional graph nodes.
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``.
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 """
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
86 def __repr__(self) -> str:
87 return f"<GraphCondition handle=0x{<unsigned long long>self._c_handle:x}>" 2a b c d vi
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
94 def __hash__(self) -> int:
95 return hash(<unsigned long long>self._c_handle) 2wixiyizinioi
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
103cdef class GraphDefinition:
104 """A graph definition.
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.
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 """
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
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
131 def __repr__(self) -> str:
132 return f"<GraphDefinition handle=0x{as_intptr(self._h_graph):x}>" 2fdpbkda b c d rbsbtbRb5b=bccdc6bAi
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 )
142 def __hash__(self) -> int:
143 return hash(<uintptr_t>self._h_graph.get()) 2QbBiCiDiEilimi
145 @property
146 def is_valid(self) -> bool:
147 """Whether this graph definition remains valid."""
148 return as_intptr(self._h_graph) != 0 2Rb7d
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
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).
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
168 def deallocate(self, dptr: int) -> FreeNode:
169 """Add an entry-point memory free node (no dependencies).
171 See :meth:`GraphNode.deallocate` for full documentation.
172 """
173 return self._entry.deallocate(dptr) 2Ef
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).
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 )
193 def launch(self, config not None: LaunchConfig, kernel not None: Kernel, *args) -> KernelNode:
194 """Add an entry-point kernel launch node (no dependencies).
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
200 def empty(self) -> EmptyNode:
201 """Add an entry-point empty node (no dependencies).
203 Returns
204 -------
205 EmptyNode
206 A new EmptyNode with no dependencies.
207 """
208 return self._entry.join() 2fcgcB nbobC yfBbGfHf1f2f3f4f5fRb6f7f8f|bbc6bec7d
210 def join(self, *nodes: GraphNode) -> EmptyNode:
211 """Create an empty node that depends on all given nodes.
213 Parameters
214 ----------
215 *nodes : GraphNode
216 Nodes to merge.
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
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).
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
232 def embed(self, GraphDefinition child not None: GraphDefinition) -> ChildGraphNode:
233 """Add an entry-point child graph node (no dependencies).
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
239 def record(self, event not None: Event) -> EventRecordNode:
240 """Add an entry-point event record node (no dependencies).
242 See :meth:`GraphNode.record` for full documentation.
243 """
244 return self._entry.record(event) 2qcKfMfVdMcRf;f_fbgn igpgwgDgKgRgYg5g
246 def wait(self, event not None: Event) -> EventWaitNode:
247 """Add an entry-point event wait node (no dependencies).
249 See :meth:`GraphNode.wait` for full documentation.
250 """
251 return self._entry.wait(event) 2OfSf?b#fDb_b}b=f`fcgn jgqgxgEgLgSgZg6g
253 def callback(self, fn, *, user_data=None) -> HostCallbackNode:
254 """Add an entry-point host callback node (no dependencies).
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
260 def create_condition(self, default_value: int | None = None) -> GraphCondition:
261 """Create a condition variable for use with conditional nodes.
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``.
267 Parameters
268 ----------
269 default_value : int, optional
270 The default value to assign to the condition.
271 If None, no default is assigned.
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
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
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))
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
295 def if_then(self, GraphCondition condition not None: GraphCondition) -> IfNode:
296 """Add an entry-point if-conditional node (no dependencies).
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
302 def if_else(self, GraphCondition condition not None: GraphCondition) -> IfElseNode:
303 """Add an entry-point if-else conditional node (no dependencies).
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
309 def while_loop(self, GraphCondition condition not None: GraphCondition) -> WhileNode:
310 """Add an entry-point while-loop conditional node (no dependencies).
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
316 def switch(self, GraphCondition condition not None: GraphCondition, unsigned int count) -> SwitchNode:
317 """Add an entry-point switch conditional node (no dependencies).
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
323 def instantiate(self, options: GraphCompleteOptions | None = None) -> Graph:
324 """Instantiate the graph definition into an executable Graph.
326 Parameters
327 ----------
328 options : :obj:`~graph.GraphCompleteOptions`, optional
329 Customizable dataclass for graph instantiation options.
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
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
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.
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
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
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
365 def nodes(self) -> set[GraphNode]:
366 """Return all nodes in the graph.
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
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
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
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
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
389 def edges(self) -> set[tuple[GraphNode, GraphNode]]:
390 """Return all edges in the graph as (from_node, to_node) pairs.
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
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))
411 if num_edges == 0: 2gdhdNhOhidjdPhB nbobC q r s t u o w v
412 return set() 2NhOhPhnbobw
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))
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 }
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