Coverage for cuda / core / _utils / cuda_utils.pyx: 70.35%
226 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-09 01:05 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-09 01:05 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2#
3# SPDX-License-Identifier: Apache-2.0
5import functools
6from functools import partial
7import importlib.metadata
8import multiprocessing
9import platform
10import warnings
11from collections import namedtuple
12from collections.abc import Sequence
13from contextlib import ExitStack
14from typing import Callable
16try:
17 from cuda.bindings import driver, nvrtc, runtime
18except ImportError:
19 from cuda import cuda as driver
20 from cuda import cudart as runtime
21 from cuda import nvrtc
23from cuda.bindings.nvvm import nvvmError
24from cuda.bindings.nvjitlink import nvJitLinkError
26from cuda.bindings cimport cynvrtc, cynvvm, cynvjitlink
28from cuda.core._utils.driver_cu_result_explanations import DRIVER_CU_RESULT_EXPLANATIONS
29from cuda.core._utils.runtime_cuda_error_explanations import RUNTIME_CUDA_ERROR_EXPLANATIONS
32class CUDAError(Exception):
33 pass
36class NVRTCError(CUDAError):
37 pass
41ComputeCapability = namedtuple("ComputeCapability", ("major", "minor"))
44def cast_to_3_tuple(label, cfg):
45 cfg_orig = cfg 2a k l m n o p q c r d e f s g h t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W i j uchdX Cc5nxe#d6nyevcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+cwczeAe,c]d^d5d-c.c6dBe/c_d`d7d:c;c8dCeDeEeFeGeHeIeJeleVnWnDl7nme
46 if isinstance(cfg, int): 2k l m n o p q c r d e f s g h t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W i j uchdX Cc5nxe#d6nyevcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+cwczeAe,c]d^d5d-c.c6dBe/c_d`d7d:c;c8dCeDeEeFeGeHeIeJeleVnWnDl7nme
47 cfg = (cfg,) 2k l m n o p q c r d e f s g h t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W i j uchdX Cc5n#d6nNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+cwcleVn
48 else:
49 common = "must be an int, or a tuple with up to 3 ints" 2xe#dyevczeAe,c]d^d5d-c.c6dBe/c_d`d7d:c;c8dCeDeEeFeGeHeIeJeleWnDl7nme
50 if not isinstance(cfg, tuple): 2xe#dyevczeAe,c]d^d5d-c.c6dBe/c_d`d7d:c;c8dCeDeEeFeGeHeIeJeleWnDl7nme
51 raise ValueError(f"{label} {common} (got {type(cfg)})") 27n
52 if len(cfg) > 3: 2xe#dyevczeAe,c]d^d5d-c.c6dBe/c_d`d7d:c;c8dCeDeEeFeGeHeIeJeleWnDlme
53 raise ValueError(f"{label} {common} (got tuple with length {len(cfg)})") 2Wn
54 if any(not isinstance(val, int) for val in cfg): 2xe#dyevczeAe,c]d^d5d-c.c6dBe/c_d`d7d:c;c8dCeDeEeFeGeHeIeJeleDlme
55 raise ValueError(f"{label} {common} (got {cfg})") 2Dl
56 if any(val < 1 for val in cfg): 2k l m n o p q c r d e f s g h t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W i j uchdX Cc5nxe#d6nyevcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+cwczeAe,c]d^d5d-c.c6dBe/c_d`d7d:c;c8dCeDeEeFeGeHeIeJeleVnme
57 plural_s = "" if len(cfg) == 1 else "s" 2#dVnme
58 raise ValueError(f"{label} value{plural_s} must be >= 1 (got {cfg_orig})") 2#dVnme
59 return cfg + (1,) * (3 - len(cfg)) 2k l m n o p q c r d e f s g h t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W i j uchdX Cc5nxe#d6nyevcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+cwczeAe,c]d^d5d-c.c6dBe/c_d`d7d:c;c8dCeDeEeFeGeHeIeJele
62def _reduce_3_tuple(t: tuple):
63 return t[0] * t[1] * t[2] 2Cc
66cdef int HANDLE_RETURN(cydriver.CUresult err) except?-1 nogil:
67 if err != cydriver.CUresult.CUDA_SUCCESS: 2a xqyqzqAqBqCqk Dql Eqm Fq=cGqn Hq?cIqo Jqp Kqq LqDcMqEcNqFcOq@cPq[cQq]cRqc Sqr Tqd Uqe Vqf Wqs Xqg Yqh Zqt 0qu 1qv 2q^c3q_c4q`c5q{c6q|c7q}c8qw 9qx !qy #qz $qA %qB 'qC (qD )qE *qF +qG ,qH -qI .qJ /qK :qL ;qM =qN ?qO @qP [qQ ]qR ^qS _qT `qU {qV |qW }q]p8n^p9nEl!nFl#n_p$n`p%nGl'nHl(ni )nj *n{d~q|darnebroecr}ddr~derpefrqegrKehrLeirIljr{p+n|p,n}p-n~p.naq/nbq:nreidcq;n~c=nad?nkrbd@ncd[nxclrycmrdd]ned^ndq_neq`nfq{ngq|nZ nr0 or1 pr2 qr3 rr4 sr$d}ntr~nuraovrbowrcoxrdoyrzr%djdGcAreoBrCrDrErFrGrHrIrJr'dKrLrMrNrOrPrQrRrSrTrUrVrWrXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.s/s:s;s=s?s@s[s]s^s_s`s{s|s}s~satbtctdtetaeftgthtbe(d)dceJlucKlitfojtgoktholtiomtjontkootloptmoqtLlrtMlstNltthdutvtwtxtytztAtBtCtDtseteEtFtnoGtHtItJtX TbUbCcKtLtMtvcNtNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | OlOtPt*dVbWb+dQt,d-d.dPlQlRt/d:d;d=ddeeekdStldTtXbUtmdVtYbWtndXtodYtZbZt0b0tpd1tqd2trd3t1b4tsd5t2b6t3b7t4b8t5b9t6b!t7b#t8b$t9b%t!b'ttd(t#b)t$b*t%b+t'b,tud-t(b.t)b/tvd:twd;txd=tyd?t*b@tzd[t+b]tAd^tBd_t,b`t-b{tCd|tDd}tEd~t.bauFdbu/bcu:bdu;beu=bfu?bgu@bhu[biu]bju^bkuGdlu_bmu`bnu{bou|bpuHdqu}bru~bsuIdtuJduuKdvuLdwuacxuMdyubczuNdAuOdBuccCudcDuPdEuQdFuRdGuecHuSdIufcJugcKuhcLuicMujcNukcOulcPumcQuncRuTdSuocTupcUuqcVurcWuUdXuscYutcZuVd0uWd1u?doopoHc2u3uqo4uIc5uXd6uYd7uZd8uro9uso!uto#uuo$uvo%uwo'uxo(uyo)uzo*uAo+uBo,uCo-uDo.uEo/uFo:uGo;uHo=u?u@uIo[u]u^uJo_u`u{uKo|u}u~uLoavbvcvModvevfvNogvhvivOojvkvlvPomvQonvRoovSopvToqvUorvVosvWotvXouvYovvZowv0oxv1oyv2ozv3oAv4oBvXnCvYnDvZnEv0nFv1nGv2nHv5oIv@d[d0d6oJvJcKv7o8ozcAcLvMvY NvBcOvPv} QvRlSlRvTlSvUlwcTvVl~ WlUvXlVvYlfeZlWv0lge1lXv2lYv3lZv4l0v5l1v6l7l8l9l!lbbcb2v#l3v$l4v%l5v'l6v(l7v)l8v*l9v+l!v,l#v-l$v.l%v/l'v:l(v;l)v=l*v?l+v@l,v[l-v]l.v^l/v_l:v`l;v{l=v|l}l~l?vam@vbm[vcm]vdm^vem_vfm`vgm{vhm|vim}vjm~vkmawlmbwmmcwnmdwomewpmfwqmgwrmhwsmiwtmjwumvmkwwmlwxmmwymnwzmowAmpwBmqwCmrwDmswEmtwFmuwGmvwHmwwImxwJmywKmzwLmMm!dAw1dBw2dCwKcDwfdEwNmFwGw9oOmPm!oQmRm#oSmHwIw$oTmUm%ohe,cieVmWm]dXmYmJw'oZm^d0m(oMe)o1m5d2m-c.c3mNe*o+o4m6d5m6mKwLw,o7m8m-oje/cke9m!m_d#m$mMw.o%m`d'm/oOe:o(m7d)m:c;c*mPe;o=o+m8d,m-mNwOw?o.m/m:mLc;m=mMc@o?mPwQw[o@m[m]o]mRwSw^o^m_m_o`mTwUw`o{m|m{o}mVwWw|o~man}obnXwYw~ocndnapenZw0wbpfngnhncpin1w2wdpjnknlnepdb3web4wfpfb5wgb6w7w8w9w!w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxmngdgxhxixjxkxlxmxnnnxoxpxqxrxsxtxQeReonpnqnabuxrngphpsnvxwxxxhbyxzxAxBxibCxDxExipFxjpGxkpHxlpIxmpJxnpKxopLxppMxqpNxrpOxspPxtpQxupRxvpSxwpTxxpUxtnVxypWxzpXxApYxBpZxCp0xDp1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?xunhqiqjqvnwnkqlqxnynmqnqznoqAnBnpqCnDnEnFnGnHnInJnKnqqLnMnNnrqOnPnQnRnSnTnsqtq@x[x]xUn^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEy
68 return _check_driver_error(err) 2sete~ gd
69 return 0 2a xqyqzqAqBqCqk Dql Eqm Fq=cGqn Hq?cIqo Jqp Kqq LqDcMqEcNqFcOq@cPq[cQq]cRqc Sqr Tqd Uqe Vqf Wqs Xqg Yqh Zqt 0qu 1qv 2q^c3q_c4q`c5q{c6q|c7q}c8qw 9qx !qy #qz $qA %qB 'qC (qD )qE *qF +qG ,qH -qI .qJ /qK :qL ;qM =qN ?qO @qP [qQ ]qR ^qS _qT `qU {qV |qW }q]p8n^p9nEl!nFl#n_p$n`p%nGl'nHl(ni )nj *n{d~q|darnebroecr}ddr~derpefrqegrKehrLeirIljr{p+n|p,n}p-n~p.naq/nbq:nreidcq;n~c=nad?nkrbd@ncd[nxclrycmrdd]ned^ndq_neq`nfq{ngq|nZ nr0 or1 pr2 qr3 rr4 sr$d}ntr~nuraovrbowrcoxrdoyrzr%djdGcAreoBrCrDrErFrGrHrIrJr'dKrLrMrNrOrPrQrRrSrTrUrVrWrXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.s/s:s;s=s?s@s[s]s^s_s`s{s|s}s~satbtctdtetaeftgthtbe(d)dceJlucKlitfojtgoktholtiomtjontkootloptmoqtLlrtMlstNltthdutvtwtxtytztAtBtCtDtEtFtnoGtHtItJtX TbUbCcKtLtMtvcNtNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | OlOtPt*dVbWb+dQt,d-d.dPlQlRt/d:d;d=ddeeekdStldTtXbUtmdVtYbWtndXtodYtZbZt0b0tpd1tqd2trd3t1b4tsd5t2b6t3b7t4b8t5b9t6b!t7b#t8b$t9b%t!b'ttd(t#b)t$b*t%b+t'b,tud-t(b.t)b/tvd:twd;txd=tyd?t*b@tzd[t+b]tAd^tBd_t,b`t-b{tCd|tDd}tEd~t.bauFdbu/bcu:bdu;beu=bfu?bgu@bhu[biu]bju^bkuGdlu_bmu`bnu{bou|bpuHdqu}bru~bsuIdtuJduuKdvuLdwuacxuMdyubczuNdAuOdBuccCudcDuPdEuQdFuRdGuecHuSdIufcJugcKuhcLuicMujcNukcOulcPumcQuncRuTdSuocTupcUuqcVurcWuUdXuscYutcZuVd0uWd1u?doopoHc2u3uqo4uIc5uXd6uYd7uZd8uro9uso!uto#uuo$uvo%uwo'uxo(uyo)uzo*uAo+uBo,uCo-uDo.uEo/uFo:uGo;uHo=u?u@uIo[u]u^uJo_u`u{uKo|u}u~uLoavbvcvModvevfvNogvhvivOojvkvlvPomvQonvRoovSopvToqvUorvVosvWotvXouvYovvZowv0oxv1oyv2ozv3oAv4oBvXnCvYnDvZnEv0nFv1nGv2nHv5oIv@d[d0d6oJvJcKv7o8ozcAcLvMvY NvBcOvPv} QvRlSlRvTlSvUlwcTvVl~ WlUvXlVvYlfeZlWv0lge1lXv2lYv3lZv4l0v5l1v6l7l8l9l!lbbcb2v#l3v$l4v%l5v'l6v(l7v)l8v*l9v+l!v,l#v-l$v.l%v/l'v:l(v;l)v=l*v?l+v@l,v[l-v]l.v^l/v_l:v`l;v{l=v|l}l~l?vam@vbm[vcm]vdm^vem_vfm`vgm{vhm|vim}vjm~vkmawlmbwmmcwnmdwomewpmfwqmgwrmhwsmiwtmjwumvmkwwmlwxmmwymnwzmowAmpwBmqwCmrwDmswEmtwFmuwGmvwHmwwImxwJmywKmzwLmMm!dAw1dBw2dCwKcDwfdEwNmFwGw9oOmPm!oQmRm#oSmHwIw$oTmUm%ohe,cieVmWm]dXmYmJw'oZm^d0m(oMe)o1m5d2m-c.c3mNe*o+o4m6d5m6mKwLw,o7m8m-oje/cke9m!m_d#m$mMw.o%m`d'm/oOe:o(m7d)m:c;c*mPe;o=o+m8d,m-mNwOw?o.m/m:mLc;m=mMc@o?mPwQw[o@m[m]o]mRwSw^o^m_m_o`mTwUw`o{m|m{o}mVwWw|o~man}obnXwYw~ocndnapenZw0wbpfngnhncpin1w2wdpjnknlnepdb3web4wfpfb5wgb6w7w8w9w!w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxmngdgxhxixjxkxlxmxnnnxoxpxqxrxsxtxQeReonpnqnabuxrngphpsnvxwxxxhbyxzxAxBxibCxDxExipFxjpGxkpHxlpIxmpJxnpKxopLxppMxqpNxrpOxspPxtpQxupRxvpSxwpTxxpUxtnVxypWxzpXxApYxBpZxCp0xDp1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?xunhqiqjqvnwnkqlqxnynmqnqznoqAnBnpqCnDnEnFnGnHnInJnKnqqLnMnNnrqOnPnQnRnSnTnsqtq@x[x]xUn^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEy
72cdef int HANDLE_RETURN_NVRTC(cynvrtc.nvrtcProgram prog, cynvrtc.nvrtcResult err) except?-1 nogil:
73 """Handle NVRTC result codes, raising NVRTCError with program log on failure."""
74 if err == cynvrtc.nvrtcResult.NVRTC_SUCCESS: 2k l m n o p q c r d e f s g h t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W i j uchdX CcvcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+cb 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | Ol} RlSlTlUlwcVl~ WlXlYlZl0l1l2l3l4l5l6l7l8l9l!lbbcb#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmOmPmRmTmUmheieWmXmZm0m1m2m-c.c3m4m5m7m8mjeke!m#m%m'm(m)m:c;c*m+m,m.m/m:m;m@m[m^m_m{m|m~mancndnfngnhnjnknlndbebfbgbybzblbmbnbAbBbCbDbjbkbobEbpbFbGbHbIbqbJbrbsbtbubKbLbMbNbObPbQbRbSbvbwbxbonpnqnabrnsnhbib
75 return 0 2k l m n o p q c r d e f s g h t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W i j uchdX CcvcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+cb 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | Ol} RlSlTlUlwcVl~ WlXlYlZl0l1l2l3l4l5l6l7l8l9l!lbbcb#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmOmPmRmTmUmheieWmXmZm0m1m2m-c.c3m4m5m7m8mjeke!m#m%m'm(m)m:c;c*m+m,m.m/m:m;m@m[m^m_m{m|m~mancndnfngnhnjnknlndbebfbgbybzblbmbnbAbBbCbDbjbkbobEbpbFbGbHbIbqbJbrbsbtbubKbLbMbNbObPbQbRbSbvbwbxbonpnqnabrnsnhbib
76 with gil:
77 _raise_nvrtc_error(prog, err)
80cdef int _raise_nvrtc_error(cynvrtc.nvrtcProgram prog, cynvrtc.nvrtcResult err) except -1:
81 """Build error message with program log and raise NVRTCError."""
82 cdef const char* err_str = cynvrtc.nvrtcGetErrorString(err)
83 cdef size_t logsize = 0
84 if prog != NULL:
85 cynvrtc.nvrtcGetProgramLogSize(prog, &logsize)
86 cdef bytes log_bytes
87 cdef str log_str = ""
88 if logsize > 1 and prog != NULL:
89 log_bytes = b" " * logsize
90 if cynvrtc.nvrtcGetProgramLog(prog, <char*>log_bytes) == cynvrtc.nvrtcResult.NVRTC_SUCCESS:
91 log_str = log_bytes.decode("utf-8", errors="backslashreplace")
92 err_msg = f"{err}: {err_str.decode()}" if err_str != NULL else f"NVRTC error {err}"
93 if log_str:
94 err_msg += f", compilation log:\n\n{log_str}"
95 raise NVRTCError(err_msg)
98cdef int HANDLE_RETURN_NVVM(cynvvm.nvvmProgram prog, cynvvm.nvvmResult err) except?-1 nogil:
99 """Handle NVVM result codes, raising nvvmError with program log on failure."""
100 if err == cynvvm.nvvmResult.NVVM_SUCCESS: 2=mEpFpmngdGpHpIpJpKpLpMpnnNpOpPpQpRpSpQeRe
101 return 0 2=mEpFpmngdGpHpIpJpKpLpMpnnNpOpPpQpRpSpQeRe
102 with gil:
103 _raise_nvvm_error(prog, err)
106cdef int _raise_nvvm_error(cynvvm.nvvmProgram prog, cynvvm.nvvmResult err) except -1:
107 """Raise nvvmError annotated with the program log."""
108 cdef size_t logsize = 0
109 if prog != NULL:
110 cynvvm.nvvmGetProgramLogSize(prog, &logsize)
111 cdef bytes log_bytes
112 cdef str log_str = ""
113 if logsize > 1 and prog != NULL:
114 log_bytes = b" " * logsize
115 if cynvvm.nvvmGetProgramLog(prog, <char*>log_bytes) == cynvvm.nvvmResult.NVVM_SUCCESS:
116 log_str = log_bytes.decode("utf-8", errors="backslashreplace")
117 cdef object exc = nvvmError(err)
118 if log_str:
119 exc.args = (exc.args[0] + f"\nNVVM program log: {log_str}", *exc.args[1:])
120 raise exc
123cdef int HANDLE_RETURN_NVJITLINK(
124 cynvjitlink.nvJitLinkHandle handle, cynvjitlink.nvJitLinkResult err) except?-1 nogil:
125 """Handle nvJitLink result codes, raising nvJitLinkError with error log on failure."""
126 if err == cynvjitlink.nvJitLinkResult.NVJITLINK_SUCCESS: 2b TpUpVpWpXpYpZp0p1p2p3n4n3p4p5p6p7p8p9p!p#p$p%p'p(p9d)p*p+p,p-p.p/p:p;p=p?p@p[p
127 return 0 2b TpUpVpWpXpYpZp0p1p2p3n4n3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p
128 with gil: 2b 9d
129 _raise_nvjitlink_error(handle, err) 2b 9d
132cdef int _raise_nvjitlink_error(
133 cynvjitlink.nvJitLinkHandle handle, cynvjitlink.nvJitLinkResult err) except -1:
134 """Raise nvJitLinkError annotated with the error log."""
135 cdef size_t logsize = 0 2b 9d
136 if handle != NULL: 2b 9d
137 cynvjitlink.nvJitLinkGetErrorLogSize(handle, &logsize) 1b
138 cdef bytes log_bytes
139 cdef str log_str = "" 2b 9d
140 if logsize > 1 and handle != NULL: 2b 9d
141 log_bytes = b" " * logsize 1b
142 if cynvjitlink.nvJitLinkGetErrorLog(handle, <char*>log_bytes) == \ 1b
143 cynvjitlink.nvJitLinkResult.NVJITLINK_SUCCESS: 1b
144 log_str = log_bytes.decode("utf-8", errors="backslashreplace") 1b
145 cdef object exc = nvJitLinkError(err) 2b 9d
146 if log_str: 2b 9d
147 exc.args = (exc.args[0] + f"\nnvJitLink error log: {log_str}", *exc.args[1:]) 1b
148 raise exc 2b 9d
151cdef object _RUNTIME_SUCCESS = runtime.cudaError_t.cudaSuccess
152cdef object _NVRTC_SUCCESS = nvrtc.nvrtcResult.NVRTC_SUCCESS
155cpdef inline int _check_driver_error(cydriver.CUresult error) except?-1 nogil:
156 if error == cydriver.CUresult.CUDA_SUCCESS: 2a SeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ek +el ,em -e=c.en /e?c:eo ;ep =eq ?eDcEcFc@c[c]cc r d e f s g h t u v ^c_c`c{c|c}cw @ex [ey ]ez ^eA _eB `eC {eD |eE }eF ~eG afH bfI cfJ dfK efL ffM gfN hfO ifP jfQ kfR lfS mfT nfU ofV pfW qfi j id~cadbdcdxcycddedZ 0 1 2 3 4 rfsftfufvfwfxfueyfzfGcAfBfCfDfEfFfGfHfIfJfKfLfaeMfNfOfbePfceucQfRfSfTfUfVfWfXfYfZf0f1f2fseteX TbUb3f4f5f6fNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+cb 5 7f6 8f7 9f8 !f9 #f! $f# %f$ 'f% (f' )f( *f) +f* ,f+ -f, .f- /f. :f/ ;f: =f; ?f= @f? [f@ ]f[ ^f] _f^ `f_ {f` |f{ }f| ~fagbgcg*dVbWb+d,d-d.dPlQl/d:d;d=ddeeekdldXbmdYbndodZb0bpdqdrd1bsd2b3b4b5b6b7b8b9b!btd#b$b%b'bud(b)bvdwdxdyd*bzd+bAdBd,b-bCdDdEd.bFd/b:b;b=b?b@b[b]b^bGd_b`b{b|bHd}b~bIdJdKdLdacMdbcNdOdccdcPdQdRdecSdfcgchcicjckclcmcncTdocpcqcrcUdsctcVdWd?ddgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g@d[d0d$g%gzcAcY Bc} 'g(g)g*g+gwc,g-g~ .g/gfe:g;gge=g?g@g[g]g^g_g`g{g|g}g3dbb~g4dcbahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%hNm'h(h)h*h+h,h-hQm.h/h:hSm;h=h?h@h[h]h^hhe_h,c`hie{hVm|h}h~haiYmbicidieifigihiMeiijikiliminioipiNeqirisitiuivi6mwixiyiziAiBiCijeDi/cEikeFi9mGiHiIiJi$mKiLiMiNiOiPiQiOeRiSiTiUiViWiXiYiPeZi0i1i2i3i4i-m5i6i7i8i9i!i#iLc$i%i'iMc(i)i?m*i+i,i-i.i/i:i]m;i=i?i@i[i]i^i`m_i`i{i|i}i~iaj}mbjcjdjejfjgjhjbnijjjkjljmjnjojenpjqjrjsjtjujvjwjinxjyjzjAjBjCjDjEjdbFjebGjfbHjgbIjybJjzbKjlbLjmbMjnbNjAbOjBbPjCbQjDbRjjbSjkbTjobUjEbVjpbWjFbXjGbYjHbZjIb0jqb1jJb2jrb3jsb4jtb5jub6jKb7jLb8jMb9jNb!jOb#jPb$jQb%jRb'jSb(jvb)jwb*jxb+jgd,j-j.j/j:j;j=j?j@j[j]j^j_j`jab{j|j}j~jhbakbkckdkekibfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@kunhqiqjqvnwnkqlqxnynmqnqznoqAnBnpqCnDnEnFnGnHnInJnKnqqLnMnNnrqOnPnQnRnSnTnsqtq[k]k^k_k`kUn{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBl
157 return 0 2a SeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ek +el ,em -e=c.en /e?c:eo ;ep =eq ?eDcEcFc@c[c]cc r d e f s g h t u v ^c_c`c{c|c}cw @ex [ey ]ez ^eA _eB `eC {eD |eE }eF ~eG afH bfI cfJ dfK efL ffM gfN hfO ifP jfQ kfR lfS mfT nfU ofV pfW qfi j id~cadbdcdxcycddedZ 0 1 2 3 4 rfsftfufvfwfxfueyfzfGcAfBfCfDfEfFfGfHfIfJfKfLfaeMfNfOfbePfceucQfRfSfTfUfVfWfXfYfZf0f1f2fX TbUb3f4f5f6fNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+cb 5 7f6 8f7 9f8 !f9 #f! $f# %f$ 'f% (f' )f( *f) +f* ,f+ -f, .f- /f. :f/ ;f: =f; ?f= @f? [f@ ]f[ ^f] _f^ `f_ {f` |f{ }f| ~fagbgcg*dVbWb+d,d-d.dPlQl/d:d;d=ddeeekdldXbmdYbndodZb0bpdqdrd1bsd2b3b4b5b6b7b8b9b!btd#b$b%b'bud(b)bvdwdxdyd*bzd+bAdBd,b-bCdDdEd.bFd/b:b;b=b?b@b[b]b^bGd_b`b{b|bHd}b~bIdJdKdLdacMdbcNdOdccdcPdQdRdecSdfcgchcicjckclcmcncTdocpcqcrcUdsctcVdWd?ddgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g@d[d0d$g%gzcAcY Bc} 'g(g)g*g+gwc,g-g~ .g/gfe:g;gge=g?g@g[g]g^g_g`g{g|g}g3dbb~g4dcbahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%hNm'h(h)h*h+h,h-hQm.h/h:hSm;h=h?h@h[h]h^hhe_h,c`hie{hVm|h}h~haiYmbicidieifigihiMeiijikiliminioipiNeqirisitiuivi6mwixiyiziAiBiCijeDi/cEikeFi9mGiHiIiJi$mKiLiMiNiOiPiQiOeRiSiTiUiViWiXiYiPeZi0i1i2i3i4i-m5i6i7i8i9i!i#iLc$i%i'iMc(i)i?m*i+i,i-i.i/i:i]m;i=i?i@i[i]i^i`m_i`i{i|i}i~iaj}mbjcjdjejfjgjhjbnijjjkjljmjnjojenpjqjrjsjtjujvjwjinxjyjzjAjBjCjDjEjdbFjebGjfbHjgbIjybJjzbKjlbLjmbMjnbNjAbOjBbPjCbQjDbRjjbSjkbTjobUjEbVjpbWjFbXjGbYjHbZjIb0jqb1jJb2jrb3jsb4jtb5jub6jKb7jLb8jMb9jNb!jOb#jPb$jQb%jRb'jSb(jvb)jwb*jxb+j,j-j.j/j:j;j=j?j@j[j]j^j_j`jab{j|j}j~jhbakbkckdkekibfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@kunhqiqjqvnwnkqlqxnynmqnqznoqAnBnpqCnDnEnFnGnHnInJnKnqqLnMnNnrqOnPnQnRnSnTnsqtq[k]k^k_k`kUn{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBl
158 cdef const char* name
159 name_err = cydriver.cuGetErrorName(error, &name) 2ueseteY ~ gd
160 if name_err != cydriver.CUresult.CUDA_SUCCESS: 2ueseteY ~ gd
161 raise CUDAError(f"UNEXPECTED ERROR CODE: {error}") 2ue
162 with gil: 2ueseteY ~ gd
163 # TODO: consider lower this to Cython
164 expl = DRIVER_CU_RESULT_EXPLANATIONS.get(int(error)) 2ueseteY ~ gd
165 if expl is not None: 2ueseteY ~ gd
166 raise CUDAError(f"{name.decode()}: {expl}") 2ueseteY ~ gd
167 cdef const char* desc
168 desc_err = cydriver.cuGetErrorString(error, &desc)
169 if desc_err != cydriver.CUresult.CUDA_SUCCESS:
170 raise CUDAError(f"{name.decode()}")
171 raise CUDAError(f"{name.decode()}: {desc.decode()}")
174cpdef inline int _check_runtime_error(error) except?-1:
175 if error == _RUNTIME_SUCCESS: 2Z 0 1 2 3 4 $dveweCl%djdGc'd(d)dTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcHcIcXdYdZdJc
176 return 0 2Z 0 1 2 3 4 $dveweCl%djdGc'd(d)dTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcHcIcXdYdZdJc
177 name_err, name = runtime.cudaGetErrorName(error) 2Cl
178 if name_err != _RUNTIME_SUCCESS: 2Cl
179 raise CUDAError(f"UNEXPECTED ERROR CODE: {error}")
180 name = name.decode() 2Cl
181 expl = RUNTIME_CUDA_ERROR_EXPLANATIONS.get(int(error)) 2Cl
182 if expl is not None: 2Cl
183 raise CUDAError(f"{name}: {expl}") 2Cl
184 desc_err, desc = runtime.cudaGetErrorString(error)
185 if desc_err != _RUNTIME_SUCCESS:
186 raise CUDAError(f"{name}")
187 desc = desc.decode()
188 raise CUDAError(f"{name}: {desc}")
191cpdef inline int _check_nvrtc_error(error, handle=None) except?-1:
192 if error == _NVRTC_SUCCESS: 2a b 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } 3dbb4dcbLcMcdbebfbgbybzblbmbnbAbBbCbDbjbkbobEbpbFbGbHbIbqbJbrbsbtbubKbLbMbNbObPbQbRbSbvbwbxbabhbib
193 return 0 2a b 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } 3dbb4dcbLcMcdbebfbgbybzblbmbnbAbBbCbDbjbkbobEbpbFbGbHbIbqbJbrbsbtbubKbLbMbNbObPbQbRbSbvbwbxbabhbib
194 err = f"{error}: {nvrtc.nvrtcGetErrorString(error)[1].decode()}"
195 if handle is not None:
196 _, logsize = nvrtc.nvrtcGetProgramLogSize(handle)
197 log = b" " * logsize
198 _ = nvrtc.nvrtcGetProgramLog(handle, log)
199 err += f", compilation log:\n\n{log.decode('utf-8', errors='backslashreplace')}"
200 raise NVRTCError(err)
203cdef inline int _check_error(error, handle=None) except?-1:
204 if isinstance(error, driver.CUresult): 2a SeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ek +el ,em -e=c.en /e?c:eo ;ep =eq ?eDcEcFc@c[c]cc r d e f s g h t u v ^c_c`c{c|c}cw @ex [ey ]ez ^eA _eB `eC {eD |eE }eF ~eG afH bfI cfJ dfK efL ffM gfN hfO ifP jfQ kfR lfS mfT nfU ofV pfW qfi j id~cadbdcdxcycddedZ 0 1 2 3 4 $dverfwesftfufvfwfxfyf%djdzfGcAfBfCfDfEfFfGfHf'dIfJfKfLfaeMfNfOfbe(d)dPfceQfRfSfTfUfVfWfXfYfZf0f1f2fX TbUb3f4f5f6fb 5 7f6 8f7 9f8 !f9 #f! $f# %f$ 'f% (f' )f( *f) +f* ,f+ -f, .f- /f. :f/ ;f: =f; ?f= @f? [f@ ]f[ ^f] _f^ `f_ {f` |f{ }f| ~fagbgcg*dVbWb+d,d-d.d/d:d;d=ddeeekdldXbmdYbndodZb0bpdqdrd1bsd2b3b4b5b6b7b8b9b!btd#b$b%b'bud(b)bvdwdxdyd*bzd+bAdBd,b-bCdDdEd.bFd/b:b;b=b?b@b[b]b^bGd_b`b{b|bHd}b~bIdJdKdLdacMdbcNdOdccdcPdQdRdecSdfcgchcicjckclcmcncTdocpcqcrcUdsctcVdWd?dHcdgegfgIcggXdhgYdigZdjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g@d[d0d$gJc%g} 'g(g)g*g+g,g-g~ .g/gfe:g;gge=g?g@g[g]g^g_g`g{g|g}g3dbb~g4dcbahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#iLc$i%i'iMc(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjdbFjebGjfbHjgbIjybJjzbKjlbLjmbMjnbNjAbOjBbPjCbQjDbRjjbSjkbTjobUjEbVjpbWjFbXjGbYjHbZjIb0jqb1jJb2jrb3jsb4jtb5jub6jKb7jLb8jMb9jNb!jOb#jPb$jQb%jRb'jSb(jvb)jwb*jxb+j,j-j.j/j:j;j=j?j@j[j]j^j_j`jab{j|j}j~jhbakbkckdkekibfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBl
205 return _check_driver_error(error) 2a SeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ek +el ,em -e=c.en /e?c:eo ;ep =eq ?eDcEcFc@c[c]cc r d e f s g h t u v ^c_c`c{c|c}cw @ex [ey ]ez ^eA _eB `eC {eD |eE }eF ~eG afH bfI cfJ dfK efL ffM gfN hfO ifP jfQ kfR lfS mfT nfU ofV pfW qfi j id~cadbdcdxcycddedZ 0 1 2 3 4 rfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfaeMfNfOfbePfceQfRfSfTfUfVfWfXfYfZf0f1f2fX TbUb3f4f5f6fb 5 7f6 8f7 9f8 !f9 #f! $f# %f$ 'f% (f' )f( *f) +f* ,f+ -f, .f- /f. :f/ ;f: =f; ?f= @f? [f@ ]f[ ^f] _f^ `f_ {f` |f{ }f| ~fagbgcg*dVbWb+d,d-d.d/d:d;d=ddeeekdldXbmdYbndodZb0bpdqdrd1bsd2b3b4b5b6b7b8b9b!btd#b$b%b'bud(b)bvdwdxdyd*bzd+bAdBd,b-bCdDdEd.bFd/b:b;b=b?b@b[b]b^bGd_b`b{b|bHd}b~bIdJdKdLdacMdbcNdOdccdcPdQdRdecSdfcgchcicjckclcmcncTdocpcqcrcUdsctcVdWd?ddgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g@d[d0d$g%g} 'g(g)g*g+g,g-g~ .g/gfe:g;gge=g?g@g[g]g^g_g`g{g|g}g3dbb~g4dcbahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#iLc$i%i'iMc(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjdbFjebGjfbHjgbIjybJjzbKjlbLjmbMjnbNjAbOjBbPjCbQjDbRjjbSjkbTjobUjEbVjpbWjFbXjGbYjHbZjIb0jqb1jJb2jrb3jsb4jtb5jub6jKb7jLb8jMb9jNb!jOb#jPb$jQb%jRb'jSb(jvb)jwb*jxb+j,j-j.j/j:j;j=j?j@j[j]j^j_j`jab{j|j}j~jhbakbkckdkekibfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBl
206 elif isinstance(error, runtime.cudaError_t): 2a Z 0 1 2 3 4 $dvewe%djdGc'd(d)dTbUbb 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcHcIcXdYdZdJc} 3dbb4dcbLcMcdbebfbgbybzblbmbnbAbBbCbDbjbkbobEbpbFbGbHbIbqbJbrbsbtbubKbLbMbNbObPbQbRbSbvbwbxbabhbib
207 return _check_runtime_error(error) 2Z 0 1 2 3 4 $dvewe%djdGc'd(d)dTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcHcIcXdYdZdJc
208 elif isinstance(error, nvrtc.nvrtcResult): 2a b 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } 3dbb4dcbLcMcdbebfbgbybzblbmbnbAbBbCbDbjbkbobEbpbFbGbHbIbqbJbrbsbtbubKbLbMbNbObPbQbRbSbvbwbxbabhbib
209 return _check_nvrtc_error(error, handle=handle) 2a b 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } 3dbb4dcbLcMcdbebfbgbybzblbmbnbAbBbCbDbjbkbobEbpbFbGbHbIbqbJbrbsbtbubKbLbMbNbObPbQbRbSbvbwbxbabhbib
210 else:
211 raise RuntimeError(f"Unknown error type: {error}")
214def handle_return(tuple result, handle=None):
215 _check_error(result[0], handle=handle) 2a SeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ek +el ,em -e=c.en /e?c:eo ;ep =eq ?eDcEcFc@c[c]cc r d e f s g h t u v ^c_c`c{c|c}cw @ex [ey ]ez ^eA _eB `eC {eD |eE }eF ~eG afH bfI cfJ dfK efL ffM gfN hfO ifP jfQ kfR lfS mfT nfU ofV pfW qfi j id~cadbdcdxcycddedZ 0 1 2 3 4 $dverfwesftfufvfwfxfyf%djdzfGcAfBfCfDfEfFfGfHf'dIfJfKfLfaeMfNfOfbe(d)dPfceQfRfSfTfUfVfWfXfYfZf0f1f2fX TbUb3f4f5f6fb 5 7f6 8f7 9f8 !f9 #f! $f# %f$ 'f% (f' )f( *f) +f* ,f+ -f, .f- /f. :f/ ;f: =f; ?f= @f? [f@ ]f[ ^f] _f^ `f_ {f` |f{ }f| ~fagbgcg*dVbWb+d,d-d.d/d:d;d=ddeeekdldXbmdYbndodZb0bpdqdrd1bsd2b3b4b5b6b7b8b9b!btd#b$b%b'bud(b)bvdwdxdyd*bzd+bAdBd,b-bCdDdEd.bFd/b:b;b=b?b@b[b]b^bGd_b`b{b|bHd}b~bIdJdKdLdacMdbcNdOdccdcPdQdRdecSdfcgchcicjckclcmcncTdocpcqcrcUdsctcVdWd?dHcdgegfgIcggXdhgYdigZdjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g@d[d0d$gJc%g} 'g(g)g*g+g,g-g~ .g/gfe:g;gge=g?g@g[g]g^g_g`g{g|g}g3dbb~g4dcbahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#iLc$i%i'iMc(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjdbFjebGjfbHjgbIjybJjzbKjlbLjmbMjnbNjAbOjBbPjCbQjDbRjjbSjkbTjobUjEbVjpbWjFbXjGbYjHbZjIb0jqb1jJb2jrb3jsb4jtb5jub6jKb7jLb8jMb9jNb!jOb#jPb$jQb%jRb'jSb(jvb)jwb*jxb+j,j-j.j/j:j;j=j?j@j[j]j^j_j`jab{j|j}j~jhbakbkckdkekibfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBl
216 cdef int out_len = len(result) 2a SeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ek +el ,em -e=c.en /e?c:eo ;ep =eq ?eDcEcFc@c[c]cc r d e f s g h t u v ^c_c`c{c|c}cw @ex [ey ]ez ^eA _eB `eC {eD |eE }eF ~eG afH bfI cfJ dfK efL ffM gfN hfO ifP jfQ kfR lfS mfT nfU ofV pfW qfi j id~cadbdcdxcycddedZ 0 1 2 3 4 $dverfwesftfufvfwfxfyf%djdzfGcAfBfCfDfEfFfGfHf'dIfJfKfLfaeMfNfOfbe(d)dPfceQfRfSfTfUfVfWfXfYfZf0f1f2fX TbUb3f4f5f6fb 5 7f6 8f7 9f8 !f9 #f! $f# %f$ 'f% (f' )f( *f) +f* ,f+ -f, .f- /f. :f/ ;f: =f; ?f= @f? [f@ ]f[ ^f] _f^ `f_ {f` |f{ }f| ~fagbgcg*dVbWb+d,d-d.d/d:d;d=ddeeekdldXbmdYbndodZb0bpdqdrd1bsd2b3b4b5b6b7b8b9b!btd#b$b%b'bud(b)bvdwdxdyd*bzd+bAdBd,b-bCdDdEd.bFd/b:b;b=b?b@b[b]b^bGd_b`b{b|bHd}b~bIdJdKdLdacMdbcNdOdccdcPdQdRdecSdfcgchcicjckclcmcncTdocpcqcrcUdsctcVdWd?dHcdgegfgIcggXdhgYdigZdjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g@d[d0d$gJc%g} 'g(g)g*g+g,g-g~ .g/gfe:g;gge=g?g@g[g]g^g_g`g{g|g}g3dbb~g4dcbahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#iLc$i%i'iMc(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjdbFjebGjfbHjgbIjybJjzbKjlbLjmbMjnbNjAbOjBbPjCbQjDbRjjbSjkbTjobUjEbVjpbWjFbXjGbYjHbZjIb0jqb1jJb2jrb3jsb4jtb5jub6jKb7jLb8jMb9jNb!jOb#jPb$jQb%jRb'jSb(jvb)jwb*jxb+j,j-j.j/j:j;j=j?j@j[j]j^j_j`jab{j|j}j~jhbakbkckdkekibfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBl
217 if out_len == 1: 2a SeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ek +el ,em -e=c.en /e?c:eo ;ep =eq ?eDcEcFc@c[c]cc r d e f s g h t u v ^c_c`c{c|c}cw @ex [ey ]ez ^eA _eB `eC {eD |eE }eF ~eG afH bfI cfJ dfK efL ffM gfN hfO ifP jfQ kfR lfS mfT nfU ofV pfW qfi j id~cadbdcdxcycddedZ 0 1 2 3 4 $dverfwesftfufvfwfxfyf%djdzfGcAfBfCfDfEfFfGfHf'dIfJfKfLfaeMfNfOfbe(d)dPfceQfRfSfTfUfVfWfXfYfZf0f1f2fX TbUb3f4f5f6fb 5 7f6 8f7 9f8 !f9 #f! $f# %f$ 'f% (f' )f( *f) +f* ,f+ -f, .f- /f. :f/ ;f: =f; ?f= @f? [f@ ]f[ ^f] _f^ `f_ {f` |f{ }f| ~fagbgcg*dVbWb+d,d-d.d/d:d;d=ddeeekdldXbmdYbndodZb0bpdqdrd1bsd2b3b4b5b6b7b8b9b!btd#b$b%b'bud(b)bvdwdxdyd*bzd+bAdBd,b-bCdDdEd.bFd/b:b;b=b?b@b[b]b^bGd_b`b{b|bHd}b~bIdJdKdLdacMdbcNdOdccdcPdQdRdecSdfcgchcicjckclcmcncTdocpcqcrcUdsctcVdWd?dHcdgegfgIcggXdhgYdigZdjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g@d[d0d$gJc%g} 'g(g)g*g+g,g-g~ .g/gfe:g;gge=g?g@g[g]g^g_g`g{g|g}g3dbb~g4dcbahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#iLc$i%i'iMc(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjdbFjebGjfbHjgbIjybJjzbKjlbLjmbMjnbNjAbOjBbPjCbQjDbRjjbSjkbTjobUjEbVjpbWjFbXjGbYjHbZjIb0jqb1jJb2jrb3jsb4jtb5jub6jKb7jLb8jMb9jNb!jOb#jPb$jQb%jRb'jSb(jvb)jwb*jxb+j,j-j.j/j:j;j=j?j@j[j]j^j_j`jab{j|j}j~jhbakbkckdkekibfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBl
218 return 2Ue!ek l m =cn ?co p q DcEcFc@c[c]cc r d e f s g h t u v ^c_c`c{c|c}cw x y z A B C D E F G H I J K L M N O P Q R S T U V W idZ 0 1 2 3 4 yfjdGcX TbUb*dVbWb+d,d-d.d/d:d;d=ddeeekdldXbmdYbndodZb0bpdqdrd1bsd2b3b4b5b6b7b8b9b!btd#b$b%b'bud(b)bvdwdxdyd*bzd+bAdBd,b-bCdDdEd.bFd/b:b;b=b?b@b[b]b^bGd_b`b{b|bHd}b~bIdJdKdLdacMdbcNdOdccdcPdQdRdecSdfcgchcicjckclcmcncTdocpcqcrcUdsctcVdWd?dHcIcXdYdZd@d[d0dJc
219 elif out_len == 2:
220 return result[1] 2a SeTeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e#e$e%e'e(e)e*ek +el ,em -e=c.en /e?c:eo ;ep =eq ?eDcEcFc@c[c]cc r d e f s g h t u v ^c_c`c{c|c}cw @ex [ey ]ez ^eA _eB `eC {eD |eE }eF ~eG afH bfI cfJ dfK efL ffM gfN hfO ifP jfQ kfR lfS mfT nfU ofV pfW qfi j id~cadbdcdxcycddedZ 0 1 2 3 4 $dverfwesftfufvfwfxf%dzfAfBfCfDfEfFfGfHf'dIfJfKfLfaeMfNfOfbe(d)dPfceQfRfSfTfUfVfWfXfYfZf0f1f2fX TbUb3f4f5f6fb 5 7f6 8f7 9f8 !f9 #f! $f# %f$ 'f% (f' )f( *f) +f* ,f+ -f, .f- /f. :f/ ;f: =f; ?f= @f? [f@ ]f[ ^f] _f^ `f_ {f` |f{ }f| ~fagbgcg*dVbWb+d,d-d.d/d:d;d=dkdldXbmdYbndodZb0bpdqdrd1bsd2b3b4b5b6b7b8b9b!btd#b$b%b'bud(b)bvdwdxdyd*bzd+bAdBd,b-bCdDdEd.bFd/b:b;b=b?b@b[b]b^bGd_b`b{b|bHd}b~bIdJdKdLdacMdbcNdOdccdcPdQdRdecSdfcgchcicjckclcmcncTdocpcqcrcUdsctcVdWd?ddgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g@d[d0d$g%g} 'g(g)g*g+g,g-g~ .g/gfe:g;gge=g?g@g[g]g^g_g`g{g|g}g3dbb~g4dcbahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#iLc$i%i'iMc(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjdbFjebGjfbHjgbIjybJjzbKjlbLjmbMjnbNjAbOjBbPjCbQjDbRjjbSjkbTjobUjEbVjpbWjFbXjGbYjHbZjIb0jqb1jJb2jrb3jsb4jtb5jub6jKb7jLb8jMb9jNb!jOb#jPb$jQb%jRb'jSb(jvb)jwb*jxb+j,j-j.j/j:j;j=j?j@j[j]j^j_j`jab{j|j}j~jhbakbkckdkekibfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk0k1k2k3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzlAlBl
221 else:
222 return result[1:] 2a k l m =cn ?co p q DcEcFc@c[c]cc d e f g h t u v ^c_c`c{c|c}cw x y z A B C D E F G H I J K L M N O P Q R S T U V W b 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } 3dbb4dcbLcMcdbebfbgbybzblbmbnbAbBbCbDbjbkbobEbpbFbGbHbIbqbJbrbsbtbubKbLbMbNbObPbQbRbSbvbwbxbabhbib
225cpdef check_or_create_options(type cls, options, str options_description="", bint keep_none=False):
226 """
227 Create the specified options dataclass from a dictionary of options or None.
228 """
229 if options is None: 2k l m =cn ?co p q DcEcFc@c[c]cc r d e f s g h t u v ^c_c`c{c|c}cw x y z A B C D E F G H I J K L M N O P Q R S T U V W 8n9nEl!nFl#n$n%nGl'nHl(ni )nj *n{d|dneoe}d~dpeqeKeLeIl+n,n-n.n/n:nid;n~c=nad?nbd@ncd[nxcycdd]ned^n_n`n{n|nZ 0 1 2 3 4 }n~naobocodojdGcuqeoJlucKlvqfowqgohoiojokolomoLlMlNlhdnoX TbUbCcvcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+cb 5 Tp6 Up7 Vp8 Wp9 Xp! Yp# Zp$ 0p% 1p' 2p( 3n) 4n* 3p+ 4p, 5p- 6p. 7p/ 8p: 9p; !p= #p? $p@ %p[ 'p] (p^ 9d_ )p` *p{ +p| ,pOlVbWbPlQlkdldXbmdYbndodZb0bpdqdrd1bsd2b3b4b5b6b7b8b9b!btd#b$b%b'bud(b)bvdwdxdyd*bzd+bAdBd,b-bCdDdEd.bFd/b:b;b=b?b@b[b]b^bGd_b`b{b|bHd}b~bIdJdKdLdacMdbcNdOdccdcPdQdRdecSdfcgchcicjckclcmcncTdocpcqcrcUdsctcVdWdoopoHcqoIcXdYdZdrosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4oXnYnZn0n1n2n5o0d6oJc7o8ozcAcY Bc} RlSlTlUlwcVl~ WlXlYlZl0l1l2l3l4l5l6l7l8l9l!lbbcb#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMm!d1d2dKcfdNm9oOmPm!oQmRm#oSm$oTmUm%ohe,cieVmWmXmYm'oZm0m(oMe)o1m5d2m-c.c3mNe*o+o4m6d5m6m,o7m8m-oje/cke9m!m#m$m.o%m'm/oOe:o(m7d)m:c;c*mPe;o=o+m8d,m-m?o.m/m:m;m=m@o?m[o@m[m]o]m^o^m_m_o`m`o{m|m{o}m|o~man}obn~ocndnapenbpfngnhncpindpjnknlnepEpFpdbebfpfbgbybzblbmbnbAbBbCbDbjbkbobEbpbFbGbHbIbqbJbrbsbtbubKbLbMbNbObPbQbRbSbvbwbxbmngdGpHpIpJpKpLpMpnnNpOpPpQpRpSpQeReonpnqnabrngphpsn-p.p/p:phb;p=p?p@p[pibipjpkplpmpnpopppqprpsptpupvpwpxptnypzpApBpCpDpunvnwnxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUn
230 if keep_none: 2k l m =cn ?co p q DcEcFc@c[c]cc r d e f s g h t u v ^c_c`c{c|c}cw x y z A B C D E F G H I J K L M N O P Q R S T U V W i j {d|dneoe}d~dpeqeKeLeIl~cadbdcdxcycddedZ 0 1 2 3 4 }n~naobocodojdGcuqeoJlucKlfogohoiojokolomoLlMlNlhdnoX TbUbvcVbWbPlQlkdldXbmdYbndodZb0bpdqdrd1bsd2b3b4b5b6b7b8b9b!btd#b$b%b'bud(b)bvdwdxdyd*bzd+bAdBd,b-bCdDdEd.bFd/b:b;b=b?b@b[b]b^bGd_b`b{b|bHd}b~bIdJdKdLdacMdbcNdOdccdcPdQdRdecSdfcgchcicjckclcmcncTdocpcqcrcUdsctcVdWdoopoHcqoIcXdZd0d6oJcRlSlTlUlwcVl~ WlXlYlZl0l1l2l3l4l5l6l7l8lbbcb#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmKcNm9oOmPm!oQmRm#oSm$oTmUm%ohe,cieVmWmXmYm'oZm0m(oMe)o1m5d2m-c.c3mNe*o+o4m6d5m6m,o7m8m-oje/cke9m!m#m$m.o%m'm/oOe:o(m7d)m:c;c*mPe;o=o+m8d,m-m?o.m/m:m;m=m@o?m[o@m[m]o]m^o^m_m_o`m`o{m|m{o}m|o~man}obn~ocndnapenbpfngnhncpindpjnknlnepebmngdonpnqnrngphpsnhbibkplpmpnpqprpsptpwptnypBpCpunvnwnxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUn
231 return options 2DcEcFcc r d e f s g h jdGcPlQloopoqoXdZd6owcNmQmSmhe,cieVmYmMeNe6mje/cke9m$mOePe-m?m]m`m}mbneninunvnwnxnynznAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUn
232 return cls() 2k l m =cn ?co p q DcEcFc@c[c]cc r d e f s g h t u v ^c_c`c{c|c}cw x y z A B C D E F G H I J K L M N O P Q R S T U V W i j {d|dneoe}d~dpeqeKeLeIl~cadbdcdxcycddedZ 0 1 2 3 4 }n~naobocodouqeoJlucKlfogohoiojokolomoLlMlNlhdnoX TbUbvcVbWbkdldXbmdYbndodZb0bpdqdrd1bsd2b3b4b5b6b7b8b9b!btd#b$b%b'bud(b)bvdwdxdyd*bzd+bAdBd,b-bCdDdEd.bFd/b:b;b=b?b@b[b]b^bGd_b`b{b|bHd}b~bIdJdKdLdacMdbcNdOdccdcPdQdRdecSdfcgchcicjckclcmcncTdocpcqcrcUdsctcVdWdHcIc0dJcRlSlTlUlwcVl~ WlXlYlZl0l1l2l3l4l5l6l7l8lbbcb#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmKc9oOmPm!oRm#o$oTmUm%oheieWmXm'oZm0m(oMe)o1m5d2m-c.c3mNe*o+o4m6d5m,o7m8m-ojeke!m#m.o%m'm/oOe:o(m7d)m:c;c*mPe;o=o+m8d,m?o.m/m:m;m=m@o[o@m[m]o^o^m_m_o`o{m|m{o|o~man}o~ocndnapbpfngnhncpdpjnknlnepebmngdonpnqnrngphpsnhbibkplpmpnpqprpsptpwptnypBpCp
233 elif isinstance(options, cls): 2k l m n o p q c r d e f s g h t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W 8n9nEl!nFl#n$n%nGl'nHl(ni )nj *n{d|dneoe}d~dpeqeKeLeIl+n,n-n.n/n:nid;n=n?n@n[nxcyc]n^n_n`n{n|nZ 0 1 2 3 4 JlucKlvqwqLlMlNlhdX CcvcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+cb 5 Tp6 Up7 Vp8 Wp9 Xp! Yp# Zp$ 0p% 1p' 2p( 3n) 4n* 3p+ 4p, 5p- 6p. 7p/ 8p: 9p; !p= #p? $p@ %p[ 'p] (p^ 9d_ )p` *p{ +p| ,pOlHcIcYdrosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4oXnYnZn0n1n2n5oJc7o8ozcAcY Bc} wc9l!l!d1d2dKcfdEpFpdbfpfbgbybzblbmbnbAbBbCbDbjbkbobEbpbFbGbHbIbqbJbrbsbtbubKbLbMbNbObPbQbRbSbvbwbxbGpHpIpJpKpLpMpnnNpOpPpQpRpSpQeReab-p.p/p:p;p=p?p@p[pipjpopppupvpxptnzpApDp
234 return options 2k l m n o p q c r d e f s g h t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W 8n9nEl!nFl#n$n%nGl'nHl(ni )nj *nneoepeqeIl+n,n-n.n/n:nid;n=n?n@n[nxcyc]n^n_n`n{n|nZ 0 1 2 3 4 JlucKlvqwqLlMlNlhdX CcvcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+cb 5 Tp6 Up7 Vp8 Wp9 Xp! Yp# Zp$ 0p% 1p' 2p( 3n) 4n* 3p+ 4p, 5p- 6p. 7p/ 8p: 9p; !p= #p? $p@ %p[ 'p] (p^ 9d_ )p` *p{ +p| ,pOlHcIcYdrosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo0o1o2o3o4o5oJc7o8ozcAcY Bc} wc9l!l!d1d2dKcfdEpFpdbfpfbgbybzblbmbnbAbBbCbDbjbkbobEbpbFbGbHbIbqbJbrbsbtbubKbLbMbNbObPbQbRbSbvbwbxbGpHpIpJpKpLpMpnnNpOpPpQpRpSpQeRe-p.p/p:p;p=p?p@p[pipjpopppupvpxptnzpApDp
235 elif isinstance(options, dict): 2{d|d}d~dKeLeCcXnYnZn0n1n2nab
236 return cls(**options) 2{d|d}d~dKeLeCcXnYnZn0n1n2nab
237 else:
238 raise TypeError(
239 f"The {options_description} must be provided as an object "
240 f"of type {cls.__name__} or as a dict with valid {options_description}. "
241 f"The provided object is '{options}'."
242 )
245def _handle_boolean_option(option: bool) -> str:
246 """
247 Convert a boolean option to a string representation.
248 """
249 return "true" if bool(option) else "false" 2b 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } lbmbnbpbtbubvbwbxbFy
252def precondition(checker: Callable[..., None], str what="") -> Callable:
253 """
254 A decorator that adds checks to ensure any preconditions are met.
256 Args:
257 checker: The function to call to check whether the preconditions are met. It has
258 the same signature as the wrapped function with the addition of the keyword argument `what`.
259 what: A string that is passed in to `checker` to provide context information.
261 Returns:
262 Callable: A decorator that creates the wrapping.
263 """
265 def outer(wrapped_function):
266 """
267 A decorator that actually wraps the function for checking preconditions.
268 """
270 @functools.wraps(wrapped_function)
271 def inner(*args, **kwargs):
272 """
273 Check preconditions and if they are met, call the wrapped function.
274 """
275 checker(*args, **kwargs, what=what)
276 result = wrapped_function(*args, **kwargs)
278 return result
280 return inner
282 return outer
285def is_sequence(obj):
286 """
287 Check if the given object is a sequence (list or tuple).
288 """
289 return isinstance(obj, Sequence) 2i j ucX CcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c3n4njbkbobqbrbsbQeRe
292def is_nested_sequence(obj):
293 """
294 Check if the given object is a nested sequence (list or tuple with atleast one list or tuple element).
295 """
296 return is_sequence(obj) and any(is_sequence(elem) for elem in obj) 2jbkb
299@functools.lru_cache
300def get_binding_version():
301 try:
302 major_minor = importlib.metadata.version("cuda-bindings").split(".")[:2]
303 except importlib.metadata.PackageNotFoundError:
304 major_minor = importlib.metadata.version("cuda-python").split(".")[:2]
305 return tuple(int(v) for v in major_minor)
308class Transaction:
309 """
310 A context manager for transactional operations with undo capability.
312 The Transaction class allows you to register undo actions (callbacks) that will be executed
313 if the transaction is not committed before exiting the context. This is useful for managing
314 resources or operations that need to be rolled back in case of errors or early exits.
316 Usage:
317 with Transaction() as txn:
318 txn.append(some_cleanup_function, arg1, arg2)
319 # ... perform operations ...
320 txn.commit() # Disarm undo actions; nothing will be rolled back on exit
322 Methods:
323 append(fn, *args, **kwargs): Register an undo action to be called on rollback.
324 commit(): Disarm all undo actions; nothing will be rolled back on exit.
325 """
326 def __init__(self):
327 self._stack = ExitStack() 2zcAcY Bc
328 self._entered = False 2zcAcY Bc
330 def __enter__(self):
331 self._stack.__enter__() 2zcAcY Bc
332 self._entered = True 2zcAcY Bc
333 return self 2zcAcY Bc
335 def __exit__(self, exc_type, exc, tb):
336 # If exit callbacks remain, they'll run in LIFO order.
337 self._entered = False 2zcAcY Bc
338 return self._stack.__exit__(exc_type, exc, tb) 2zcAcY Bc
340 def append(self, fn, /, *args, **kwargs):
341 """
342 Register an undo action (runs if the with-block exits without commit()).
343 Values are bound now via partial so late mutations don't bite you.
344 """
345 if not self._entered: 2zcAcY Bc
346 raise RuntimeError("Transaction must be entered before append()")
347 self._stack.callback(partial(fn, *args, **kwargs)) 2zcAcY Bc
349 def commit(self):
350 """
351 Disarm all undo actions. After this, exiting the with-block does nothing.
352 """
353 # pop_all() empties this stack so no callbacks are triggered on exit.
354 self._stack.pop_all() 2zcAcY Bc
357# Track whether we've already warned about fork method
358_fork_warning_checked = False
361def reset_fork_warning():
362 """Reset the fork warning check flag for testing purposes.
364 This function is intended for use in tests to allow multiple test runs
365 to check the warning behavior.
366 """
367 global _fork_warning_checked
368 _fork_warning_checked = False 2!d1d2dKcfd
371def check_multiprocessing_start_method():
372 """Check if multiprocessing start method is 'fork' and warn if so."""
373 global _fork_warning_checked
374 if _fork_warning_checked: 2]p^pElFl_p`pGlHli j {d|dneoe}d~dpeqe{p|p}p~paqbqrecq~cadbdcdxcycddeddqeqfqgqZ 0 1 2 3 4 !d1d2dKcfd
375 return 2]p^pElFl_p`pGlHli j {d|dneoe}d~dpeqe{p|p}p~paqbqrecq~cadbdcdxcycddeddqeqfqgqZ 0 1 2 3 4 fd
376 _fork_warning_checked = True 2re!d1d2dKcfd
378 # Common warning message parts
379 common_message = (
380 "CUDA does not support. Forked subprocesses exhibit undefined behavior, " 2re!d1d2dKcfd
381 "including failure to initialize CUDA contexts and devices. Set the start method "
382 "to 'spawn' before creating processes that use CUDA. "
383 "Use: multiprocessing.set_start_method('spawn')"
384 )
386 try: 2re!d1d2dKcfd
387 start_method = multiprocessing.get_start_method() 2re!d1d2dKcfd
388 if start_method == "fork": 2re!d1d2dKcfd
389 message = f"multiprocessing start method is 'fork', which {common_message}" 21d2dKcfd
390 warnings.warn(message, UserWarning, stacklevel=3) 21d2dKcfd
391 except RuntimeError:
392 # get_start_method() can raise RuntimeError if start method hasn't been set
393 # In this case, default is 'fork' on Linux, so we should warn
394 if platform.system() == "Linux":
395 message = (
396 f"multiprocessing start method is not set and defaults to 'fork' on Linux, "
397 f"which {common_message}"
398 )
399 warnings.warn(message, UserWarning, stacklevel=3)