diff --git a/.basedpyright/baseline.json b/.basedpyright/baseline.json index 8acc8c67c..1ae5ce2ea 100644 --- a/.basedpyright/baseline.json +++ b/.basedpyright/baseline.json @@ -5709,7 +5709,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 32, - "endColumn": 46, + "endColumn": 52, "lineCount": 1 } }, @@ -5717,7 +5717,7 @@ "code": "reportUnknownArgumentType", "range": { "startColumn": 32, - "endColumn": 46, + "endColumn": 52, "lineCount": 1 } }, @@ -6173,7 +6173,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 33, - "endColumn": 50, + "endColumn": 56, "lineCount": 1 } }, @@ -6197,7 +6197,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 31, - "endColumn": 48, + "endColumn": 54, "lineCount": 1 } }, @@ -6205,7 +6205,7 @@ "code": "reportUnknownArgumentType", "range": { "startColumn": 31, - "endColumn": 48, + "endColumn": 54, "lineCount": 1 } }, @@ -7444,18 +7444,26 @@ } }, { - "code": "reportPrivateUsage", + "code": "reportUnknownVariableType", "range": { - "startColumn": 21, - "endColumn": 31, + "startColumn": 8, + "endColumn": 23, + "lineCount": 1 + } + }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 43, + "endColumn": 58, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 19, - "endColumn": 67, + "startColumn": 38, + "endColumn": 42, "lineCount": 1 } }, @@ -7492,34 +7500,50 @@ } }, { - "code": "reportUnannotatedClassAttribute", + "code": "reportArgumentType", "range": { - "startColumn": 13, - "endColumn": 19, + "startColumn": 58, + "endColumn": 63, "lineCount": 1 } }, { - "code": "reportUnannotatedClassAttribute", + "code": "reportUnknownVariableType", "range": { - "startColumn": 13, - "endColumn": 20, + "startColumn": 12, + "endColumn": 15, "lineCount": 1 } }, { - "code": "reportUnannotatedClassAttribute", + "code": "reportCallIssue", "range": { - "startColumn": 13, - "endColumn": 19, - "lineCount": 1 + "startColumn": 18, + "endColumn": 43, + "lineCount": 3 } }, { "code": "reportArgumentType", "range": { - "startColumn": 58, - "endColumn": 63, + "startColumn": 41, + "endColumn": 55, + "lineCount": 1 + } + }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 33, + "endColumn": 36, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 8, + "endColumn": 12, "lineCount": 1 } }, @@ -7527,47 +7551,55 @@ "code": "reportUnknownVariableType", "range": { "startColumn": 12, - "endColumn": 18, + "endColumn": 15, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { - "startColumn": 21, - "endColumn": 43, + "startColumn": 18, + "endColumn": 71, "lineCount": 3 } }, { "code": "reportArgumentType", "range": { - "startColumn": 58, - "endColumn": 72, + "startColumn": 46, + "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 27, - "endColumn": 33, + "startColumn": 32, + "endColumn": 35, "lineCount": 1 } }, { - "code": "reportCallIssue", + "code": "reportUnknownVariableType", "range": { - "startColumn": 38, - "endColumn": 65, - "lineCount": 3 + "startColumn": 15, + "endColumn": 23, + "lineCount": 1 } }, { - "code": "reportArgumentType", + "code": "reportUnknownVariableType", "range": { - "startColumn": 66, - "endColumn": 80, + "startColumn": 13, + "endColumn": 17, + "lineCount": 1 + } + }, + { + "code": "reportUnknownVariableType", + "range": { + "startColumn": 15, + "endColumn": 59, "lineCount": 1 } }, @@ -7583,15 +7615,15 @@ "code": "reportUnknownVariableType", "range": { "startColumn": 12, - "endColumn": 18, + "endColumn": 15, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { - "startColumn": 21, - "endColumn": 41, + "startColumn": 18, + "endColumn": 47, "lineCount": 4 } }, @@ -7614,11 +7646,19 @@ { "code": "reportUnknownArgumentType", "range": { - "startColumn": 29, + "startColumn": 32, "endColumn": 35, "lineCount": 1 } }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 35, + "endColumn": 38, + "lineCount": 1 + } + }, { "code": "reportImplicitOverride", "range": { @@ -8835,6 +8875,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 59, + "endColumn": 68, + "lineCount": 1 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -10316,26 +10364,26 @@ } }, { - "code": "reportUnknownMemberType", + "code": "reportUnknownArgumentType", "range": { - "startColumn": 20, - "endColumn": 32, + "startColumn": 27, + "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 32, - "endColumn": 39, + "startColumn": 52, + "endColumn": 60, "lineCount": 1 } }, { - "code": "reportUnknownArgumentType", + "code": "reportUnknownMemberType", "range": { - "startColumn": 47, - "endColumn": 55, + "startColumn": 12, + "endColumn": 24, "lineCount": 1 } }, @@ -10358,128 +10406,48 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 31, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 40, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 48, - "endColumn": 64, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 48, - "endColumn": 64, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 22, - "endColumn": 27, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 22, - "endColumn": 27, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 20, - "endColumn": 32, + "startColumn": 12, + "endColumn": 23, "lineCount": 1 } }, { - "code": "reportReturnType", + "code": "reportOperatorIssue", "range": { - "startColumn": 19, - "endColumn": 25, + "startColumn": 57, + "endColumn": 73, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 25, - "endColumn": 30, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 25, - "endColumn": 42, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 24, - "endColumn": 35, - "lineCount": 1 - } - }, - { - "code": "reportCallIssue", - "range": { - "startColumn": 34, - "endColumn": 58, + "startColumn": 57, + "endColumn": 73, "lineCount": 1 } }, { - "code": "reportArgumentType", + "code": "reportOperatorIssue", "range": { - "startColumn": 52, - "endColumn": 57, + "startColumn": 57, + "endColumn": 73, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 52, - "endColumn": 57, - "lineCount": 1 - } - }, - { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 4, - "endColumn": 12, + "startColumn": 57, + "endColumn": 73, "lineCount": 1 } }, { - "code": "reportUnannotatedClassAttribute", + "code": "reportUnknownArgumentType", "range": { - "startColumn": 4, - "endColumn": 12, + "startColumn": 62, + "endColumn": 67, "lineCount": 1 } }, @@ -10502,8 +10470,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 32, + "startColumn": 12, + "endColumn": 24, "lineCount": 1 } }, @@ -10534,24 +10502,120 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 24, - "endColumn": 35, + "startColumn": 16, + "endColumn": 27, + "lineCount": 1 + } + }, + { + "code": "reportCallIssue", + "range": { + "startColumn": 54, + "endColumn": 78, + "lineCount": 1 + } + }, + { + "code": "reportArgumentType", + "range": { + "startColumn": 72, + "endColumn": 77, + "lineCount": 1 + } + }, + { + "code": "reportArgumentType", + "range": { + "startColumn": 72, + "endColumn": 77, + "lineCount": 1 + } + }, + { + "code": "reportUnknownVariableType", + "range": { + "startColumn": 4, + "endColumn": 12, + "lineCount": 1 + } + }, + { + "code": "reportUnannotatedClassAttribute", + "range": { + "startColumn": 4, + "endColumn": 12, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 22, + "endColumn": 27, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 22, + "endColumn": 27, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 12, + "endColumn": 24, + "lineCount": 1 + } + }, + { + "code": "reportReturnType", + "range": { + "startColumn": 19, + "endColumn": 25, + "lineCount": 1 + } + }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 25, + "endColumn": 30, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 25, + "endColumn": 42, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 16, + "endColumn": 27, "lineCount": 1 } }, { "code": "reportOperatorIssue", "range": { - "startColumn": 70, - "endColumn": 76, + "startColumn": 62, + "endColumn": 68, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 70, - "endColumn": 76, + "startColumn": 62, + "endColumn": 68, "lineCount": 1 } }, @@ -10590,32 +10654,32 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 31, + "startColumn": 12, + "endColumn": 23, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { - "startColumn": 24, - "endColumn": 48, + "startColumn": 53, + "endColumn": 77, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 42, - "endColumn": 47, + "startColumn": 71, + "endColumn": 76, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 42, - "endColumn": 47, + "startColumn": 71, + "endColumn": 76, "lineCount": 1 } }, @@ -10638,8 +10702,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 32, + "startColumn": 12, + "endColumn": 24, "lineCount": 1 } }, @@ -10654,8 +10718,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 31, + "startColumn": 12, + "endColumn": 23, "lineCount": 1 } }, @@ -10678,8 +10742,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 32, + "startColumn": 12, + "endColumn": 24, "lineCount": 1 } }, @@ -10726,8 +10790,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 25, - "endColumn": 36, + "startColumn": 8, + "endColumn": 19, "lineCount": 1 } }, @@ -10750,8 +10814,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 41, + "startColumn": 12, + "endColumn": 33, "lineCount": 1 } }, @@ -10782,32 +10846,32 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 31, + "startColumn": 12, + "endColumn": 23, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { - "startColumn": 24, - "endColumn": 48, + "startColumn": 32, + "endColumn": 56, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 42, - "endColumn": 47, + "startColumn": 50, + "endColumn": 55, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 42, - "endColumn": 47, + "startColumn": 50, + "endColumn": 55, "lineCount": 1 } }, @@ -10846,32 +10910,32 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 31, + "startColumn": 12, + "endColumn": 23, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { - "startColumn": 24, - "endColumn": 48, + "startColumn": 32, + "endColumn": 56, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 42, - "endColumn": 47, + "startColumn": 50, + "endColumn": 55, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 42, - "endColumn": 47, + "startColumn": 50, + "endColumn": 55, "lineCount": 1 } }, @@ -10894,8 +10958,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 41, + "startColumn": 12, + "endColumn": 33, "lineCount": 1 } }, @@ -10910,8 +10974,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 31, + "startColumn": 12, + "endColumn": 23, "lineCount": 1 } }, @@ -10934,8 +10998,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 29, - "endColumn": 38, + "startColumn": 12, + "endColumn": 21, "lineCount": 1 } }, @@ -10974,24 +11038,24 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 24, - "endColumn": 35, + "startColumn": 16, + "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 51, - "endColumn": 68, + "startColumn": 43, + "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 51, - "endColumn": 71, + "startColumn": 43, + "endColumn": 63, "lineCount": 1 } }, @@ -11054,24 +11118,16 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 29, - "endColumn": 39, + "startColumn": 12, + "endColumn": 22, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { - "startColumn": 29, - "endColumn": 53, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 29, - "endColumn": 53, + "startColumn": 12, + "endColumn": 36, "lineCount": 1 } }, @@ -11094,56 +11150,56 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 37, + "startColumn": 12, + "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 52, - "endColumn": 69, + "startColumn": 44, + "endColumn": 61, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { - "startColumn": 52, - "endColumn": 76, + "startColumn": 44, + "endColumn": 68, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 70, - "endColumn": 75, + "startColumn": 62, + "endColumn": 67, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 70, - "endColumn": 75, + "startColumn": 62, + "endColumn": 67, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 70, - "endColumn": 75, + "startColumn": 62, + "endColumn": 67, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 70, - "endColumn": 75, + "startColumn": 62, + "endColumn": 67, "lineCount": 1 } }, @@ -11214,8 +11270,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 16, - "endColumn": 25, + "startColumn": 12, + "endColumn": 21, "lineCount": 1 } }, @@ -11230,24 +11286,24 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 31, + "startColumn": 16, + "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 38, - "endColumn": 55, + "startColumn": 26, + "endColumn": 43, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 56, - "endColumn": 80, + "startColumn": 44, + "endColumn": 68, "lineCount": 1 } }, @@ -11278,8 +11334,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 29, - "endColumn": 46, + "startColumn": 12, + "endColumn": 29, "lineCount": 1 } }, @@ -11310,8 +11366,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 38, + "startColumn": 12, + "endColumn": 30, "lineCount": 1 } }, @@ -11358,8 +11414,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 29, - "endColumn": 46, + "startColumn": 12, + "endColumn": 29, "lineCount": 1 } }, @@ -11390,8 +11446,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 38, + "startColumn": 12, + "endColumn": 30, "lineCount": 1 } }, @@ -11438,8 +11494,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 29, - "endColumn": 46, + "startColumn": 12, + "endColumn": 29, "lineCount": 1 } }, @@ -11470,8 +11526,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 38, + "startColumn": 12, + "endColumn": 30, "lineCount": 1 } }, @@ -11518,8 +11574,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 27, - "endColumn": 44, + "startColumn": 12, + "endColumn": 29, "lineCount": 1 } }, @@ -11534,8 +11590,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 38, + "startColumn": 12, + "endColumn": 30, "lineCount": 1 } }, @@ -11566,8 +11622,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 27, - "endColumn": 44, + "startColumn": 12, + "endColumn": 29, "lineCount": 1 } }, @@ -11582,8 +11638,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 38, + "startColumn": 12, + "endColumn": 30, "lineCount": 1 } }, @@ -11614,8 +11670,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 27, - "endColumn": 44, + "startColumn": 12, + "endColumn": 29, "lineCount": 1 } }, @@ -11630,8 +11686,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 38, + "startColumn": 12, + "endColumn": 30, "lineCount": 1 } }, @@ -11662,56 +11718,64 @@ { "code": "reportArgumentType", "range": { - "startColumn": 36, - "endColumn": 41, + "startColumn": 16, + "endColumn": 21, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 43, - "endColumn": 57, + "startColumn": 23, + "endColumn": 37, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 59, - "endColumn": 69, + "startColumn": 39, + "endColumn": 49, "lineCount": 1 } }, { - "code": "reportUnknownMemberType", + "code": "reportOperatorIssue", "range": { - "startColumn": 16, - "endColumn": 26, + "startColumn": 25, + "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 16, - "endColumn": 71, + "startColumn": 25, + "endColumn": 72, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 8, + "endColumn": 18, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { - "startColumn": 40, - "endColumn": 45, + "startColumn": 32, + "endColumn": 37, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { - "startColumn": 53, - "endColumn": 61, + "startColumn": 45, + "endColumn": 53, "lineCount": 1 } }, @@ -11734,8 +11798,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 25, - "endColumn": 34, + "startColumn": 8, + "endColumn": 17, "lineCount": 1 } }, @@ -11766,8 +11830,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 35, + "startColumn": 12, + "endColumn": 27, "lineCount": 1 } }, @@ -11790,8 +11854,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 29, - "endColumn": 45, + "startColumn": 12, + "endColumn": 28, "lineCount": 1 } }, @@ -11830,32 +11894,32 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 37, + "startColumn": 12, + "endColumn": 29, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { - "startColumn": 46, - "endColumn": 70, + "startColumn": 38, + "endColumn": 62, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 64, - "endColumn": 69, + "startColumn": 56, + "endColumn": 61, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { - "startColumn": 64, - "endColumn": 69, + "startColumn": 56, + "endColumn": 61, "lineCount": 1 } }, @@ -11870,8 +11934,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 25, - "endColumn": 35, + "startColumn": 8, + "endColumn": 18, "lineCount": 1 } }, @@ -11894,8 +11958,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 25, - "endColumn": 38, + "startColumn": 8, + "endColumn": 21, "lineCount": 1 } }, @@ -11934,24 +11998,16 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 25, - "endColumn": 35, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 25, - "endColumn": 62, + "startColumn": 8, + "endColumn": 18, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { - "startColumn": 50, - "endColumn": 55, + "startColumn": 33, + "endColumn": 38, "lineCount": 1 } }, @@ -12262,8 +12318,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 42, + "startColumn": 12, + "endColumn": 34, "lineCount": 1 } }, @@ -12278,8 +12334,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 43, + "startColumn": 12, + "endColumn": 35, "lineCount": 1 } }, @@ -12294,8 +12350,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 42, + "startColumn": 12, + "endColumn": 34, "lineCount": 1 } }, @@ -12310,8 +12366,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 43, + "startColumn": 12, + "endColumn": 35, "lineCount": 1 } }, @@ -12342,8 +12398,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 42, + "startColumn": 12, + "endColumn": 34, "lineCount": 1 } }, @@ -12398,8 +12454,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 42, + "startColumn": 12, + "endColumn": 34, "lineCount": 1 } }, @@ -12422,8 +12478,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 43, + "startColumn": 12, + "endColumn": 35, "lineCount": 1 } }, @@ -12454,8 +12510,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 42, + "startColumn": 12, + "endColumn": 34, "lineCount": 1 } }, @@ -12478,8 +12534,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 43, + "startColumn": 12, + "endColumn": 35, "lineCount": 1 } }, @@ -12510,8 +12566,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 42, + "startColumn": 12, + "endColumn": 34, "lineCount": 1 } }, @@ -12534,8 +12590,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 43, + "startColumn": 12, + "endColumn": 35, "lineCount": 1 } }, @@ -12550,8 +12606,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 30, + "startColumn": 12, + "endColumn": 22, "lineCount": 1 } }, @@ -12566,8 +12622,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 30, + "startColumn": 12, + "endColumn": 22, "lineCount": 1 } }, @@ -12582,8 +12638,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 29, - "endColumn": 39, + "startColumn": 12, + "endColumn": 22, "lineCount": 1 } }, @@ -13292,58 +13348,58 @@ } }, { - "code": "reportCallIssue", + "code": "reportUnknownVariableType", "range": { - "startColumn": 24, - "endColumn": 81, - "lineCount": 2 + "startColumn": 16, + "endColumn": 19, + "lineCount": 1 } }, { - "code": "reportUnknownArgumentType", + "code": "reportCallIssue", "range": { - "startColumn": 24, - "endColumn": 81, - "lineCount": 2 + "startColumn": 22, + "endColumn": 88, + "lineCount": 3 } }, { "code": "reportArgumentType", "range": { - "startColumn": 47, - "endColumn": 65, + "startColumn": 27, + "endColumn": 45, "lineCount": 1 } }, { - "code": "reportUnknownMemberType", + "code": "reportUnknownArgumentType", "range": { - "startColumn": 20, - "endColumn": 30, + "startColumn": 41, + "endColumn": 44, "lineCount": 1 } }, { - "code": "reportUnknownArgumentType", + "code": "reportUnknownMemberType", "range": { - "startColumn": 20, - "endColumn": 79, + "startColumn": 12, + "endColumn": 22, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { - "startColumn": 48, - "endColumn": 53, + "startColumn": 40, + "endColumn": 45, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { - "startColumn": 61, - "endColumn": 69, + "startColumn": 53, + "endColumn": 61, "lineCount": 1 } }, @@ -13627,67 +13683,19 @@ "lineCount": 1 } }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 16, - "endColumn": 22, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 16, - "endColumn": 22, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 24, - "endColumn": 29, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 24, - "endColumn": 29, - "lineCount": 1 - } - }, { "code": "reportUnusedParameter", - "range": { - "startColumn": 24, - "endColumn": 29, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", "range": { "startColumn": 31, - "endColumn": 35, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 31, - "endColumn": 35, + "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { - "startColumn": 31, - "endColumn": 35, + "startColumn": 43, + "endColumn": 47, "lineCount": 1 } }, @@ -13699,51 +13707,11 @@ "lineCount": 1 } }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 12, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 12, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 28, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 28, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 21, - "endColumn": 66, - "lineCount": 1 - } - }, { "code": "reportCallIssue", "range": { - "startColumn": 54, - "endColumn": 59, + "startColumn": 37, + "endColumn": 42, "lineCount": 1 } }, @@ -13814,72 +13782,64 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 12, - "endColumn": 26, + "startColumn": 39, + "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 12, - "endColumn": 26, + "startColumn": 39, + "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 28, - "endColumn": 40, + "startColumn": 55, + "endColumn": 67, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 28, - "endColumn": 40, + "startColumn": 55, + "endColumn": 67, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 42, - "endColumn": 55, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 42, - "endColumn": 55, + "startColumn": 69, + "endColumn": 82, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 12, - "endColumn": 66, + "startColumn": 69, + "endColumn": 82, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { - "startColumn": 35, - "endColumn": 40, + "startColumn": 27, + "endColumn": 32, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { - "startColumn": 48, - "endColumn": 56, + "startColumn": 40, + "endColumn": 48, "lineCount": 1 } }, @@ -14247,7 +14207,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 13, - "endColumn": 27, + "endColumn": 33, "lineCount": 1 } }, @@ -14271,7 +14231,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 58, - "endColumn": 66, + "endColumn": 72, "lineCount": 1 } }, @@ -14295,7 +14255,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 55, - "endColumn": 63, + "endColumn": 69, "lineCount": 1 } }, @@ -14412,18 +14372,10 @@ } }, { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 12, - "endColumn": 13, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", + "code": "reportUnknownArgumentType", "range": { - "startColumn": 12, - "endColumn": 23, + "startColumn": 24, + "endColumn": 40, "lineCount": 1 } }, @@ -14871,7 +14823,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 13, - "endColumn": 32, + "endColumn": 38, "lineCount": 1 } }, @@ -14879,7 +14831,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 13, - "endColumn": 31, + "endColumn": 37, "lineCount": 1 } }, @@ -14903,7 +14855,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 58, - "endColumn": 66, + "endColumn": 72, "lineCount": 1 } }, @@ -14927,7 +14879,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 55, - "endColumn": 63, + "endColumn": 69, "lineCount": 1 } }, @@ -15020,18 +14972,10 @@ } }, { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 12, - "endColumn": 13, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", + "code": "reportUnknownArgumentType", "range": { - "startColumn": 12, - "endColumn": 23, + "startColumn": 24, + "endColumn": 40, "lineCount": 1 } }, @@ -15115,6 +15059,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 20, + "endColumn": 26, + "lineCount": 1 + } + }, { "code": "reportUnknownVariableType", "range": { @@ -15163,14 +15115,6 @@ "lineCount": 1 } }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 20, - "endColumn": 26, - "lineCount": 1 - } - }, { "code": "reportUnknownArgumentType", "range": { @@ -15335,7 +15279,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 58, - "endColumn": 66, + "endColumn": 72, "lineCount": 1 } }, @@ -15359,7 +15303,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 55, - "endColumn": 63, + "endColumn": 69, "lineCount": 1 } }, @@ -15388,18 +15332,10 @@ } }, { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 12, - "endColumn": 13, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", + "code": "reportUnknownArgumentType", "range": { - "startColumn": 12, - "endColumn": 23, + "startColumn": 24, + "endColumn": 40, "lineCount": 1 } }, @@ -15788,15 +15724,15 @@ } }, { - "code": "reportUnusedParameter", + "code": "reportUnknownParameterType", "range": { - "startColumn": 10, - "endColumn": 16, + "startColumn": 18, + "endColumn": 23, "lineCount": 1 } }, { - "code": "reportUnknownParameterType", + "code": "reportMissingParameterType", "range": { "startColumn": 18, "endColumn": 23, @@ -15804,7 +15740,7 @@ } }, { - "code": "reportMissingParameterType", + "code": "reportUnusedParameter", "range": { "startColumn": 18, "endColumn": 23, @@ -15823,7 +15759,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 39, - "endColumn": 52, + "endColumn": 53, "lineCount": 1 } }, @@ -15831,23 +15767,23 @@ "code": "reportUnknownArgumentType", "range": { "startColumn": 39, - "endColumn": 52, + "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 54, - "endColumn": 65, + "startColumn": 55, + "endColumn": 67, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 54, - "endColumn": 65, + "startColumn": 55, + "endColumn": 67, "lineCount": 1 } }, @@ -15979,27 +15915,11 @@ "lineCount": 1 } }, - { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 4, - "endColumn": 10, - "lineCount": 1 - } - }, { "code": "reportCallIssue", "range": { - "startColumn": 34, - "endColumn": 39, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 4, - "endColumn": 20, + "startColumn": 25, + "endColumn": 30, "lineCount": 1 } }, @@ -17523,59 +17443,11 @@ "lineCount": 1 } }, - { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 4, - "endColumn": 10, - "lineCount": 1 - } - }, { "code": "reportCallIssue", "range": { - "startColumn": 56, - "endColumn": 61, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 4, - "endColumn": 17, - "lineCount": 1 - } - }, - { - "code": "reportAttributeAccessIssue", - "range": { - "startColumn": 8, - "endColumn": 17, - "lineCount": 1 - } - }, - { - "code": "reportAttributeAccessIssue", - "range": { - "startColumn": 8, - "endColumn": 17, - "lineCount": 1 - } - }, - { - "code": "reportAttributeAccessIssue", - "range": { - "startColumn": 8, - "endColumn": 17, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 18, - "endColumn": 24, + "startColumn": 47, + "endColumn": 52, "lineCount": 1 } }, @@ -17955,27 +17827,11 @@ "lineCount": 1 } }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 4, - "endColumn": 17, - "lineCount": 1 - } - }, - { - "code": "reportOptionalMemberAccess", - "range": { - "startColumn": 8, - "endColumn": 17, - "lineCount": 1 - } - }, { "code": "reportCallIssue", "range": { - "startColumn": 54, - "endColumn": 59, + "startColumn": 40, + "endColumn": 45, "lineCount": 1 } }, @@ -18211,27 +18067,11 @@ "lineCount": 1 } }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 4, - "endColumn": 17, - "lineCount": 1 - } - }, - { - "code": "reportOptionalMemberAccess", - "range": { - "startColumn": 8, - "endColumn": 17, - "lineCount": 1 - } - }, { "code": "reportCallIssue", "range": { - "startColumn": 55, - "endColumn": 60, + "startColumn": 41, + "endColumn": 46, "lineCount": 1 } }, @@ -18580,31 +18420,7 @@ } }, { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 29, - "endColumn": 56, - "lineCount": 1 - } - }, - { - "code": "reportUnknownLambdaType", - "range": { - "startColumn": 37, - "endColumn": 41, - "lineCount": 1 - } - }, - { - "code": "reportUnknownLambdaType", - "range": { - "startColumn": 45, - "endColumn": 51, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", + "code": "reportCallIssue", "range": { "startColumn": 58, "endColumn": 61, @@ -18660,31 +18476,7 @@ } }, { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 29, - "endColumn": 56, - "lineCount": 1 - } - }, - { - "code": "reportUnknownLambdaType", - "range": { - "startColumn": 37, - "endColumn": 41, - "lineCount": 1 - } - }, - { - "code": "reportUnknownLambdaType", - "range": { - "startColumn": 45, - "endColumn": 51, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", + "code": "reportCallIssue", "range": { "startColumn": 58, "endColumn": 61, @@ -19020,45 +18812,13 @@ } }, { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 29, - "endColumn": 56, - "lineCount": 1 - } - }, - { - "code": "reportUnknownLambdaType", - "range": { - "startColumn": 37, - "endColumn": 41, - "lineCount": 1 - } - }, - { - "code": "reportUnknownLambdaType", - "range": { - "startColumn": 45, - "endColumn": 51, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", + "code": "reportCallIssue", "range": { "startColumn": 58, "endColumn": 61, "lineCount": 1 } }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 63, - "endColumn": 64, - "lineCount": 1 - } - }, { "code": "reportUnknownVariableType", "range": { @@ -19182,32 +18942,40 @@ { "code": "reportUnknownArgumentType", "range": { - "startColumn": 26, - "endColumn": 27, + "startColumn": 8, + "endColumn": 9, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 48, - "endColumn": 53, + "startColumn": 30, + "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 64, - "endColumn": 72, + "startColumn": 46, + "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 64, - "endColumn": 72, + "startColumn": 46, + "endColumn": 60, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 4, + "endColumn": 20, "lineCount": 1 } }, @@ -19470,48 +19238,64 @@ { "code": "reportUnknownArgumentType", "range": { - "startColumn": 26, - "endColumn": 27, + "startColumn": 8, + "endColumn": 9, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 29, - "endColumn": 30, + "startColumn": 11, + "endColumn": 12, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 51, - "endColumn": 56, + "startColumn": 33, + "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 21, - "endColumn": 29, + "startColumn": 17, + "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 21, - "endColumn": 40, + "startColumn": 17, + "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 32, - "endColumn": 40, + "startColumn": 34, + "endColumn": 48, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 4, + "endColumn": 20, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 8, + "endColumn": 24, "lineCount": 1 } }, @@ -19646,48 +19430,64 @@ { "code": "reportUnknownArgumentType", "range": { - "startColumn": 26, - "endColumn": 27, + "startColumn": 8, + "endColumn": 9, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 29, - "endColumn": 30, + "startColumn": 11, + "endColumn": 12, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 51, - "endColumn": 56, + "startColumn": 33, + "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 21, - "endColumn": 29, + "startColumn": 17, + "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 21, - "endColumn": 40, + "startColumn": 17, + "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 32, - "endColumn": 40, + "startColumn": 34, + "endColumn": 48, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 4, + "endColumn": 20, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 8, + "endColumn": 24, "lineCount": 1 } }, @@ -19854,64 +19654,88 @@ { "code": "reportUnknownArgumentType", "range": { - "startColumn": 26, - "endColumn": 32, + "startColumn": 8, + "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 34, - "endColumn": 35, + "startColumn": 16, + "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 37, - "endColumn": 38, + "startColumn": 19, + "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 59, - "endColumn": 64, + "startColumn": 41, + "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 21, - "endColumn": 34, + "startColumn": 17, + "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 21, - "endColumn": 56, + "startColumn": 17, + "endColumn": 70, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 37, - "endColumn": 45, + "startColumn": 39, + "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 48, - "endColumn": 56, + "startColumn": 56, + "endColumn": 70, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 4, + "endColumn": 25, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 4, + "endColumn": 20, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 8, + "endColumn": 24, "lineCount": 1 } }, @@ -20030,24 +19854,32 @@ { "code": "reportUnknownArgumentType", "range": { - "startColumn": 30, - "endColumn": 31, + "startColumn": 12, + "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 55, - "endColumn": 63, + "startColumn": 37, + "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 55, - "endColumn": 63, + "startColumn": 37, + "endColumn": 51, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 8, + "endColumn": 24, "lineCount": 1 } }, @@ -20278,151 +20110,87 @@ { "code": "reportUnknownArgumentType", "range": { - "startColumn": 30, - "endColumn": 36, + "startColumn": 12, + "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 38, - "endColumn": 39, + "startColumn": 20, + "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 61, - "endColumn": 66, + "startColumn": 43, + "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 25, - "endColumn": 33, + "startColumn": 21, + "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 25, - "endColumn": 49, + "startColumn": 21, + "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 36, - "endColumn": 49, + "startColumn": 38, + "endColumn": 57, "lineCount": 1 } }, { - "code": "reportUnknownVariableType", + "code": "reportUnknownMemberType", "range": { - "startColumn": 11, - "endColumn": 12, + "startColumn": 8, + "endColumn": 24, "lineCount": 1 } }, { - "code": "reportUnknownVariableType", + "code": "reportUnknownMemberType", "range": { - "startColumn": 0, - "endColumn": 10, + "startColumn": 8, + "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownVariableType", - "range": { - "startColumn": 0, - "endColumn": 10, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 4, - "endColumn": 10, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 11, - "endColumn": 12, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", "range": { "startColumn": 11, "endColumn": 12, "lineCount": 1 } }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 14, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 14, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 38, - "endColumn": 50, - "lineCount": 1 - } - }, { "code": "reportUnknownVariableType", "range": { - "startColumn": 8, - "endColumn": 20, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 23, - "endColumn": 30, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 32, - "endColumn": 44, + "startColumn": 0, + "endColumn": 10, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { - "startColumn": 4, + "startColumn": 0, "endColumn": 10, "lineCount": 1 } @@ -20442,70 +20210,6 @@ "endColumn": 47, "lineCount": 1 } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 29, - "endColumn": 38, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 29, - "endColumn": 38, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 40, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 40, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 59, - "endColumn": 67, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 4, - "endColumn": 20, - "lineCount": 1 - } - }, - { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 15, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 15, - "endColumn": 21, - "lineCount": 1 - } } ], "./pyopencl/bitonic_sort.py": [ @@ -20689,7 +20393,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 30, - "endColumn": 40, + "endColumn": 46, "lineCount": 1 } }, @@ -25671,27 +25375,11 @@ "lineCount": 1 } }, - { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 8, - "endColumn": 14, - "lineCount": 1 - } - }, { "code": "reportCallIssue", "range": { - "startColumn": 43, - "endColumn": 48, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 8, - "endColumn": 24, + "startColumn": 34, + "endColumn": 39, "lineCount": 1 } }, @@ -26119,19 +25807,11 @@ "lineCount": 1 } }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 4, - "endColumn": 20, - "lineCount": 1 - } - }, { "code": "reportCallIssue", "range": { - "startColumn": 42, - "endColumn": 47, + "startColumn": 25, + "endColumn": 30, "lineCount": 1 } }, @@ -26271,19 +25951,11 @@ "lineCount": 1 } }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 4, - "endColumn": 20, - "lineCount": 1 - } - }, { "code": "reportCallIssue", "range": { - "startColumn": 44, - "endColumn": 49, + "startColumn": 27, + "endColumn": 32, "lineCount": 1 } }, @@ -26631,19 +26303,11 @@ "lineCount": 1 } }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 4, - "endColumn": 20, - "lineCount": 1 - } - }, { "code": "reportCallIssue", "range": { - "startColumn": 45, - "endColumn": 50, + "startColumn": 28, + "endColumn": 33, "lineCount": 1 } }, @@ -26839,35 +26503,19 @@ "lineCount": 1 } }, - { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 4, - "endColumn": 10, - "lineCount": 1 - } - }, { "code": "reportCallIssue", "range": { - "startColumn": 36, - "endColumn": 41, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 4, - "endColumn": 17, + "startColumn": 27, + "endColumn": 32, "lineCount": 1 } }, { - "code": "reportUnknownMemberType", + "code": "reportCallIssue", "range": { - "startColumn": 4, - "endColumn": 18, + "startColumn": 40, + "endColumn": 48, "lineCount": 1 } }, @@ -27071,35 +26719,27 @@ "lineCount": 1 } }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 4, - "endColumn": 20, - "lineCount": 1 - } - }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 28, - "endColumn": 34, + "startColumn": 11, + "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 36, - "endColumn": 47, + "startColumn": 19, + "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 49, - "endColumn": 57, + "startColumn": 32, + "endColumn": 40, "lineCount": 1 } }, @@ -27343,35 +26983,19 @@ "lineCount": 1 } }, - { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 4, - "endColumn": 10, - "lineCount": 1 - } - }, { "code": "reportCallIssue", "range": { - "startColumn": 43, - "endColumn": 48, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 4, - "endColumn": 22, + "startColumn": 34, + "endColumn": 39, "lineCount": 1 } }, { - "code": "reportUnknownMemberType", + "code": "reportCallIssue", "range": { - "startColumn": 4, - "endColumn": 21, + "startColumn": 47, + "endColumn": 55, "lineCount": 1 } }, @@ -27883,199 +27507,7 @@ "code": "reportUnknownParameterType", "range": { "startColumn": 17, - "endColumn": 18, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 17, - "endColumn": 18, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 20, - "endColumn": 25, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 20, - "endColumn": 25, - "lineCount": 1 - } - }, - { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 4, - "endColumn": 10, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 13, - "endColumn": 27, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 4, - "endColumn": 20, - "lineCount": 1 - } - }, - { - "code": "reportCallIssue", - "range": { - "startColumn": 46, - "endColumn": 51, - "lineCount": 1 - } - }, - { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 11, - "endColumn": 17, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 4, - "endColumn": 13, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 14, - "endColumn": 15, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 14, - "endColumn": 15, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 17, - "endColumn": 18, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 17, - "endColumn": 18, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 20, - "endColumn": 25, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 20, - "endColumn": 25, - "lineCount": 1 - } - }, - { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 4, - "endColumn": 10, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 13, - "endColumn": 27, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 4, - "endColumn": 20, - "lineCount": 1 - } - }, - { - "code": "reportCallIssue", - "range": { - "startColumn": 46, - "endColumn": 51, - "lineCount": 1 - } - }, - { - "code": "reportUnknownVariableType", - "range": { - "startColumn": 11, - "endColumn": 17, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 4, - "endColumn": 13, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 14, - "endColumn": 15, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 14, - "endColumn": 15, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 17, - "endColumn": 22, + "endColumn": 18, "lineCount": 1 } }, @@ -28083,7 +27515,23 @@ "code": "reportMissingParameterType", "range": { "startColumn": 17, - "endColumn": 22, + "endColumn": 18, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 20, + "endColumn": 25, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 20, + "endColumn": 25, "lineCount": 1 } }, @@ -28091,31 +27539,87 @@ "code": "reportUnknownVariableType", "range": { "startColumn": 4, - "endColumn": 6, + "endColumn": 10, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 9, - "endColumn": 23, + "startColumn": 13, + "endColumn": 27, + "lineCount": 1 + } + }, + { + "code": "reportCallIssue", + "range": { + "startColumn": 29, + "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownVariableType", + "range": { + "startColumn": 11, + "endColumn": 17, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", "range": { "startColumn": 4, - "endColumn": 6, + "endColumn": 13, "lineCount": 1 } }, { - "code": "reportUnknownMemberType", + "code": "reportUnknownParameterType", "range": { - "startColumn": 9, - "endColumn": 23, + "startColumn": 14, + "endColumn": 15, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 14, + "endColumn": 15, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 17, + "endColumn": 18, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 17, + "endColumn": 18, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 20, + "endColumn": 25, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 20, + "endColumn": 25, "lineCount": 1 } }, @@ -28127,27 +27631,115 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 13, + "endColumn": 27, + "lineCount": 1 + } + }, { "code": "reportCallIssue", "range": { - "startColumn": 35, - "endColumn": 40, + "startColumn": 29, + "endColumn": 34, "lineCount": 1 } }, { - "code": "reportUnknownMemberType", + "code": "reportUnknownVariableType", + "range": { + "startColumn": 11, + "endColumn": 17, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", "range": { "startColumn": 4, - "endColumn": 16, + "endColumn": 13, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 14, + "endColumn": 15, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 14, + "endColumn": 15, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 17, + "endColumn": 22, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 17, + "endColumn": 22, + "lineCount": 1 + } + }, + { + "code": "reportUnknownVariableType", + "range": { + "startColumn": 4, + "endColumn": 6, "lineCount": 1 } }, { "code": "reportUnknownMemberType", + "range": { + "startColumn": 9, + "endColumn": 23, + "lineCount": 1 + } + }, + { + "code": "reportUnknownVariableType", "range": { "startColumn": 4, - "endColumn": 16, + "endColumn": 6, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 9, + "endColumn": 23, + "lineCount": 1 + } + }, + { + "code": "reportCallIssue", + "range": { + "startColumn": 26, + "endColumn": 31, + "lineCount": 1 + } + }, + { + "code": "reportCallIssue", + "range": { + "startColumn": 39, + "endColumn": 47, "lineCount": 1 } }, @@ -28741,7 +28333,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 8, - "endColumn": 21, + "endColumn": 27, "lineCount": 1 } }, @@ -29041,6 +28633,22 @@ "lineCount": 1 } }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 33, + "endColumn": 37, + "lineCount": 1 + } + }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 33, + "endColumn": 37, + "lineCount": 1 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -29289,6 +28897,22 @@ "lineCount": 1 } }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 33, + "endColumn": 37, + "lineCount": 1 + } + }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 33, + "endColumn": 37, + "lineCount": 1 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -35855,7 +35479,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 16, - "endColumn": 38, + "endColumn": 37, "lineCount": 1 } }, @@ -45848,6 +45472,14 @@ "endColumn": 29, "lineCount": 1 } + }, + { + "code": "reportCallIssue", + "range": { + "startColumn": 8, + "endColumn": 12, + "lineCount": 1 + } } ], "./test/test_clmath.py": [ @@ -45999,14 +45631,6 @@ "lineCount": 1 } }, - { - "code": "reportAttributeAccessIssue", - "range": { - "startColumn": 17, - "endColumn": 23, - "lineCount": 1 - } - }, { "code": "reportAttributeAccessIssue", "range": { @@ -46015,14 +45639,6 @@ "lineCount": 1 } }, - { - "code": "reportAttributeAccessIssue", - "range": { - "startColumn": 17, - "endColumn": 23, - "lineCount": 1 - } - }, { "code": "reportAttributeAccessIssue", "range": { @@ -46030,22 +45646,6 @@ "endColumn": 37, "lineCount": 1 } - }, - { - "code": "reportAttributeAccessIssue", - "range": { - "startColumn": 21, - "endColumn": 27, - "lineCount": 1 - } - }, - { - "code": "reportAttributeAccessIssue", - "range": { - "startColumn": 21, - "endColumn": 27, - "lineCount": 1 - } } ] } diff --git a/pyopencl/algorithm.py b/pyopencl/algorithm.py index 27d5abf0f..b0dfdfc73 100644 --- a/pyopencl/algorithm.py +++ b/pyopencl/algorithm.py @@ -62,7 +62,7 @@ def _extract_extra_args_types_values(extra_args): if isinstance(val, cl_array.Array): extra_args_types.append(VectorArg(val.dtype, name, with_offset=False)) extra_args_values.append(val) - extra_wait_for.extend(val.events) + extra_wait_for.extend(val.write_events) elif isinstance(val, np.generic): extra_args_types.append(ScalarArg(val.dtype, name)) extra_args_values.append(val) @@ -1168,7 +1168,7 @@ def __call__(self, queue, n_objects, *args, **kwargs): data_args.append(arg_val.base_data) if arg_descr.with_offset: data_args.append(arg_val.offset) - wait_for.extend(arg_val.events) + wait_for.extend(arg_val.write_events) else: data_args.append(arg_val) @@ -1187,7 +1187,7 @@ def __call__(self, queue, n_objects, *args, **kwargs): counts = cl_array.empty(queue, (n_objects + 1), index_dtype, allocator=allocator) counts[-1] = 0 - wait_for = wait_for + counts.events + wait_for = wait_for + counts.write_events # The scan will turn the "counts" array into the "starts" array # in-place. @@ -1241,7 +1241,7 @@ def __call__(self, queue, n_objects, *args, **kwargs): info_record.nonempty_indices, info_record.compressed_indices, info_record.num_nonempty_lists, - wait_for=[count_event, *info_record.compressed_indices.events]) + wait_for=[count_event, *info_record.compressed_indices.write_events]) info_record.starts = compressed_counts @@ -1270,13 +1270,13 @@ def __call__(self, queue, n_objects, *args, **kwargs): evt = scan_kernel( starts_ary, size=info_record.num_nonempty_lists, - wait_for=starts_ary.events) + wait_for=starts_ary.write_events) else: evt = scan_kernel(starts_ary, wait_for=[count_event], size=n_objects) starts_ary.setitem(0, 0, queue=queue, wait_for=[evt]) - scan_events.extend(starts_ary.events) + scan_events.extend(starts_ary.write_events) # retrieve count info_record.count = int(starts_ary[-1].get()) @@ -1438,7 +1438,7 @@ def __call__(self, queue, keys, values, nkeys, starts = (cl_array.empty(queue, (nkeys+1), starts_dtype, allocator=allocator) .fill(len(values_sorted_by_key), wait_for=[evt])) - evt, = starts.events + evt, = starts.write_events evt = knl_info.start_finder(starts, keys_sorted_by_key, range=slice(len(keys_sorted_by_key)), diff --git a/pyopencl/array.py b/pyopencl/array.py index 78ca4f1ad..374b86653 100644 --- a/pyopencl/array.py +++ b/pyopencl/array.py @@ -38,7 +38,6 @@ TYPE_CHECKING, Any, ClassVar, - Concatenate, Literal, ParamSpec, cast, @@ -63,7 +62,7 @@ if TYPE_CHECKING: - from collections.abc import Callable, Hashable + from collections.abc import Callable, Hashable, Iterable from numpy.typing import DTypeLike, NDArray @@ -75,6 +74,8 @@ else: _SVMPointer_or_nothing = () +_MAX_EVENT_CLEAR_COUNT = 4 + class _NoValue: pass @@ -217,6 +218,38 @@ def _splay( return (group_count*work_items_per_group,), (work_items_per_group,) +def get_wait_for_events( + *, + outputs: Iterable[Any], inputs: Iterable[Any]) -> cl.WaitList: + # NOTE: + # * outputs need to wait for all reads and writes to finish + # * inputs only need to wait on writes, but not reads + + wait_for: cl.WaitList = [] + for ary in outputs: + if isinstance(ary, Array): + wait_for.extend(ary.write_events) + wait_for.extend(ary.read_events) + + for ary in inputs: + if isinstance(ary, Array): + wait_for.extend(ary.write_events) + + return wait_for + + +def add_write_event(arys: Iterable[Any], evt: cl.Event) -> None: + for ary in arys: + if isinstance(ary, Array): + ary.add_write_event(evt) + + +def add_read_event(arys: Iterable[Any], evt: cl.Event) -> None: + for ary in arys: + if isinstance(ary, Array): + ary.add_read_event(evt) + + # deliberately undocumented for now ARRAY_KERNEL_EXEC_HOOK = None @@ -225,38 +258,60 @@ def _splay( def elwise_kernel_runner( - kernel_getter: Callable[Concatenate[Array, P], cl.Kernel] - ) -> Callable[Concatenate[Array, P], cl.Event]: + kernel_getter: Callable[P, cl.Kernel] + ) -> Callable[P, cl.Event]: """Take a kernel getter of the same signature as the kernel and return a function that invokes that kernel. - Assumes that the zeroth entry in *args* is an :class:`Array`. + The returned callable always takes additional keyword arguments: + + * ``wait_for``: a sequence of events the kernel should wait for. + * ``queue``: the queue to execute the kernel on. + * ``noutputs``: the number of arguments that are considered outputs, e.g. if + the kernel takes 3 positional arguments and the first two are outputs, + this should be set to "2" (see ``frexp``). """ from functools import wraps @wraps(kernel_getter) - def kernel_runner(out: Array, *args: P.args, **kwargs: P.kwargs) -> cl.Event: - assert isinstance(out, Array) + def kernel_runner(*args: P.args, **kwargs: P.kwargs) -> cl.Event: + assert isinstance(args[0], Array) - wait_for = cast("cl.WaitList", kwargs.pop("wait_for", None)) + wait_for = cast("cl.WaitList | None", kwargs.pop("wait_for", None)) queue = cast("cl.CommandQueue | None", kwargs.pop("queue", None)) - if queue is None: - queue = out.queue + noutputs = cast("int", kwargs.pop("noutputs", 1)) + if queue is None: + queue = args[0].queue assert queue is not None - knl = kernel_getter(out, *args, **kwargs) - work_group_info = cast("int", knl.get_work_group_info( + if wait_for is None: + wait_for = [] + + outputs = args[:noutputs] + inputs = args[noutputs:] + + wait_from_args = get_wait_for_events(outputs=outputs, inputs=inputs) + if wait_from_args: + wait_for: cl.WaitList = [*wait_for, *wait_from_args] + + knl = kernel_getter(*args, **kwargs) + work_group_info = knl.get_work_group_info( cl.kernel_work_group_info.WORK_GROUP_SIZE, - queue.device)) - gs, ls = out._get_sizes(queue, work_group_info) + queue.device) + gs, ls = args[0]._get_sizes(queue, work_group_info) # pyright: ignore[reportPrivateUsage] + size = args[0].size - knl_args = (out, *args, out.size) if ARRAY_KERNEL_EXEC_HOOK is not None: - return ARRAY_KERNEL_EXEC_HOOK( # pylint: disable=not-callable - knl, queue, gs, ls, *knl_args, wait_for=wait_for) + evt = ARRAY_KERNEL_EXEC_HOOK( # pylint: disable=not-callable + knl, queue, gs, ls, *args, size, wait_for=wait_for) else: - return knl(queue, gs, ls, *knl_args, wait_for=wait_for) + evt = knl(queue, gs, ls, *args, size, wait_for=wait_for) + + add_write_event(outputs, evt) + add_read_event(inputs, evt) + + return evt return kernel_runner @@ -466,28 +521,27 @@ class Array: .. versionadded:: 2014.1.1 - .. attribute:: events + .. attribute:: write_events - A list of :class:`pyopencl.Event` instances that the current content of - this array depends on. User code may read, but should never modify this - list directly. To update this list, instead use the following methods. + A list of :class:`pyopencl.Event` instances that the current array + depends on for writes. User code should not modify this list directly, + but should use :meth:`add_write_event` to append and :meth:`finish` to + wait on the events. - .. automethod:: add_event + .. attribute:: read_events + + A list of :class:`pyopencl.Event` instances that the current array + depends on for reads. User code should not modify this list directly, but + should use :meth:`add_read_event` to append and :meth:`finish` to wait + on the events. + + .. automethod:: add_write_event + .. automethod:: add_read_event .. automethod:: finish """ __array_priority__: ClassVar[int] = 100 - queue: cl.CommandQueue | None - shape: tuple[int, ...] - dtype: np.dtype[Any] - strides: tuple[int, ...] - events: list[cl.Event] - nbytes: int - size: int - allocator: Allocator | None - base_data: cl.MemoryObjectHolder | cl.SVMPointer | None - def __init__( self, cq: cl.Context | cl.CommandQueue | None, @@ -498,6 +552,10 @@ def __init__( data: Any = None, offset: int = 0, strides: tuple[int, ...] | None = None, + write_events: list[cl.Event] | None = None, + read_events: list[cl.Event] | None = None, + + # NOTE: deprecated events: list[cl.Event] | None = None, # NOTE: following args are used for the fast constructor @@ -624,34 +682,41 @@ def __init__( if alloc_nbytes < 0: raise ValueError("cannot allocate CL buffer with negative size") - self.queue = queue - self.shape = shape - self.dtype = dtype - self.strides = strides - self.events = [] if events is None else events - self.nbytes = alloc_nbytes - self.size = size - self.allocator = allocator + if events is not None: + warn("Passing 'events' is deprecated and will be removed in 2024. " + "Pass either 'write_events' or 'read_events' explicitly.", + DeprecationWarning, stacklevel=2) - if data is None: - if alloc_nbytes == 0: - self.base_data = None + if write_events is None: + write_events = events - else: - if self.allocator is None: + base_data = None + if data is None: + if alloc_nbytes > 0: + if allocator is None: if context is None and queue is not None: context = queue.context - self.base_data = cl.Buffer( + base_data = cl.Buffer( context, cl.mem_flags.READ_WRITE, alloc_nbytes) else: - self.base_data = self.allocator(alloc_nbytes) + base_data = allocator(alloc_nbytes) else: - self.base_data = data - - self.offset = offset - self.context = context - self._flags = _flags + base_data = data + + self.queue: cl.CommandQueue | None = queue + self.context: cl.Context | None = context + self.shape: tuple[int, ...] = shape + self.dtype: np.dtype[Any] = dtype + self.strides: tuple[int, ...] = strides + self.write_events: list[cl.Event] = write_events or [] + self.read_events: list[cl.Event] = read_events or [] + self.nbytes: int = alloc_nbytes + self.size: int = size + self.allocator: Allocator | None = allocator + self.base_data: cl.MemoryObjectHolder | cl.SVMPointer | None = base_data + self.offset: int = offset + self._flags: Any = _flags if __debug__: if queue is not None and isinstance( @@ -663,6 +728,14 @@ def __init__( "than expected, potentially leading to crashes.", InconsistentOpenCLQueueWarning, stacklevel=2) + @property + def events(self): + warn("Using 'events' is deprecated and will be removed in 2024. Prefer " + "either 'write_events' or 'read_events' depending on the situation.", + DeprecationWarning, stacklevel=2) + + return self.write_events + @property def ndim(self): return len(self.shape) @@ -717,15 +790,22 @@ def _new_with_changes(self, # share the same events list. if data is None: - events = None + write_events = read_events = None else: - events = self.events + write_events = self.write_events + read_events = self.read_events - return self.__class__(None, shape, dtype, allocator=allocator, - strides=strides, data=data, offset=offset, - events=events, + result = self.__class__(None, shape, dtype, allocator=allocator, + strides=strides, data=data, offset=offset, events=None, _fast=fast, _context=self.context, _queue=queue, _size=size) + # NOTE: these are set after the fact for backwards compatibility + # since subclasses may have overwritten __init__ and are missing them + result.write_events = write_events or [] + result.read_events = read_events or [] + + return result + def with_queue(self, queue: cl.CommandQueue | None): """Return a copy of *self* with the default queue set to *queue*. @@ -737,8 +817,7 @@ def with_queue(self, queue: cl.CommandQueue | None): if queue is not None: assert queue.context == self.context - return self._new_with_changes(self.base_data, self.offset, - queue=queue) + return self._new_with_changes(self.base_data, self.offset, queue=queue) def _get_sizes(self, queue: cl.CommandQueue, @@ -784,11 +863,12 @@ def set(self, if self.size: queue = queue or self.queue assert queue is not None - event1 = cl.enqueue_copy(queue or self.queue, self.base_data, ary, + + evt = cl.enqueue_copy(queue, self.base_data, ary, dst_offset=self.offset, is_blocking=not async_) - self.add_event(event1) + self.add_write_event(evt) def _get(self, queue: cl.CommandQueue | None = None, @@ -808,7 +888,7 @@ def _get(self, if self.shape != ary.shape: warn("get() between arrays of different shape is deprecated " - "and will be removed in PyCUDA 2017.x", + "and will be removed in PyOpenCL 2017.x", DeprecationWarning, stacklevel=2) assert self.flags.forc, "Array in get() must be contiguous" @@ -822,28 +902,28 @@ def _get(self, if self.size: assert self.base_data is not None - event1 = cast("cl.Event", cl.enqueue_copy(queue, ary, self.base_data, + evt = cl.enqueue_copy(queue, ary, self.base_data, src_offset=self.offset, - wait_for=self.events, is_blocking=not async_)) + wait_for=self.write_events, is_blocking=not async_) - self.add_event(event1) + self.add_read_event(evt) else: - event1 = cl.enqueue_marker(queue, wait_for=self.events) + evt = cl.enqueue_marker(queue, wait_for=self.write_events) if not async_: - event1.wait() + evt.wait() - return ary, event1 + return ary, evt def get(self, - queue: cl.CommandQueue | None = None, - ary: NDArray[Any] | None = None, + queue: cl.CommandQueue | None = None, + ary: NDArray[Any] | None = None, ) -> NDArray[Any]: """Transfer the contents of *self* into *ary* or a newly allocated :class:`numpy.ndarray`. If *ary* is given, it must have the same shape and dtype. """ - ary, _event1 = self._get(queue=queue, ary=ary) + ary, _evt = self._get(queue=queue, ary=ary) return ary @@ -853,9 +933,8 @@ def get_async(self, ) -> tuple[NDArray[Any], cl.Event]: """ Asynchronous version of :meth:`get` which returns a tuple ``(ary, event)`` - containing the host array ``ary`` - and the :class:`pyopencl.NannyEvent` ``event`` returned by - :meth:`pyopencl.enqueue_copy`. + containing the host array ``ary`` and the :class:`pyopencl.NannyEvent` + event returned by :meth:`pyopencl.enqueue_copy`. .. versionadded:: 2019.1.2 """ @@ -891,11 +970,13 @@ def copy(self, queue: cl.CommandQueue | type[_copy_queue] | None = _copy_queue): if self.nbytes: queue_san = queue_san or self.queue assert queue_san is not None - event1 = cl.enqueue_copy(queue_san, + evt = cl.enqueue_copy(queue_san, result.base_data, self.base_data, src_offset=self.offset, byte_count=self.nbytes, - wait_for=self.events) - result.add_event(event1) + wait_for=self.write_events) + + self.add_read_event(evt) + result.add_write_event(evt) return result @@ -913,7 +994,7 @@ def __repr__(self): result = repr(self.get()) if result[:5] == "array": - result = f"cl.{type(self).__name__}" + result[5:] + result = f"cl.{type(self).__name__}{result[5:]}" else: warn( f"{type(result).__name__}.__repr__ was expected to return a " @@ -1008,7 +1089,7 @@ def _abs(result, arg): elif arg.dtype.kind in ["u", "i"]: fname = "abs" else: - raise TypeError("unsupported dtype in _abs()") + raise TypeError(f"unsupported dtype in 'abs': {arg.dtype!r}") return elementwise.get_unary_func_kernel( arg.context, fname, arg.dtype, out_dtype=result.dtype) @@ -1071,7 +1152,7 @@ def _copy(dest, src): return elementwise.get_copy_kernel( dest.context, dest.dtype, src.dtype) - def _new_like_me(self, dtype=None, queue: cl.CommandQueue | None = None): + def _new_like_me(self, dtype=None, queue: cl.CommandQueue | None = None) -> Self: if dtype is None: dtype = self.dtype strides = self.strides @@ -1130,35 +1211,29 @@ def mul_add(self, selffac, other, otherfac, queue: cl.CommandQueue | None = None """Return ``selffac * self + otherfac * other``. """ queue = queue or self.queue + assert np.isscalar(selffac) and np.isscalar(otherfac) if isinstance(other, Array): result = _get_broadcasted_binary_op_result(self, other, queue) - result.add_event( - self._axpbyz( - result, selffac, self, otherfac, other, - queue=queue)) + self._axpbyz(result, selffac, self, otherfac, other, queue=queue) return result elif np.isscalar(other): common_dtype = _get_common_dtype(self, other, queue) result = self._new_like_me(common_dtype, queue=queue) - result.add_event( - self._axpbz(result, selffac, - self, common_dtype.type(otherfac * other), - queue=queue)) + self._axpbz( + result, selffac, self, common_dtype.type(otherfac * other), + queue=queue) return result else: - raise NotImplementedError + raise NotImplementedError(f"'mul_add' with '{type(other).__name__}'") def __add__(self, other) -> Self: """Add an array with an array or an array with a scalar.""" if isinstance(other, Array): result = _get_broadcasted_binary_op_result(self, other, self.queue) - result.add_event( - self._axpbyz(result, - self.dtype.type(1), self, - other.dtype.type(1), other)) - + self._axpbyz( + result, self.dtype.type(1), self, other.dtype.type(1), other) return result elif np.isscalar(other): if other == 0: @@ -1166,9 +1241,8 @@ def __add__(self, other) -> Self: else: common_dtype = _get_common_dtype(self, other, self.queue) result = self._new_like_me(common_dtype) - result.add_event( - self._axpbz(result, self.dtype.type(1), - self, common_dtype.type(other))) + self._axpbz( + result, self.dtype.type(1), self, common_dtype.type(other)) return result else: return NotImplemented @@ -1180,20 +1254,16 @@ def __sub__(self, other) -> Self: if isinstance(other, Array): result = _get_broadcasted_binary_op_result(self, other, self.queue) - result.add_event( - self._axpbyz(result, - self.dtype.type(1), self, - result.dtype.type(-1), other)) - + self._axpbyz( + result, self.dtype.type(1), self, result.dtype.type(-1), other) return result elif np.isscalar(other): if other == 0: return self.copy() else: result = self._new_like_me( - _get_common_dtype(self, other, self.queue)) - result.add_event( - self._axpbz(result, self.dtype.type(1), self, -other)) + _get_common_dtype(self, other, self.queue)) + self._axpbz(result, self.dtype.type(1), self, -other) return result else: return NotImplemented @@ -1206,10 +1276,8 @@ def __rsub__(self, other) -> Self: if np.isscalar(other): common_dtype = _get_common_dtype(self, other, self.queue) result = self._new_like_me(common_dtype) - result.add_event( - self._axpbz(result, result.dtype.type(-1), self, - common_dtype.type(other))) - + self._axpbz( + result, result.dtype.type(-1), self, common_dtype.type(other)) return result else: return NotImplemented @@ -1219,15 +1287,11 @@ def __iadd__(self, other) -> Self: if other.shape != self.shape and other.shape != (): raise NotImplementedError("Broadcasting binary op with shapes:" f" {self.shape}, {other.shape}.") - self.add_event( - self._axpbyz(self, - self.dtype.type(1), self, - other.dtype.type(1), other)) - + self._axpbyz( + self, self.dtype.type(1), self, other.dtype.type(1), other) return self elif np.isscalar(other): - self.add_event( - self._axpbz(self, self.dtype.type(1), self, other)) + self._axpbz(self, self.dtype.type(1), self, other) return self else: return NotImplemented @@ -1237,9 +1301,8 @@ def __isub__(self, other) -> Self: if other.shape != self.shape and other.shape != (): raise NotImplementedError("Broadcasting binary op with shapes:" f" {self.shape}, {other.shape}.") - self.add_event( - self._axpbyz(self, self.dtype.type(1), self, - other.dtype.type(-1), other)) + self._axpbyz( + self, self.dtype.type(1), self, other.dtype.type(-1), other) return self elif np.isscalar(other): self._axpbz(self, self.dtype.type(1), self, -other) @@ -1252,21 +1315,18 @@ def __pos__(self) -> Self: def __neg__(self) -> Self: result = self._new_like_me() - result.add_event(self._axpbz(result, -1, self, 0)) + self._axpbz(result, -1, self, 0) return result def __mul__(self, other) -> Self: if isinstance(other, Array): result = _get_broadcasted_binary_op_result(self, other, self.queue) - result.add_event( - self._elwise_multiply(result, self, other)) + self._elwise_multiply(result, self, other) return result elif np.isscalar(other): common_dtype = _get_common_dtype(self, other, self.queue) result = self._new_like_me(common_dtype) - result.add_event( - self._axpbz(result, - common_dtype.type(other), self, self.dtype.type(0))) + self._axpbz(result, common_dtype.type(other), self, self.dtype.type(0)) return result else: return NotImplemented @@ -1275,9 +1335,7 @@ def __rmul__(self, other) -> Self: if np.isscalar(other): common_dtype = _get_common_dtype(self, other, self.queue) result = self._new_like_me(common_dtype) - result.add_event( - self._axpbz(result, - common_dtype.type(other), self, self.dtype.type(0))) + self._axpbz(result, common_dtype.type(other), self, self.dtype.type(0)) return result else: return NotImplemented @@ -1287,25 +1345,20 @@ def __imul__(self, other) -> Self: if other.shape != self.shape and other.shape != (): raise NotImplementedError("Broadcasting binary op with shapes:" f" {self.shape}, {other.shape}.") - self.add_event( - self._elwise_multiply(self, self, other)) + self._elwise_multiply(self, self, other) return self elif np.isscalar(other): - self.add_event( - self._axpbz(self, other, self, self.dtype.type(0))) + self._axpbz(self, other, self, self.dtype.type(0)) return self else: return NotImplemented def __div__(self, other) -> Self: - """Divides an array by an array or a scalar, i.e. ``self / other``. - """ + """Divides an array by an array or a scalar, i.e. ``self / other``.""" if isinstance(other, Array): result = _get_broadcasted_binary_op_result( - self, other, self.queue, - dtype_getter=_get_truedivide_dtype) - result.add_event(self._div(result, self, other)) - + self, other, self.queue, dtype_getter=_get_truedivide_dtype) + self._div(result, self, other) return result elif np.isscalar(other): if other == 1: @@ -1313,10 +1366,9 @@ def __div__(self, other) -> Self: else: common_dtype = _get_truedivide_dtype(self, other, self.queue) result = self._new_like_me(common_dtype) - result.add_event( - self._axpbz(result, - np.true_divide(common_dtype.type(1), other), - self, self.dtype.type(0))) + self._axpbz( + result, np.true_divide(common_dtype.type(1), other), + self, self.dtype.type(0)) return result else: return NotImplemented @@ -1324,18 +1376,16 @@ def __div__(self, other) -> Self: __truediv__ = __div__ def __rdiv__(self, other) -> Self: - """Divides an array by a scalar or an array, i.e. ``other / self``. - """ + """Divides an array by a scalar or an array, i.e. ``other / self``.""" common_dtype = _get_truedivide_dtype(self, other, self.queue) if isinstance(other, Array): result = self._new_like_me(common_dtype) - result.add_event(other._div(result, self)) + other._div(result, self) return result elif np.isscalar(other): result = self._new_like_me(common_dtype) - result.add_event( - self._rdiv_scalar(result, self, common_dtype.type(other))) + self._rdiv_scalar(result, self, common_dtype.type(other)) return result else: return NotImplemented @@ -1353,16 +1403,15 @@ def __itruediv__(self, other) -> Self: if other.shape != self.shape and other.shape != (): raise NotImplementedError("Broadcasting binary op with shapes:" f" {self.shape}, {other.shape}.") - self.add_event( - self._div(self, self, other)) + self._div(self, self, other) return self elif np.isscalar(other): if other == 1: return self else: - self.add_event( - self._axpbz(self, common_dtype.type(np.true_divide(1, other)), - self, self.dtype.type(0))) + self._axpbz( + self, common_dtype.type(np.true_divide(1, other)), + self, self.dtype.type(0)) return self else: return NotImplemented @@ -1375,12 +1424,11 @@ def __and__(self, other) -> Self: if isinstance(other, Array): result = _get_broadcasted_binary_op_result(self, other, self.queue) - result.add_event(self._array_binop(result, self, other, op="&")) + self._array_binop(result, self, other, op="&") return result elif np.isscalar(other): result = self._new_like_me(common_dtype) - result.add_event( - self._scalar_binop(result, self, other, op="&")) + self._scalar_binop(result, self, other, op="&") return result else: return NotImplemented @@ -1394,14 +1442,12 @@ def __or__(self, other) -> Self: raise TypeError("Integral types only") if isinstance(other, Array): - result = _get_broadcasted_binary_op_result(self, other, - self.queue) - result.add_event(self._array_binop(result, self, other, op="|")) + result = _get_broadcasted_binary_op_result(self, other, self.queue) + self._array_binop(result, self, other, op="|") return result elif np.isscalar(other): result = self._new_like_me(common_dtype) - result.add_event( - self._scalar_binop(result, self, other, op="|")) + self._scalar_binop(result, self, other, op="|") return result else: return NotImplemented @@ -1416,12 +1462,11 @@ def __xor__(self, other) -> Self: if isinstance(other, Array): result = _get_broadcasted_binary_op_result(self, other, self.queue) - result.add_event(self._array_binop(result, self, other, op="^")) + self._array_binop(result, self, other, op="^") return result elif np.isscalar(other): result = self._new_like_me(common_dtype) - result.add_event( - self._scalar_binop(result, self, other, op="^")) + self._scalar_binop(result, self, other, op="^") return result else: return NotImplemented @@ -1438,11 +1483,10 @@ def __iand__(self, other) -> Self: if other.shape != self.shape and other.shape != (): raise NotImplementedError("Broadcasting binary op with shapes:" f" {self.shape}, {other.shape}.") - self.add_event(self._array_binop(self, self, other, op="&")) + self._array_binop(self, self, other, op="&") return self elif np.isscalar(other): - self.add_event( - self._scalar_binop(self, self, other, op="&")) + self._scalar_binop(self, self, other, op="&") return self else: return NotImplemented @@ -1457,11 +1501,10 @@ def __ior__(self, other) -> Self: if other.shape != self.shape and other.shape != (): raise NotImplementedError("Broadcasting binary op with shapes:" f" {self.shape}, {other.shape}.") - self.add_event(self._array_binop(self, self, other, op="|")) + self._array_binop(self, self, other, op="|") return self elif np.isscalar(other): - self.add_event( - self._scalar_binop(self, self, other, op="|")) + self._scalar_binop(self, self, other, op="|") return self else: return NotImplemented @@ -1476,11 +1519,10 @@ def __ixor__(self, other) -> Self: if other.shape != self.shape and other.shape != (): raise NotImplementedError("Broadcasting binary op with shapes:" f" {self.shape}, {other.shape}.") - self.add_event(self._array_binop(self, self, other, op="^")) + self._array_binop(self, self, other, op="^") return self elif np.isscalar(other): - self.add_event( - self._scalar_binop(self, self, other, op="^")) + self._scalar_binop(self, self, other, op="^") return self else: return NotImplemented @@ -1489,6 +1531,7 @@ def _zero_fill(self, queue: cl.CommandQueue | None = None, wait_for: cl.WaitList = None) -> None: queue = queue or self.queue + wait_for = wait_for or [] if not self.size: return @@ -1502,9 +1545,11 @@ def _zero_fill(self, # circumvent bug with large buffers on NVIDIA # https://github.com/inducer/pyopencl/issues/395 if cl_version_gtr_1_2 and not (on_nvidia and self.nbytes >= 2**31): - self.add_event( - cl.enqueue_fill(queue, self.base_data, np.int8(0), - self.nbytes, offset=self.offset, wait_for=wait_for)) + evt = cl.enqueue_fill( + queue, self.base_data, np.int8(0), + self.nbytes, offset=self.offset, + wait_for=wait_for + self.write_events + self.read_events) + self.add_write_event(evt) else: zero = np.zeros((), self.dtype) self.fill(zero, queue=queue) @@ -1518,9 +1563,7 @@ def fill(self, :returns: *self*. """ - self.add_event( - self._fill(self, value, queue=queue, wait_for=wait_for)) - + self._fill(self, value, queue=queue, wait_for=wait_for) return self def __len__(self) -> int: @@ -1536,7 +1579,7 @@ def __abs__(self) -> Self: """ result = self._new_like_me(self.dtype.type(0).real.dtype) - result.add_event(self._abs(result, self)) + self._abs(result, self) return result def __pow__(self, other) -> Self: @@ -1547,15 +1590,12 @@ def __pow__(self, other) -> Self: if isinstance(other, Array): assert self.shape == other.shape - result = self._new_like_me( - _get_common_dtype(self, other, self.queue)) - result.add_event( - self._pow_array(result, self, other)) + result = self._new_like_me(_get_common_dtype(self, other, self.queue)) + self._pow_array(result, self, other) return result elif np.isscalar(other): - result = self._new_like_me( - _get_common_dtype(self, other, self.queue)) - result.add_event(self._pow_scalar(result, self, other)) + result = self._new_like_me(_get_common_dtype(self, other, self.queue)) + self._pow_scalar(result, self, other) return result else: return NotImplemented @@ -1564,8 +1604,7 @@ def __rpow__(self, other) -> Self: if np.isscalar(other): common_dtype = _get_common_dtype(self, other, self.queue) result = self._new_like_me(common_dtype) - result.add_event( - self._rpow_scalar(result, common_dtype.type(other), self)) + self._rpow_scalar(result, common_dtype.type(other), self) return result else: return NotImplemented @@ -1575,8 +1614,7 @@ def __invert__(self): raise TypeError(f"Integral types only: {self.dtype}") result = self._new_like_me() - result.add_event(self._unop(result, self, op="~")) - + self._unop(result, self, op="~") return result # }}} @@ -1587,7 +1625,7 @@ def reverse(self, queue: cl.CommandQueue | None = None) -> Self: """ result = self._new_like_me() - result.add_event(self._reverse(result, self)) + self._reverse(result, self) return result def astype(self, dtype, queue: cl.CommandQueue | None = None): @@ -1596,7 +1634,7 @@ def astype(self, dtype, queue: cl.CommandQueue | None = None): return self.copy() result = self._new_like_me(dtype=dtype) - result.add_event(self._copy(result, self, queue=queue)) + self._copy(result, self, queue=queue) return result # {{{ rich comparisons, any, all @@ -1614,11 +1652,16 @@ def any(self, ) -> Self: from pyopencl.reduction import get_any_kernel krnl = get_any_kernel(self.context, self.dtype) - if wait_for is None: - wait_for = [] - result, event1 = krnl(self, queue=queue, - wait_for=[*wait_for, *self.events], return_event=True) - result.add_event(event1) + + queue = queue or self.queue + wait_for = wait_for or [] + + result, evt = krnl( + self, queue=queue, + wait_for=[*wait_for, *self.write_events], + return_event=True) + self.add_read_event(evt) + return result def all(self, @@ -1627,11 +1670,16 @@ def all(self, ) -> Self: from pyopencl.reduction import get_all_kernel krnl = get_all_kernel(self.context, self.dtype) - if wait_for is None: - wait_for = [] - result, event1 = krnl(self, queue=queue, - wait_for=[*wait_for, *self.events], return_event=True) - result.add_event(event1) + + queue = queue or self.queue + wait_for = wait_for or [] + + result, evt = krnl( + self, queue=queue, + wait_for=[*wait_for, *self.write_events], + return_event=True) + self.add_read_event(evt) + return result @staticmethod @@ -1652,13 +1700,11 @@ def _array_comparison(out, a, b, queue: cl.CommandQueue | None = None, op=None): def __eq__(self, other: object) -> Self: # pyright: ignore[reportIncompatibleMethodOverride] if isinstance(other, Array): result = self._new_like_me(_BOOL_DTYPE) - result.add_event( - self._array_comparison(result, self, other, op="==")) + self._array_comparison(result, self, other, op="==") return result elif np.isscalar(other): result = self._new_like_me(_BOOL_DTYPE) - result.add_event( - self._scalar_comparison(result, self, other, op="==")) + self._scalar_comparison(result, self, other, op="==") return result else: return NotImplemented @@ -1667,13 +1713,11 @@ def __eq__(self, other: object) -> Self: # pyright: ignore[reportIncompatibleMe def __ne__(self, other: object) -> Self: # pyright: ignore[reportIncompatibleMethodOverride] if isinstance(other, Array): result = self._new_like_me(_BOOL_DTYPE) - result.add_event( - self._array_comparison(result, self, other, op="!=")) + self._array_comparison(result, self, other, op="!=") return result elif np.isscalar(other): result = self._new_like_me(_BOOL_DTYPE) - result.add_event( - self._scalar_comparison(result, self, other, op="!=")) + self._scalar_comparison(result, self, other, op="!=") return result else: return NotImplemented @@ -1681,8 +1725,7 @@ def __ne__(self, other: object) -> Self: # pyright: ignore[reportIncompatibleMe def __le__(self, other) -> Self: if isinstance(other, Array): result = self._new_like_me(_BOOL_DTYPE) - result.add_event( - self._array_comparison(result, self, other, op="<=")) + self._array_comparison(result, self, other, op="<=") return result elif np.isscalar(other): result = self._new_like_me(_BOOL_DTYPE) @@ -1694,13 +1737,11 @@ def __le__(self, other) -> Self: def __ge__(self, other) -> Self: if isinstance(other, Array): result = self._new_like_me(_BOOL_DTYPE) - result.add_event( - self._array_comparison(result, self, other, op=">=")) + self._array_comparison(result, self, other, op=">=") return result elif np.isscalar(other): result = self._new_like_me(_BOOL_DTYPE) - result.add_event( - self._scalar_comparison(result, self, other, op=">=")) + self._scalar_comparison(result, self, other, op=">=") return result else: return NotImplemented @@ -1708,13 +1749,11 @@ def __ge__(self, other) -> Self: def __lt__(self, other) -> Self: if isinstance(other, Array): result = self._new_like_me(_BOOL_DTYPE) - result.add_event( - self._array_comparison(result, self, other, op="<")) + self._array_comparison(result, self, other, op="<") return result elif np.isscalar(other): result = self._new_like_me(_BOOL_DTYPE) - result.add_event( - self._scalar_comparison(result, self, other, op="<")) + self._scalar_comparison(result, self, other, op="<") return result else: return NotImplemented @@ -1722,13 +1761,11 @@ def __lt__(self, other) -> Self: def __gt__(self, other) -> Self: if isinstance(other, Array): result = self._new_like_me(_BOOL_DTYPE) - result.add_event( - self._array_comparison(result, self, other, op=">")) + self._array_comparison(result, self, other, op=">") return result elif np.isscalar(other): result = self._new_like_me(_BOOL_DTYPE) - result.add_event( - self._scalar_comparison(result, self, other, op=">")) + self._scalar_comparison(result, self, other, op=">") return result else: return NotImplemented @@ -1744,8 +1781,7 @@ def real(self) -> Self: """ if self.dtype.kind == "c": result = self._new_like_me(self.dtype.type(0).real.dtype) - result.add_event( - self._real(result, self)) + self._real(result, self) return result else: return self @@ -1757,8 +1793,7 @@ def imag(self) -> Self: """ if self.dtype.kind == "c": result = self._new_like_me(self.dtype.type(0).real.dtype) - result.add_event( - self._imag(result, self)) + self._imag(result, self) return result else: return zeros_like(self) @@ -1769,7 +1804,7 @@ def conj(self) -> Self: """ if self.dtype.kind == "c": result = self._new_like_me() - result.add_event(self._conj(result, self)) + self._conj(result, self) return result else: return self @@ -1781,25 +1816,46 @@ def conj(self) -> Self: # {{{ event management def add_event(self, evt: cl.Event) -> None: - """Add *evt* to :attr:`events`. If :attr:`events` is too long, this method - may implicitly wait for a subset of :attr:`events` and clear them from the - list. + return self.add_write_event(evt) + + def add_write_event(self, evt: cl.Event) -> None: + """Add *evt* to :attr:`write_events`. If :attr:`write_events` is too + long, this method may implicitly wait for a subset of :attr:`write_events` + and clear them from the list. """ - n_wait = 4 + n = _MAX_EVENT_CLEAR_COUNT - self.events.append(evt) + self.write_events.append(evt) + if len(self.write_events) > 3*n: + wait_events = self.write_events[:n] + cl.wait_for_events(wait_events) + del self.write_events[:n] - if len(self.events) > 3*n_wait: - wait_events = self.events[:n_wait] + def add_read_event(self, evt: cl.Event) -> None: + """Add *evt* to :attr:`read_events`. If :attr:`read_events` is too + long, this method may implicitly wait for a subset of :attr:`read_events` + and clear them from the list. + """ + n = _MAX_EVENT_CLEAR_COUNT + + self.read_events.append(evt) + if len(self.read_events) > 3*n: + wait_events = self.read_events[:n] cl.wait_for_events(wait_events) - del self.events[:n_wait] + del self.read_events[:n] def finish(self) -> None: - """Wait for the entire contents of :attr:`events`, clear it.""" + """Wait for the entire contents of :attr:`write_events` and + :attr:`read_events` and clear the lists. + """ + + if self.write_events: + cl.wait_for_events(self.write_events) + del self.write_events[:] - if self.events: - cl.wait_for_events(self.events) - del self.events[:] + if self.read_events: + cl.wait_for_events(self.read_events) + del self.read_events[:] # }}} @@ -2060,7 +2116,8 @@ def map_to_host(self, ary, evt = cl.enqueue_map_buffer( queue or self.queue, self.base_data, flags, self.offset, self.shape, self.dtype, strides=self.strides, - wait_for=[*wait_for, *self.events], is_blocking=is_blocking) + wait_for=[*wait_for, *self.write_events], is_blocking=is_blocking) + self.add_read_event(evt) if is_blocking: return ary @@ -2183,11 +2240,9 @@ def setitem(self, Added *wait_for*. """ + wait_for = wait_for or [] queue = queue or self.queue assert queue is not None - if wait_for is None: - wait_for = [] - wait_for = [*wait_for, *self.events] if isinstance(subscript, Array): if subscript.dtype.kind not in ("i", "u"): @@ -2204,6 +2259,7 @@ def setitem(self, wait_for=wait_for) return + # NOTE: subarray shares the event lists with self subarray = self[subscript] if not subarray.size: @@ -2213,10 +2269,10 @@ def setitem(self, if isinstance(value, np.ndarray): if subarray.shape == value.shape and subarray.strides == value.strides: - assert subarray.base_data is not None - self.add_event( - cl.enqueue_copy(queue, subarray.base_data, - value, dst_offset=subarray.offset, wait_for=wait_for)) + evt = cl.enqueue_copy( + queue, subarray.base_data, value, dst_offset=subarray.offset, + wait_for=[*wait_for, *subarray.write_events, *subarray.read_events]) + subarray.add_write_event(evt) return else: value = to_device(queue, value, self.allocator) @@ -2232,11 +2288,9 @@ def setitem(self, raise NotImplementedError("cannot assign between arrays of " "differing strides") - self.add_event( - self._copy(subarray, value, queue=queue, wait_for=wait_for)) - + self._copy(subarray, value, queue=queue, wait_for=wait_for) else: - # Let's assume it's a scalar + assert np.isscalar(value) subarray.fill(value, queue=queue, wait_for=wait_for) def __setitem__(self, subscript, value): @@ -2313,8 +2367,9 @@ def to_device( first_arg = queue.context result = Array(first_arg, ary.shape, ary.dtype, - allocator=allocator, strides=ary.strides) + allocator=allocator, strides=ary.strides) result.set(ary, async_=async_, queue=queue) + return result @@ -2339,6 +2394,7 @@ def zeros( order=order, allocator=allocator, _context=queue.context, _queue=queue) result._zero_fill() + return result @@ -2351,8 +2407,8 @@ def empty_like( as *other_ary*. """ - return ary._new_with_changes(data=None, offset=0, queue=queue, - allocator=allocator) + return ary._new_with_changes( + data=None, offset=0, queue=queue, allocator=allocator) def zeros_like(ary): @@ -2375,9 +2431,8 @@ class _ArangeInfo: @elwise_kernel_runner -def _arange_knl(result, start, step): - return elementwise.get_arange_kernel( - result.context, result.dtype) +def _arange_knl(result: Array, start: int, step: int) -> cl.Kernel: + return elementwise.get_arange_kernel(result.context, result.dtype) def arange(queue: cl.CommandQueue, *args: Any, **kwargs: Any) -> Array: @@ -2461,7 +2516,7 @@ def arange(queue: cl.CommandQueue, *args: Any, **kwargs: Any) -> Array: size = ceil((stop-start)/step) result = Array(queue, (size,), dtype, allocator=inf.allocator) - result.add_event(_arange_knl(result, start, step, queue=queue)) + _arange_knl(result, start, step, queue=queue) # }}} @@ -2474,8 +2529,7 @@ def arange(queue: cl.CommandQueue, *args: Any, **kwargs: Any) -> Array: @elwise_kernel_runner def _take(result, ary, indices): - return elementwise.get_take_kernel( - result.context, result.dtype, indices.dtype) + return elementwise.get_take_kernel(result.context, result.dtype, indices.dtype) def take( @@ -2494,8 +2548,7 @@ def take( out = type(a)(queue, indices.shape, a.dtype, allocator=a.allocator) assert len(indices.shape) == 1 - out.add_event( - _take(out, a, indices, queue=queue, wait_for=wait_for)) + _take(out, a, indices, queue=queue, wait_for=wait_for) return out @@ -2546,17 +2599,18 @@ def make_func_for_chunk_size(chunk_size): queue.device)) wait_for_this = ( - *indices.events, - *[evt for i in arrays[chunk_slice] for evt in i.events], - *[evt for o in out[chunk_slice] for evt in o.events]) + *indices.write_events, + *[evt for i in arrays[chunk_slice] for evt in i.write_events], + *[evt for o in out[chunk_slice] for evt in o.write_events]) evt = knl(queue, gs, ls, indices.data, *[o.data for o in out[chunk_slice]], *[i.data for i in arrays[chunk_slice]], *[indices.size], wait_for=wait_for_this) - for o in out[chunk_slice]: - o.add_event(evt) + + add_write_event(out[chunk_slice], evt) + add_read_event([*arrays[chunk_slice], indices], evt) return out @@ -2626,10 +2680,10 @@ def make_func_for_chunk_size(chunk_size): queue.device)) wait_for_this = ( - *dest_indices.events, - *src_indices.events, - *[evt for i in arrays[chunk_slice] for evt in i.events], - *[evt for o in out[chunk_slice] for evt in o.events]) + *dest_indices.write_events, + *src_indices.write_events, + *[evt for i in arrays[chunk_slice] for evt in i.write_events], + *[evt for o in out[chunk_slice] for evt in o.write_events]) evt = knl(queue, gs, ls, *out[chunk_slice], dest_indices, @@ -2638,8 +2692,9 @@ def make_func_for_chunk_size(chunk_size): *src_offsets_list[chunk_slice], src_indices.size, wait_for=wait_for_this) - for o in out[chunk_slice]: - o.add_event(evt) + + add_write_event(out[chunk_slice], evt) + add_read_event([*arrays[chunk_slice], src_indices, dest_indices], evt) return out @@ -2656,16 +2711,15 @@ def multi_put( return [] from pytools import single_valued + + vec_count = len(arrays) a_dtype = single_valued(a.dtype for a in arrays) a_allocator = arrays[0].allocator context = dest_indices.context + + wait_for = wait_for or [] queue = queue or dest_indices.queue assert queue is not None - if wait_for is None: - wait_for = [] - wait_for = [*wait_for, *dest_indices.events] - - vec_count = len(arrays) if out is None: out = [type(arrays[i])(queue, dest_shape, a_dtype, allocator=a_allocator) @@ -2715,8 +2769,8 @@ def make_func_for_chunk_size(chunk_size): wait_for_this = ( *wait_for, - *[evt for i in arrays[chunk_slice] for evt in i.events], - *[evt for o in out[chunk_slice] for evt in o.events]) + *[evt for i in arrays[chunk_slice] for evt in i.write_events], + *[evt for o in out[chunk_slice] for evt in o.write_events]) evt = knl(queue, gs, ls, *out[chunk_slice], dest_indices, @@ -2724,8 +2778,8 @@ def make_func_for_chunk_size(chunk_size): use_fill_cla, array_lengths_cla, dest_indices.size, wait_for=wait_for_this) - for o in out[chunk_slice]: - o.add_event(evt) + add_write_event(out[chunk_slice], evt) + add_read_event([*arrays[chunk_slice], dest_indices], evt) return out @@ -2799,7 +2853,7 @@ def concatenate(arrays, axis=0, queue: cl.CommandQueue | None = None, allocator= @elwise_kernel_runner def _diff(result, array): - return elementwise.get_diff_kernel(array.context, array.dtype) + return elementwise.get_diff_kernel(result.context, result.dtype) def diff(array, queue: cl.CommandQueue | None = None, allocator=None): @@ -2816,8 +2870,7 @@ def diff(array, queue: cl.CommandQueue | None = None, allocator=None): allocator = allocator or array.allocator result = array.__class__(queue, (n-1,), array.dtype, allocator=allocator) - event1 = _diff(result, array, queue=queue) - result.add_event(event1) + _diff(result, array, queue=queue) return result @@ -3027,9 +3080,7 @@ def if_positive( allocator=criterion.allocator, strides=out_strides) - event1 = _if_positive(out, criterion, then_, else_, queue=queue) - out.add_event(event1) - + _if_positive(out, criterion, then_, else_, queue=queue) return out # }}} @@ -3070,8 +3121,7 @@ def maximum(a, b, out=None, queue: cl.CommandQueue | None = None): elif not b_is_scalar: out = b._new_like_me(out_dtype, queue) - out.add_event(_minimum_maximum_backend(out, a, b, queue=queue, minmax="max")) - + _minimum_maximum_backend(out, a, b, queue=queue, minmax="max") return out @@ -3096,8 +3146,7 @@ def minimum(a, b, out=None, queue: cl.CommandQueue | None = None): elif not b_is_scalar: out = b._new_like_me(out_dtype, queue) - out.add_event(_minimum_maximum_backend(out, a, b, queue=queue, minmax="min")) - + _minimum_maximum_backend(out, a, b, queue=queue, minmax="min") return out # }}} @@ -3218,9 +3267,10 @@ def sum( from pyopencl.reduction import get_sum_kernel krnl = get_sum_kernel(a.context, dtype, a.dtype) - result, event1 = krnl(a, queue=queue, slice=slice, wait_for=a.events, - return_event=True) - result.add_event(event1) + result, evt = krnl( + a, queue=queue, slice=slice, wait_for=a.write_events, + return_event=True) + a.add_read_event(evt) # NOTE: neutral element in `get_sum_kernel` is 0 by default if initial is not _NoValue: @@ -3253,9 +3303,13 @@ def dot(a, b, dtype=None, queue: cl.CommandQueue | None = None, slice=None): from pyopencl.reduction import get_dot_kernel krnl = get_dot_kernel(a.context, dtype, a.dtype, b.dtype) - result, event1 = krnl(a, b, queue=queue, slice=slice, - wait_for=a.events + b.events, return_event=True) - result.add_event(event1) + result, evt = krnl( + a, b, queue=queue, slice=slice, + wait_for=a.write_events + b.write_events, return_event=True) + + a.add_read_event(evt) + if b is not a: + b.add_read_event(evt) return result @@ -3272,9 +3326,13 @@ def vdot(a, b, dtype=None, queue: cl.CommandQueue | None = None, slice=None): krnl = get_dot_kernel(a.context, dtype, a.dtype, b.dtype, conjugate_first=True) - result, event1 = krnl(a, b, queue=queue, slice=slice, - wait_for=a.events + b.events, return_event=True) - result.add_event(event1) + result, evt = krnl( + a, b, queue=queue, slice=slice, + wait_for=a.write_events + b.write_events, return_event=True) + + a.add_read_event(evt) + if b is not a: + b.add_read_event(evt) return result @@ -3296,9 +3354,15 @@ def subset_dot( krnl = get_subset_dot_kernel( a.context, dtype, subset.dtype, a.dtype, b.dtype) - result, event1 = krnl(subset, a, b, queue=queue, slice=slice, - wait_for=subset.events + a.events + b.events, return_event=True) - result.add_event(event1) + result, evt = krnl( + subset, a, b, queue=queue, slice=slice, + wait_for=subset.write_events + a.write_events + b.write_events, + return_event=True) + + subset.add_read_event(evt) + a.add_read_event(evt) + if b is not a: + b.add_read_event(evt) return result @@ -3321,9 +3385,10 @@ def f(a, queue: cl.CommandQueue | None = None, initial=_NoValue): from pyopencl.reduction import get_minmax_kernel krnl = get_minmax_kernel(a.context, what, a.dtype) - result, event1 = krnl(a, queue=queue, wait_for=a.events, - return_event=True) - result.add_event(event1) + result, evt = krnl( + a, queue=queue, wait_for=a.write_events, + return_event=True) + a.add_read_event(evt) if initial is not _NoValue: initial = a.dtype.type(initial) @@ -3356,10 +3421,16 @@ def _make_subset_minmax_kernel(what): def f(subset, a, queue: cl.CommandQueue | None = None, slice=None): from pyopencl.reduction import get_subset_minmax_kernel krnl = get_subset_minmax_kernel(a.context, what, a.dtype, subset.dtype) - result, event1 = krnl(subset, a, queue=queue, slice=slice, - wait_for=a.events + subset.events, return_event=True) - result.add_event(event1) + result, evt = krnl( + subset, a, queue=queue, slice=slice, + wait_for=a.write_events + subset.write_events, + return_event=True) + + a.add_read_event(evt) + subset.add_read_event(evt) + return result + return f @@ -3373,8 +3444,12 @@ def f(subset, a, queue: cl.CommandQueue | None = None, slice=None): # {{{ scans -def cumsum(a, output_dtype=None, queue: cl.CommandQueue | None = None, - wait_for: cl.WaitList = None, return_event=False): +def cumsum( + a: Array, + output_dtype: Any = None, + queue: cl.CommandQueue | None = None, + wait_for: cl.WaitList = None, + return_event: bool = False) -> Array | tuple[cl.Event, Array]: # undocumented for now """ @@ -3389,12 +3464,15 @@ def cumsum(a, output_dtype=None, queue: cl.CommandQueue | None = None, if wait_for is None: wait_for = [] - result = a._new_like_me(output_dtype) + result = a._new_like_me(output_dtype) # pyright: ignore[reportPrivateUsage] from pyopencl.scan import get_cumsum_kernel + krnl = get_cumsum_kernel(a.context, a.dtype, output_dtype) - evt = krnl(a, result, queue=queue, wait_for=wait_for + a.events) - result.add_event(evt) + evt = krnl(a, result, queue=queue, wait_for=[*wait_for, *a.write_events]) + + a.add_read_event(evt) + result.add_write_event(evt) if return_event: return evt, result diff --git a/pyopencl/bitonic_sort.py b/pyopencl/bitonic_sort.py index 3d90bad6a..a4cb8e32b 100644 --- a/pyopencl/bitonic_sort.py +++ b/pyopencl/bitonic_sort.py @@ -98,7 +98,7 @@ def __call__(self, arr, idx=None, queue=None, wait_for=None, axis=0): if wait_for is None: wait_for = [] - wait_for = wait_for + arr.events + wait_for = wait_for + arr.write_events last_evt = cl.enqueue_marker(queue, wait_for=wait_for) diff --git a/pyopencl/clmath.py b/pyopencl/clmath.py index 9f8d75ac2..5687119e3 100644 --- a/pyopencl/clmath.py +++ b/pyopencl/clmath.py @@ -26,13 +26,12 @@ import numpy as np -import pyopencl.array as cl_array import pyopencl.elementwise as elementwise -from pyopencl.array import _get_common_dtype +from pyopencl.array import _get_common_dtype, elwise_kernel_runner def _make_unary_array_func(name): - @cl_array.elwise_kernel_runner + @elwise_kernel_runner def knl_runner(result, arg): if arg.dtype.kind == "c": from pyopencl.elementwise import complex_dtype_to_name @@ -45,8 +44,7 @@ def knl_runner(result, arg): def f(array, queue=None): result = array._new_like_me(queue=queue) - event1 = knl_runner(result, array, queue=queue) - result.add_event(event1) + knl_runner(result, array, queue=queue) return result return f @@ -62,13 +60,13 @@ def f(array, queue=None): asinpi = _make_unary_array_func("asinpi") -@cl_array.elwise_kernel_runner +@elwise_kernel_runner def _atan2(result, arg1, arg2): return elementwise.get_float_binary_func_kernel( result.context, "atan2", arg1.dtype, arg2.dtype, result.dtype) -@cl_array.elwise_kernel_runner +@elwise_kernel_runner def _atan2pi(result, arg1, arg2): return elementwise.get_float_binary_func_kernel( result.context, "atan2pi", arg1.dtype, arg2.dtype, result.dtype) @@ -83,7 +81,7 @@ def atan2(y, x, queue=None): """ queue = queue or y.queue result = y._new_like_me(_get_common_dtype(y, x, queue)) - result.add_event(_atan2(result, y, x, queue=queue)) + _atan2(result, y, x, queue=queue) return result @@ -97,7 +95,7 @@ def atan2pi(y, x, queue=None): """ queue = queue or y.queue result = y._new_like_me(_get_common_dtype(y, x, queue)) - result.add_event(_atan2pi(result, y, x, queue=queue)) + _atan2pi(result, y, x, queue=queue) return result @@ -124,7 +122,7 @@ def atan2pi(y, x, queue=None): # TODO: fmin -@cl_array.elwise_kernel_runner +@elwise_kernel_runner def _fmod(result, arg, mod): return elementwise.get_fmod_kernel(result.context, result.dtype, arg.dtype, mod.dtype) @@ -135,13 +133,13 @@ def fmod(arg, mod, queue=None): for each element in ``arg`` and ``mod``.""" queue = (queue or arg.queue) or mod.queue result = arg._new_like_me(_get_common_dtype(arg, mod, queue)) - result.add_event(_fmod(result, arg, mod, queue=queue)) + _fmod(result, arg, mod, queue=queue) return result # TODO: fract -@cl_array.elwise_kernel_runner +@elwise_kernel_runner def _frexp(sig, expt, arg): return elementwise.get_frexp_kernel(sig.context, sig.dtype, expt.dtype, arg.dtype) @@ -153,9 +151,7 @@ def frexp(arg, queue=None): """ sig = arg._new_like_me(queue=queue) expt = arg._new_like_me(queue=queue, dtype=np.int32) - event1 = _frexp(sig, expt, arg, queue=queue) - sig.add_event(event1) - expt.add_event(event1) + _frexp(sig, expt, arg, queue=queue, noutputs=2) return sig, expt # TODO: hypot @@ -164,7 +160,7 @@ def frexp(arg, queue=None): ilogb = _make_unary_array_func("ilogb") -@cl_array.elwise_kernel_runner +@elwise_kernel_runner def _ldexp(result, sig, exp): return elementwise.get_ldexp_kernel(result.context, result.dtype, sig.dtype, exp.dtype) @@ -176,7 +172,7 @@ def ldexp(significand, exponent, queue=None): ``result = significand * 2**exponent``. """ result = significand._new_like_me(queue=queue) - result.add_event(_ldexp(result, significand, exponent)) + _ldexp(result, significand, exponent) return result @@ -194,7 +190,7 @@ def ldexp(significand, exponent, queue=None): # TODO: minmag -@cl_array.elwise_kernel_runner +@elwise_kernel_runner def _modf(intpart, fracpart, arg): return elementwise.get_modf_kernel(intpart.context, intpart.dtype, fracpart.dtype, arg.dtype) @@ -206,9 +202,7 @@ def modf(arg, queue=None): """ intpart = arg._new_like_me(queue=queue) fracpart = arg._new_like_me(queue=queue) - event1 = _modf(intpart, fracpart, arg, queue=queue) - fracpart.add_event(event1) - intpart.add_event(event1) + _modf(intpart, fracpart, arg, queue=queue, noutputs=2) return fracpart, intpart @@ -241,19 +235,19 @@ def modf(arg, queue=None): # TODO: table 6.10, integer functions # TODO: table 6.12, clamp et al -@cl_array.elwise_kernel_runner +@elwise_kernel_runner def _bessel_jn(result, n, x): return elementwise.get_bessel_kernel(result.context, "j", result.dtype, np.dtype(type(n)), x.dtype) -@cl_array.elwise_kernel_runner +@elwise_kernel_runner def _bessel_yn(result, n, x): return elementwise.get_bessel_kernel(result.context, "y", result.dtype, np.dtype(type(n)), x.dtype) -@cl_array.elwise_kernel_runner +@elwise_kernel_runner def _hankel_01(h0, h1, x): if h0.dtype != h1.dtype: raise TypeError("types of h0 and h1 must match") @@ -263,20 +257,18 @@ def _hankel_01(h0, h1, x): def bessel_jn(n, x, queue=None): result = x._new_like_me(queue=queue) - result.add_event(_bessel_jn(result, n, x, queue=queue)) + _bessel_jn(result, n, x, queue=queue) return result def bessel_yn(n, x, queue=None): result = x._new_like_me(queue=queue) - result.add_event(_bessel_yn(result, n, x, queue=queue)) + _bessel_yn(result, n, x, queue=queue) return result def hankel_01(x, queue=None): h0 = x._new_like_me(queue=queue) h1 = x._new_like_me(queue=queue) - event1 = _hankel_01(h0, h1, x, queue=queue) - h0.add_event(event1) - h1.add_event(event1) + _hankel_01(h0, h1, x, queue=queue, noutputs=2) return h0, h1 diff --git a/pyopencl/clrandom.py b/pyopencl/clrandom.py index 2805535b6..5a09a97be 100644 --- a/pyopencl/clrandom.py +++ b/pyopencl/clrandom.py @@ -312,7 +312,7 @@ def _fill(self, distribution, ary, scale, shift, queue=None): gsize, lsize = _splay(queue.device, ary.size) evt = knl(queue, gsize, lsize, *args) - ary.add_event(evt) + ary.add_write_event(evt) self.counter[0] += n * counter_multiplier c1_incr, self.counter[0] = divmod(self.counter[0], self.counter_max) diff --git a/pyopencl/invoker.py b/pyopencl/invoker.py index a7e524c24..0b0f5d1d5 100644 --- a/pyopencl/invoker.py +++ b/pyopencl/invoker.py @@ -144,7 +144,7 @@ def add_buf_arg(arg_idx, typechar, expr_str): cl_arg_idx += 1 if in_enqueue: - wait_for_parts .append(f"{arg_var}.events") + wait_for_parts.append(f"{arg_var}.write_events") continue @@ -377,7 +377,7 @@ def _check_arg_size(function_name, num_cl_args, arg_types, devs): from pytools.py_codegen import PicklableModule invoker_cache: WriteOncePersistentDict[Any, tuple[PicklableModule, str]] \ = WriteOncePersistentDict( - "pyopencl-invoker-cache-v42-nano", + "pyopencl-invoker-cache-v43-nano", key_builder=_NumpyTypesKeyBuilder(), in_mem_cache_size=0, safe_sync=False) diff --git a/pyopencl/reduction.py b/pyopencl/reduction.py index c21226389..4712c14a9 100644 --- a/pyopencl/reduction.py +++ b/pyopencl/reduction.py @@ -460,7 +460,7 @@ def __call__(self, invocation_args.append(arg.base_data) if arg_tp.with_offset: invocation_args.append(arg.offset) - wait_for.extend(arg.events) + wait_for.extend(arg.write_events) else: invocation_args.append(arg) @@ -552,7 +552,7 @@ def __call__(self, wait_for=wait_for) wait_for = [last_evt] - result.add_event(last_evt) + result.add_write_event(last_evt) if group_count == 1: if return_event: diff --git a/pyopencl/scan.py b/pyopencl/scan.py index 368d8b46c..c680e537b 100644 --- a/pyopencl/scan.py +++ b/pyopencl/scan.py @@ -1534,7 +1534,7 @@ def __call__(self, *args: Any, **kwargs: Any) -> cl.Event: data_args.append(arg_val.base_data) if arg_descr.with_offset: data_args.append(arg_val.offset) - wait_for.extend(arg_val.events) + wait_for.extend(arg_val.write_events) else: data_args.append(arg_val) @@ -1767,7 +1767,7 @@ def __call__(self, *args: Any, **kwargs: Any) -> cl.Event: data_args.append(arg_val.base_data) if arg_descr.with_offset: data_args.append(arg_val.offset) - wait_for.extend(arg_val.events) + wait_for.extend(arg_val.write_events) else: data_args.append(arg_val) diff --git a/test/test_array.py b/test/test_array.py index baa755a1d..10ddb5e93 100644 --- a/test/test_array.py +++ b/test/test_array.py @@ -1374,36 +1374,55 @@ def test_event_management(ctx_factory: cl.CtxFactory): from pyopencl.clrandom import rand as clrand x = clrand(queue, (5, 10), dtype=np.float32) - assert len(x.events) == 1, len(x.events) + assert len(x.write_events) == 1, x.write_events + assert len(x.read_events) == 0, x.read_events x.finish() - assert len(x.events) == 0 - - y = x+x - assert len(y.events) == 1 - y = x*x - assert len(y.events) == 1 - y = 2*x - assert len(y.events) == 1 - y = 2/x - assert len(y.events) == 1 - y = x/2 - assert len(y.events) == 1 - y = x**2 - assert len(y.events) == 1 - y = 2**x - assert len(y.events) == 1 + assert len(x.write_events) == 0 + assert len(x.read_events) == 0 + + y = x + x + assert len(y.write_events) == 1 and len(y.read_events) == 0 + assert len(x.write_events) == 0 and len(x.read_events) == 2 + + y = x * x + assert len(y.write_events) == 1 and len(y.read_events) == 0 + assert len(x.write_events) == 0 and len(x.read_events) == 4 + + y = 2 * x + assert len(y.write_events) == 1 and len(y.read_events) == 0 + assert len(x.write_events) == 0 and len(x.read_events) == 5 + + y = 2 / x + assert len(y.write_events) == 1 and len(y.read_events) == 0 + assert len(x.write_events) == 0 and len(x.read_events) == 6 + + y = x / 2 + assert len(y.write_events) == 1 and len(y.read_events) == 0 + assert len(x.write_events) == 0 and len(x.read_events) == 7 + + y = x ** 2 + assert len(y.write_events) == 1 and len(y.read_events) == 0 + assert len(x.write_events) == 0 and len(x.read_events) == 8 + + y = 2 ** x + assert len(y.write_events) == 1 and len(y.read_events) == 0 + assert len(x.write_events) == 0 and len(x.read_events) == 9 + + x.finish() for _i in range(10): x.fill(0) - assert len(x.events) == 10 + assert len(x.write_events) == 10 + assert len(x.read_events) == 0 for _i in range(1000): x.fill(0) - assert len(x.events) < 100 + assert len(x.write_events) < 100 + assert len(x.read_events) == 0 # }}} @@ -1643,7 +1662,7 @@ def test_get_async(ctx_factory: cl.CtxFactory): assert np.abs(b1 - b).mean() < 1e-5 wait_event = cl.UserEvent(context) - b_gpu.add_event(wait_event) + b_gpu.add_write_event(wait_event) b, evt = b_gpu.get_async() # testing that this doesn't hang wait_event.set_status(cl.command_execution_status.COMPLETE) evt.wait() @@ -2283,6 +2302,8 @@ def alloc2(size): # }}} +# {{{ test_logical_and_or + def test_logical_and_or(ctx_factory: cl.CtxFactory): # NOTE: Copied over from pycuda/test/test_gpuarray.py rng = np.random.default_rng(seed=0) @@ -2336,6 +2357,31 @@ def test_logical_not(ctx_factory: cl.CtxFactory): cl_array.logical_not(cl_array.zeros(cq, 10, np.float64) + 1).get(), np.logical_not(np.ones(10))) +# }}} + + +# {{{ test multiple queues + +def test_multiple_queues(ctx_factory): + ctx = ctx_factory() + + a = [None] * 3 + for i in range(len(a)): + queue = cl.CommandQueue(ctx) + a[i] = cl_array.arange(queue, 1000, dtype=np.float32) + + b = a[i] + a[i] + b = a[i] ** 2 + b = a[i] + 4000 + assert len(b.write_events) == 1 + assert len(a[i].read_events) == 4 + + a[i] = a[i].with_queue(None) + + b = a[0].with_queue(queue) + a[1].with_queue(queue) + +# }}} + # {{{ test XDG_CACHE_HOME handling