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
« 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
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 collections.abc import Callable
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 )
64__all__ = ['GraphCondition', 'GraphDefinition']
67cdef class GraphCondition:
68 """A condition variable for conditional graph nodes.
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``.
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 """
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
89 def __repr__(self) -> str:
90 return f"<GraphCondition handle=0x{<unsigned long long>self._c_handle:x}>" 2Bi
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
97 def __hash__(self) -> int:
98 return hash(<unsigned long long>self._c_handle) 2CiDiEiFitiui
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
106cdef class GraphDefinition:
107 """A graph definition.
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.
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 """
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
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
134 def __repr__(self) -> str:
135 return f"<GraphDefinition handle=0x{as_intptr(self._h_graph):x}>" 2RbGi
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 )
145 def __hash__(self) -> int:
146 return hash(<uintptr_t>self._h_graph.get()) 2QbHiIiJiKirisi
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
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
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).
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
171 def deallocate(self, dptr: int) -> FreeNode:
172 """Add an entry-point memory free node (no dependencies).
174 See :meth:`GraphNode.deallocate` for full documentation.
175 """
176 return self._entry.deallocate(dptr) 2Kf
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).
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 )
196 def launch(self, config not None: LaunchConfig, kernel not None: Kernel, *args) -> KernelNode:
197 """Add an entry-point kernel launch node (no dependencies).
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
203 def empty(self) -> EmptyNode:
204 """Add an entry-point empty node (no dependencies).
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
213 def join(self, *nodes: GraphNode) -> EmptyNode:
214 """Create an empty node that depends on all given nodes.
216 Parameters
217 ----------
218 *nodes : GraphNode
219 Nodes to merge.
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
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).
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
235 def embed(self, GraphDefinition child not None: GraphDefinition) -> ChildGraphNode:
236 """Add an entry-point child graph node (no dependencies).
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
242 def record(self, event not None: Event) -> EventRecordNode:
243 """Add an entry-point event record node (no dependencies).
245 See :meth:`GraphNode.record` for full documentation.
246 """
247 return self._entry.record(event) 2mcQfSf1dLcXfZc)fXb+c]c^faghgn ogvgCgJgQgXg4g#g
249 def wait(self, event not None: Event) -> EventWaitNode:
250 """Add an entry-point event wait node (no dependencies).
252 See :meth:`GraphNode.wait` for full documentation.
253 """
254 return self._entry.wait(event) 2UfYf0c*fDb,c^c_fbgign pgwgDgKgRgYg5g$g
256 def callback(self, fn: Callable[..., object], *, user_data: int | BufferProtocol | None = None) -> HostCallbackNode:
257 """Add an entry-point host callback node (no dependencies).
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
263 def create_condition(self, default_value: int | None = None) -> GraphCondition:
264 """Create a condition variable for use with conditional nodes.
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``.
270 Parameters
271 ----------
272 default_value : int, optional
273 The default value to assign to the condition.
274 If None, no default is assigned.
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
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
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))
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
298 def if_then(self, GraphCondition condition not None: GraphCondition) -> IfNode:
299 """Add an entry-point if-conditional node (no dependencies).
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
305 def if_else(self, GraphCondition condition not None: GraphCondition) -> IfElseNode:
306 """Add an entry-point if-else conditional node (no dependencies).
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
312 def while_loop(self, GraphCondition condition not None: GraphCondition) -> WhileNode:
313 """Add an entry-point while-loop conditional node (no dependencies).
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
319 def switch(self, GraphCondition condition not None: GraphCondition, unsigned int count) -> SwitchNode:
320 """Add an entry-point switch conditional node (no dependencies).
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
326 def instantiate(self, options: GraphCompleteOptions | None = None) -> Graph:
327 """Instantiate the graph definition into an executable Graph.
329 Parameters
330 ----------
331 options : :obj:`~graph.GraphCompleteOptions`, optional
332 Customizable dataclass for graph instantiation options.
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
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
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.
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
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
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
368 def nodes(self) -> set[GraphNode]:
369 """Return all nodes in the graph.
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
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
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
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
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
392 def edges(self) -> set[tuple[GraphNode, GraphNode]]:
393 """Return all edges in the graph as (from_node, to_node) pairs.
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
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))
414 if num_edges == 0: 2ldmdThUhndodVhB obpbC q r s t u o w v
415 return set() 2ThUhVhobpbw
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))
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 }
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