diff --git a/.basedpyright/baseline.json b/.basedpyright/baseline.json index 762e1e26..e5c79fa2 100644 --- a/.basedpyright/baseline.json +++ b/.basedpyright/baseline.json @@ -3597,46 +3597,6 @@ "lineCount": 1 } }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 23, - "endColumn": 37, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 23, - "endColumn": 37, - "lineCount": 1 - } - }, - { - "code": "reportCallInDefaultInitializer", - "range": { - "startColumn": 38, - "endColumn": 49, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 8, - "endColumn": 27, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 13, - "endColumn": 27, - "lineCount": 1 - } - }, { "code": "reportUnknownParameterType", "range": { @@ -3701,14 +3661,6 @@ "lineCount": 1 } }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 23, - "endColumn": 42, - "lineCount": 1 - } - }, { "code": "reportUnannotatedClassAttribute", "range": { @@ -4397,6 +4349,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 34, + "endColumn": 46, + "lineCount": 1 + } + }, { "code": "reportUnknownParameterType", "range": { @@ -6233,6 +6193,14 @@ } ], "./sumpy/derivative_taker.py": [ + { + "code": "reportMissingTypeStubs", + "range": { + "startColumn": 11, + "endColumn": 16, + "lineCount": 1 + } + }, { "code": "reportUnknownParameterType", "range": { @@ -7577,6 +7545,14 @@ "lineCount": 1 } }, + { + "code": "reportOperatorIssue", + "range": { + "startColumn": 12, + "endColumn": 57, + "lineCount": 1 + } + }, { "code": "reportUnknownArgumentType", "range": { @@ -7601,54 +7577,6 @@ "lineCount": 1 } }, - { - "code": "reportAny", - "range": { - "startColumn": 26, - "endColumn": 31, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 20, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 8, - "endColumn": 20, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 22, - "endColumn": 31, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 22, - "endColumn": 31, - "lineCount": 1 - } - }, - { - "code": "reportAny", - "range": { - "startColumn": 12, - "endColumn": 17, - "lineCount": 1 - } - }, { "code": "reportUnknownMemberType", "range": { @@ -7656,22 +7584,6 @@ "endColumn": 43, "lineCount": 1 } - }, - { - "code": "reportAny", - "range": { - "startColumn": 32, - "endColumn": 37, - "lineCount": 1 - } - }, - { - "code": "reportAny", - "range": { - "startColumn": 46, - "endColumn": 51, - "lineCount": 1 - } } ], "./sumpy/distributed.py": [ @@ -9221,6 +9133,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -9998,10 +9918,10 @@ } }, { - "code": "reportUnknownArgumentType", + "code": "reportUnknownMemberType", "range": { - "startColumn": 32, - "endColumn": 39, + "startColumn": 15, + "endColumn": 31, "lineCount": 1 } }, @@ -10221,6 +10141,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -10789,6 +10717,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -11293,6 +11229,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -11757,6 +11701,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -12157,6 +12109,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -12525,6 +12485,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -13199,6 +13167,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -13471,6 +13447,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -13729,14 +13713,6 @@ "lineCount": 1 } }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, { "code": "reportUnknownParameterType", "range": { @@ -20569,14 +20545,6 @@ } ], "./sumpy/expansion/loopy.py": [ - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 11, - "endColumn": 30, - "lineCount": 1 - } - }, { "code": "reportUnknownMemberType", "range": { @@ -20585,14 +20553,6 @@ "lineCount": 1 } }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 18, - "endColumn": 37, - "lineCount": 1 - } - }, { "code": "reportUnknownMemberType", "range": { @@ -20658,18 +20618,18 @@ } }, { - "code": "reportUnknownArgumentType", + "code": "reportUnknownMemberType", "range": { - "startColumn": 42, - "endColumn": 47, + "startColumn": 16, + "endColumn": 32, "lineCount": 1 } }, { - "code": "reportUnknownMemberType", + "code": "reportUnknownArgumentType", "range": { - "startColumn": 16, - "endColumn": 28, + "startColumn": 42, + "endColumn": 47, "lineCount": 1 } }, @@ -20700,8 +20660,8 @@ { "code": "reportUnknownMemberType", "range": { - "startColumn": 11, - "endColumn": 30, + "startColumn": 16, + "endColumn": 28, "lineCount": 1 } }, @@ -20713,14 +20673,6 @@ "lineCount": 1 } }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 20, - "endColumn": 39, - "lineCount": 1 - } - }, { "code": "reportUnknownMemberType", "range": { @@ -20785,6 +20737,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 16, + "endColumn": 32, + "lineCount": 1 + } + }, { "code": "reportUnknownArgumentType", "range": { @@ -23171,6 +23131,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 14, + "endColumn": 30, + "lineCount": 1 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -23735,7 +23703,7 @@ "code": "reportUnknownMemberType", "range": { "startColumn": 16, - "endColumn": 28, + "endColumn": 32, "lineCount": 1 } }, @@ -23747,283 +23715,299 @@ "lineCount": 1 } }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 26, - "endColumn": 38, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 29, - "endColumn": 45, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 17, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 24, - "endColumn": 37, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 24, - "endColumn": 37, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 39, - "endColumn": 52, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 39, - "endColumn": 52, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 54, - "endColumn": 69, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 54, - "endColumn": 69, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 71, - "endColumn": 81, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 71, - "endColumn": 81, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 12, - "endColumn": 16, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 12, - "endColumn": 16, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 18, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 18, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 30, - "endColumn": 33, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 30, - "endColumn": 33, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 40, - "endColumn": 74, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 40, - "endColumn": 74, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 50, - "endColumn": 65, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 12, - "endColumn": 23, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 23, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 30, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 30, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 45, - "endColumn": 58, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 45, - "endColumn": 58, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 21, - "endColumn": 53, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 54, - "endColumn": 67, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 58, - "endColumn": 71, - "lineCount": 1 - } - }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 21, - "endColumn": 50, + "startColumn": 16, + "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 51, - "endColumn": 64, + "startColumn": 26, + "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 66, - "endColumn": 79, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 20, - "endColumn": 32, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 20, - "endColumn": 32, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 17, + "startColumn": 29, + "endColumn": 45, + "lineCount": 1 + } + }, + { + "code": "reportImplicitOverride", + "range": { + "startColumn": 8, + "endColumn": 17, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 24, + "endColumn": 37, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 24, + "endColumn": 37, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 39, + "endColumn": 52, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 39, + "endColumn": 52, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 54, + "endColumn": 69, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 54, + "endColumn": 69, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 71, + "endColumn": 81, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 71, + "endColumn": 81, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 12, + "endColumn": 16, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 12, + "endColumn": 16, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 18, + "endColumn": 28, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 18, + "endColumn": 28, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 30, + "endColumn": 33, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 30, + "endColumn": 33, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 40, + "endColumn": 74, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 40, + "endColumn": 74, + "lineCount": 1 + } + }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 50, + "endColumn": 65, + "lineCount": 1 + } + }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 12, + "endColumn": 23, + "lineCount": 1 + } + }, + { + "code": "reportImplicitOverride", + "range": { + "startColumn": 8, + "endColumn": 23, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 30, + "endColumn": 43, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 30, + "endColumn": 43, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 45, + "endColumn": 58, + "lineCount": 1 + } + }, + { + "code": "reportMissingParameterType", + "range": { + "startColumn": 45, + "endColumn": 58, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 21, + "endColumn": 53, + "lineCount": 1 + } + }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 54, + "endColumn": 67, + "lineCount": 1 + } + }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 58, + "endColumn": 71, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 21, + "endColumn": 50, + "lineCount": 1 + } + }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 51, + "endColumn": 64, + "lineCount": 1 + } + }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 66, + "endColumn": 79, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 15, + "endColumn": 31, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 32, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 32, + "lineCount": 1 + } + }, + { + "code": "reportUnknownParameterType", + "range": { + "startColumn": 8, + "endColumn": 17, "lineCount": 1 } }, @@ -25947,6 +25931,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 15, + "endColumn": 31, + "lineCount": 1 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -26771,14 +26763,6 @@ "lineCount": 1 } }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 11, - "endColumn": 30, - "lineCount": 1 - } - }, { "code": "reportUnknownMemberType", "range": { @@ -26891,6 +26875,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 10, + "endColumn": 26, + "lineCount": 1 + } + }, { "code": "reportUnknownArgumentType", "range": { @@ -27085,14 +27077,6 @@ "lineCount": 1 } }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 24, - "endColumn": 52, - "lineCount": 1 - } - }, { "code": "reportAny", "range": { @@ -28205,6 +28189,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 20, + "endColumn": 67, + "lineCount": 3 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -33737,86 +33729,6 @@ "lineCount": 1 } }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportUnknownLambdaType", - "range": { - "startColumn": 22, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportUnknownLambdaType", - "range": { - "startColumn": 28, - "endColumn": 32, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 13, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 20, - "endColumn": 24, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 20, - "endColumn": 24, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 26, - "endColumn": 29, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 26, - "endColumn": 29, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 31, - "endColumn": 33, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 31, - "endColumn": 33, - "lineCount": 1 - } - }, { "code": "reportUnknownMemberType", "range": { @@ -33826,3170 +33738,282 @@ } }, { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 29, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 36, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 36, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 42, - "endColumn": 46, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 42, - "endColumn": 46, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", + "code": "reportUnusedParameter", "range": { - "startColumn": 20, + "startColumn": 56, "endColumn": 60, "lineCount": 1 } }, { - "code": "reportUnknownMemberType", + "code": "reportReturnType", "range": { - "startColumn": 30, - "endColumn": 40, + "startColumn": 15, + "endColumn": 19, "lineCount": 1 } }, { - "code": "reportUnknownArgumentType", + "code": "reportUnknownMemberType", "range": { - "startColumn": 41, - "endColumn": 45, + "startColumn": 15, + "endColumn": 28, "lineCount": 1 } }, { - "code": "reportUnknownArgumentType", + "code": "reportArgumentType", "range": { - "startColumn": 47, + "startColumn": 43, "endColumn": 51, "lineCount": 1 } }, { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 29, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 36, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", + "code": "reportArgumentType", "range": { - "startColumn": 36, - "endColumn": 40, + "startColumn": 68, + "endColumn": 74, "lineCount": 1 } }, { - "code": "reportUnknownParameterType", + "code": "reportArgumentType", "range": { - "startColumn": 42, - "endColumn": 46, + "startColumn": 71, + "endColumn": 77, "lineCount": 1 } }, { - "code": "reportMissingParameterType", + "code": "reportArgumentType", "range": { - "startColumn": 42, - "endColumn": 46, + "startColumn": 70, + "endColumn": 76, "lineCount": 1 } }, { - "code": "reportUnusedParameter", + "code": "reportArgumentType", "range": { - "startColumn": 42, - "endColumn": 46, + "startColumn": 73, + "endColumn": 79, "lineCount": 1 } }, { - "code": "reportUnknownParameterType", + "code": "reportReturnType", "range": { - "startColumn": 8, - "endColumn": 43, + "startColumn": 15, + "endColumn": 38, "lineCount": 1 } }, { - "code": "reportUnknownParameterType", + "code": "reportArgumentType", "range": { - "startColumn": 50, - "endColumn": 59, + "startColumn": 73, + "endColumn": 79, "lineCount": 1 } }, { - "code": "reportMissingParameterType", + "code": "reportReturnType", "range": { - "startColumn": 50, - "endColumn": 59, + "startColumn": 15, + "endColumn": 40, "lineCount": 1 } }, { - "code": "reportUnknownParameterType", + "code": "reportArgumentType", "range": { "startColumn": 35, - "endColumn": 39, + "endColumn": 50, "lineCount": 1 } }, { - "code": "reportMissingParameterType", + "code": "reportUnknownMemberType", "range": { - "startColumn": 35, - "endColumn": 39, + "startColumn": 20, + "endColumn": 35, "lineCount": 1 } }, { - "code": "reportUnknownParameterType", + "code": "reportUnknownMemberType", "range": { - "startColumn": 41, - "endColumn": 47, + "startColumn": 22, + "endColumn": 37, "lineCount": 1 } }, { - "code": "reportMissingParameterType", + "code": "reportIndexIssue", "range": { - "startColumn": 41, - "endColumn": 47, + "startColumn": 20, + "endColumn": 34, "lineCount": 1 } }, { - "code": "reportUnknownParameterType", + "code": "reportIndexIssue", "range": { - "startColumn": 49, - "endColumn": 52, + "startColumn": 20, + "endColumn": 34, "lineCount": 1 } }, { - "code": "reportMissingParameterType", + "code": "reportIndexIssue", "range": { - "startColumn": 49, - "endColumn": 52, + "startColumn": 20, + "endColumn": 34, "lineCount": 1 } }, { - "code": "reportImplicitOverride", + "code": "reportIndexIssue", "range": { - "startColumn": 8, - "endColumn": 16, + "startColumn": 20, + "endColumn": 34, "lineCount": 1 } }, { - "code": "reportUnknownParameterType", + "code": "reportIndexIssue", "range": { - "startColumn": 8, - "endColumn": 22, + "startColumn": 20, + "endColumn": 34, "lineCount": 1 } }, { - "code": "reportIncompatibleMethodOverride", + "code": "reportIndexIssue", "range": { - "startColumn": 8, - "endColumn": 22, + "startColumn": 20, + "endColumn": 34, "lineCount": 1 } }, { - "code": "reportImplicitOverride", + "code": "reportIndexIssue", "range": { - "startColumn": 8, - "endColumn": 22, + "startColumn": 20, + "endColumn": 34, "lineCount": 1 } }, { - "code": "reportUnknownParameterType", + "code": "reportCallIssue", "range": { - "startColumn": 29, - "endColumn": 44, + "startColumn": 20, + "endColumn": 74, "lineCount": 1 } }, { - "code": "reportMissingParameterType", + "code": "reportArgumentType", "range": { - "startColumn": 29, - "endColumn": 44, + "startColumn": 20, + "endColumn": 74, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { - "startColumn": 27, - "endColumn": 42, + "startColumn": 20, + "endColumn": 74, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 15, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 43, - "endColumn": 58, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 32, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 32, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 35, - "endColumn": 39, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 35, - "endColumn": 39, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 49, - "endColumn": 52, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 49, - "endColumn": 52, + "startColumn": 21, + "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 35, - "endColumn": 54, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 35, - "endColumn": 60, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 55, - "endColumn": 59, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 62, + "startColumn": 51, "endColumn": 66, "lineCount": 1 } }, { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 68, - "endColumn": 74, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 76, - "endColumn": 79, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 16, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", + "code": "reportOperatorIssue", "range": { - "startColumn": 8, - "endColumn": 28, + "startColumn": 16, + "endColumn": 63, "lineCount": 1 } }, { - "code": "reportUnknownParameterType", + "code": "reportOperatorIssue", "range": { - "startColumn": 35, - "endColumn": 39, + "startColumn": 42, + "endColumn": 63, "lineCount": 1 } }, { - "code": "reportMissingParameterType", + "code": "reportUnknownMemberType", "range": { - "startColumn": 35, - "endColumn": 39, + "startColumn": 26, + "endColumn": 38, "lineCount": 1 } }, { - "code": "reportUnknownParameterType", + "code": "reportOperatorIssue", "range": { - "startColumn": 41, - "endColumn": 47, + "startColumn": 16, + "endColumn": 63, "lineCount": 1 } }, { - "code": "reportMissingParameterType", + "code": "reportOperatorIssue", "range": { "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 49, - "endColumn": 52, + "endColumn": 63, "lineCount": 1 } }, { - "code": "reportMissingParameterType", + "code": "reportUnknownMemberType", "range": { - "startColumn": 49, - "endColumn": 52, + "startColumn": 30, + "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { - "startColumn": 38, - "endColumn": 57, + "startColumn": 53, + "endColumn": 67, "lineCount": 1 } }, { - "code": "reportUnknownArgumentType", + "code": "reportArgumentType", "range": { - "startColumn": 38, - "endColumn": 63, + "startColumn": 53, + "endColumn": 67, "lineCount": 1 } }, { - "code": "reportUnknownArgumentType", + "code": "reportAttributeAccessIssue", "range": { "startColumn": 58, - "endColumn": 62, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 65, - "endColumn": 69, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 71, - "endColumn": 77, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 79, - "endColumn": 82, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 16, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 35, - "endColumn": 39, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 35, - "endColumn": 39, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 49, - "endColumn": 52, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 49, - "endColumn": 52, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 37, - "endColumn": 56, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 37, - "endColumn": 62, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 57, - "endColumn": 61, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 64, - "endColumn": 68, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 70, - "endColumn": 76, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 16, - "endColumn": 19, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 16, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 35, - "endColumn": 44, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 16, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 35, - "endColumn": 39, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 35, - "endColumn": 39, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 49, - "endColumn": 52, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 49, - "endColumn": 52, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 40, - "endColumn": 59, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 40, - "endColumn": 65, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 60, - "endColumn": 64, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 67, - "endColumn": 71, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 73, - "endColumn": 79, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 81, - "endColumn": 84, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 16, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 35, - "endColumn": 44, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 16, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 35, - "endColumn": 39, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 35, - "endColumn": 39, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 49, - "endColumn": 52, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 49, - "endColumn": 52, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 40, - "endColumn": 59, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 40, - "endColumn": 65, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 60, - "endColumn": 64, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 67, - "endColumn": 71, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 73, - "endColumn": 79, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 81, - "endColumn": 84, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportArgumentType", - "range": { - "startColumn": 39, - "endColumn": 54, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 16, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 12, - "endColumn": 22, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 60, - "endColumn": 66, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 60, - "endColumn": 66, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 23, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 12, - "endColumn": 22, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 60, - "endColumn": 66, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 60, - "endColumn": 66, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 23, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 23, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 28, - "endColumn": 33, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 28, - "endColumn": 33, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 35, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 35, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 42, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 42, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 49, - "endColumn": 61, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 16, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 53, - "endColumn": 59, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 53, - "endColumn": 59, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 16, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 16, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 25, - "endColumn": 61, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 19, - "endColumn": 56, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 12, - "endColumn": 22, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 60, - "endColumn": 66, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 60, - "endColumn": 66, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 23, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 35, - "endColumn": 44, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 25, - "lineCount": 1 - } - }, - { - "code": "reportIncompatibleMethodOverride", - "range": { - "startColumn": 8, - "endColumn": 22, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 22, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 29, - "endColumn": 44, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 29, - "endColumn": 44, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 48, - "endColumn": 63, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 50, - "endColumn": 59, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 50, - "endColumn": 59, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 15, - "endColumn": 68, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 69, - "endColumn": 78, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 29, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 29, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 36, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 36, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 42, - "endColumn": 46, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 42, - "endColumn": 46, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 15, - "endColumn": 54, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 55, - "endColumn": 59, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 61, - "endColumn": 65, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 32, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 16, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 23, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 27, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 27, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 34, - "endColumn": 49, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 35, - "endColumn": 39, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 35, - "endColumn": 39, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 49, - "endColumn": 52, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 49, - "endColumn": 52, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 15, - "endColumn": 53, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 54, - "endColumn": 58, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 60, - "endColumn": 66, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 68, - "endColumn": 71, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 15, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 50, - "endColumn": 59, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 50, - "endColumn": 59, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 20, - "endColumn": 73, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 12, - "endColumn": 21, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 25, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 26, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 25, - "endColumn": 31, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 27, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 34, - "endColumn": 49, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 34, - "endColumn": 49, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 50, - "endColumn": 65, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 35, - "endColumn": 51, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 35, - "endColumn": 51, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 37, - "endColumn": 53, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 29, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 29, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 36, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 36, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 42, - "endColumn": 46, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 42, - "endColumn": 46, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 15, - "endColumn": 54, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 55, - "endColumn": 59, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 61, - "endColumn": 65, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 19, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 48, - "endColumn": 57, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 27, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 34, - "endColumn": 49, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 34, - "endColumn": 49, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 50, - "endColumn": 65, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 35, - "endColumn": 51, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 35, - "endColumn": 51, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 37, - "endColumn": 53, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 23, - "endColumn": 31, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 23, - "endColumn": 31, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 33, - "endColumn": 51, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 33, - "endColumn": 51, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 13, - "endColumn": 21, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 13, - "endColumn": 31, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 21, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 28, - "endColumn": 32, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 28, - "endColumn": 32, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 12, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 12, - "endColumn": 31, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 31, - "endColumn": 41, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 20, - "endColumn": 34, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 20, - "endColumn": 74, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 54, - "endColumn": 58, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 41, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 27, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 34, - "endColumn": 49, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 34, - "endColumn": 49, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 64, - "endColumn": 79, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 4, - "endColumn": 21, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportArgumentType", - "range": { - "startColumn": 38, - "endColumn": 57, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 22, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 22, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 27, - "endColumn": 48, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 43, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 29, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 29, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 36, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 36, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 42, - "endColumn": 46, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 42, - "endColumn": 46, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 15, - "endColumn": 54, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 55, - "endColumn": 59, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 61, - "endColumn": 65, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 27, - "endColumn": 36, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 51, - "endColumn": 60, - "lineCount": 1 - } - }, - { - "code": "reportAny", - "range": { - "startColumn": 20, - "endColumn": 25, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 21, - "endColumn": 39, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 16, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 26, - "endColumn": 38, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 35, - "endColumn": 44, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 35, - "endColumn": 44, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 59, - "endColumn": 68, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportArgumentType", - "range": { - "startColumn": 38, - "endColumn": 57, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 22, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 22, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 27, - "endColumn": 38, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 33, - "endColumn": 37, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 50, - "endColumn": 59, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 50, - "endColumn": 59, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 20, - "endColumn": 73, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 12, - "endColumn": 21, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 25, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 30, - "endColumn": 32, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 29, - "endColumn": 35, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 23, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 30, - "endColumn": 42, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 35, - "endColumn": 44, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 35, - "endColumn": 44, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 59, - "endColumn": 68, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 23, - "endColumn": 27, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 23, - "endColumn": 27, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 29, - "endColumn": 41, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 29, - "endColumn": 41, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 37, - "endColumn": 49, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 15, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 27, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 34, - "endColumn": 49, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 34, - "endColumn": 49, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 50, - "endColumn": 65, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 35, - "endColumn": 51, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 35, - "endColumn": 51, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 37, - "endColumn": 53, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 29, - "lineCount": 1 - } - }, - { - "code": "reportIncompatibleMethodOverride", - "range": { - "startColumn": 8, - "endColumn": 29, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 29, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 36, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 36, - "endColumn": 40, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 42, - "endColumn": 46, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 42, - "endColumn": 46, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 15, - "endColumn": 54, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 55, - "endColumn": 59, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 61, - "endColumn": 65, - "lineCount": 1 - } - }, - { - "code": "reportAny", - "range": { - "startColumn": 50, - "endColumn": 55, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 65, - "endColumn": 74, - "lineCount": 1 - } - }, - { - "code": "reportCallIssue", - "range": { - "startColumn": 19, - "endColumn": 67, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportArgumentType", - "range": { - "startColumn": 38, - "endColumn": 62, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 22, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 22, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 27, - "endColumn": 48, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 43, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportAny", - "range": { - "startColumn": 12, - "endColumn": 18, - "lineCount": 1 - } - }, - { - "code": "reportAny", - "range": { - "startColumn": 19, - "endColumn": 33, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 4, - "endColumn": 12, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 24, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 24, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 4, - "endColumn": 37, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 4, - "endColumn": 37, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 4, - "endColumn": 30, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 4, - "endColumn": 31, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 8, - "endColumn": 29, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 36, - "endColumn": 42, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 36, - "endColumn": 42, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 4, - "endColumn": 22, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 4, - "endColumn": 25, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 4, - "endColumn": 24, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 4, - "endColumn": 21, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 4, - "endColumn": 25, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 4, - "endColumn": 34, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 4, - "endColumn": 24, - "lineCount": 1 - } - }, - { - "code": "reportAny", - "range": { - "startColumn": 8, - "endColumn": 34, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportAny", - "range": { - "startColumn": 15, - "endColumn": 71, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 20, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 28, - "endColumn": 39, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 50, - "endColumn": 69, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 50, - "endColumn": 69, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 4, - "endColumn": 30, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 4, - "endColumn": 31, - "lineCount": 1 - } - }, - { - "code": "reportAny", - "range": { - "startColumn": 8, - "endColumn": 41, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 48, - "endColumn": 54, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 48, - "endColumn": 54, - "lineCount": 1 - } - }, - { - "code": "reportAny", - "range": { - "startColumn": 15, - "endColumn": 36, - "lineCount": 3 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 20, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 25, - "endColumn": 44, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 25, - "endColumn": 44, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 16, - "endColumn": 35, - "lineCount": 1 - } - }, - { - "code": "reportUnannotatedClassAttribute", - "range": { - "startColumn": 4, - "endColumn": 37, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 34, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 24, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 24, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 34, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 41, - "endColumn": 47, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 24, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 24, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 41, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 48, - "endColumn": 54, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 48, - "endColumn": 54, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 24, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 24, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 41, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 48, - "endColumn": 54, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 48, - "endColumn": 54, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 24, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 24, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 35, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 42, - "endColumn": 48, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 42, - "endColumn": 48, - "lineCount": 1 - } - }, - { - "code": "reportUnknownMemberType", - "range": { - "startColumn": 24, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 24, - "endColumn": 43, - "lineCount": 1 - } - }, - { - "code": "reportImplicitOverride", - "range": { - "startColumn": 8, - "endColumn": 15, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 22, - "endColumn": 28, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 36, - "endColumn": 42, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 36, - "endColumn": 42, - "lineCount": 1 - } - }, - { - "code": "reportUnusedParameter", - "range": { - "startColumn": 36, - "endColumn": 42, + "endColumn": 67, "lineCount": 1 } }, @@ -37025,6 +34049,14 @@ "lineCount": 1 } }, + { + "code": "reportUnannotatedClassAttribute", + "range": { + "startColumn": 4, + "endColumn": 25, + "lineCount": 1 + } + }, { "code": "reportUnannotatedClassAttribute", "range": { @@ -37042,42 +34074,58 @@ } }, { - "code": "reportImplicitOverride", + "code": "reportUnusedParameter", "range": { - "startColumn": 8, - "endColumn": 34, + "startColumn": 36, + "endColumn": 42, "lineCount": 1 } }, { - "code": "reportUnknownParameterType", + "code": "reportUnannotatedClassAttribute", "range": { - "startColumn": 41, - "endColumn": 47, + "startColumn": 4, + "endColumn": 22, "lineCount": 1 } }, { - "code": "reportMissingParameterType", + "code": "reportUnannotatedClassAttribute", "range": { - "startColumn": 41, - "endColumn": 47, + "startColumn": 4, + "endColumn": 25, "lineCount": 1 } }, { - "code": "reportUnknownMemberType", + "code": "reportUnannotatedClassAttribute", "range": { - "startColumn": 28, - "endColumn": 47, + "startColumn": 4, + "endColumn": 24, "lineCount": 1 } }, { - "code": "reportUnknownArgumentType", + "code": "reportUnannotatedClassAttribute", "range": { - "startColumn": 28, - "endColumn": 47, + "startColumn": 4, + "endColumn": 21, + "lineCount": 1 + } + }, + { + "code": "reportUnannotatedClassAttribute", + "range": { + "startColumn": 4, + "endColumn": 34, + "lineCount": 1 + } + }, + { + "code": "reportUnannotatedClassAttribute", + "range": { + "startColumn": 4, + "endColumn": 24, "lineCount": 1 } }, @@ -37089,6 +34137,14 @@ "lineCount": 1 } }, + { + "code": "reportAssignmentType", + "range": { + "startColumn": 40, + "endColumn": 66, + "lineCount": 1 + } + }, { "code": "reportUnannotatedClassAttribute", "range": { @@ -37097,6 +34153,14 @@ "lineCount": 1 } }, + { + "code": "reportAssignmentType", + "range": { + "startColumn": 40, + "endColumn": 66, + "lineCount": 1 + } + }, { "code": "reportUnannotatedClassAttribute", "range": { @@ -37104,6 +34168,14 @@ "endColumn": 30, "lineCount": 1 } + }, + { + "code": "reportAssignmentType", + "range": { + "startColumn": 33, + "endColumn": 59, + "lineCount": 1 + } } ], "./sumpy/p2e.py": [ @@ -37699,6 +34771,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -38003,6 +35083,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportUnknownArgumentType", "range": { @@ -38446,18 +35534,18 @@ } }, { - "code": "reportUnknownMemberType", + "code": "reportCallIssue", "range": { "startColumn": 23, - "endColumn": 51, - "lineCount": 1 + "endColumn": 33, + "lineCount": 3 } }, { "code": "reportArgumentType", "range": { - "startColumn": 50, - "endColumn": 54, + "startColumn": 28, + "endColumn": 55, "lineCount": 1 } }, @@ -38470,10 +35558,18 @@ } }, { - "code": "reportUnknownMemberType", + "code": "reportCallIssue", "range": { "startColumn": 23, - "endColumn": 52, + "endColumn": 68, + "lineCount": 1 + } + }, + { + "code": "reportArgumentType", + "range": { + "startColumn": 53, + "endColumn": 61, "lineCount": 1 } }, @@ -38485,6 +35581,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownArgumentType", + "range": { + "startColumn": 25, + "endColumn": 33, + "lineCount": 1 + } + }, { "code": "reportUnknownMemberType", "range": { @@ -38741,6 +35845,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportUnknownParameterType", "range": { @@ -38981,6 +36093,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportUnknownParameterType", "range": { @@ -39213,6 +36333,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportImplicitOverride", "range": { @@ -39589,6 +36717,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportUnknownArgumentType", "range": { @@ -42081,6 +39217,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportUnknownParameterType", "range": { @@ -42369,6 +39513,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportUnknownParameterType", "range": { @@ -42649,6 +39801,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 20, + "endColumn": 34, + "lineCount": 1 + } + }, { "code": "reportIncompatibleMethodOverride", "range": { @@ -44411,46 +41571,6 @@ "lineCount": 1 } }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 20, - "endColumn": 24, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 20, - "endColumn": 24, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 26, - "endColumn": 36, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 26, - "endColumn": 36, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 63, - "endColumn": 73, - "lineCount": 1 - } - }, { "code": "reportUnknownParameterType", "range": { @@ -45389,38 +42509,6 @@ "lineCount": 1 } }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 4, - "endColumn": 21, - "lineCount": 1 - } - }, - { - "code": "reportUnknownParameterType", - "range": { - "startColumn": 22, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportMissingParameterType", - "range": { - "startColumn": 22, - "endColumn": 26, - "lineCount": 1 - } - }, - { - "code": "reportUnknownArgumentType", - "range": { - "startColumn": 11, - "endColumn": 15, - "lineCount": 1 - } - }, { "code": "reportUnknownMemberType", "range": { @@ -47245,6 +44333,14 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 10, + "endColumn": 24, + "lineCount": 1 + } + }, { "code": "reportMissingTypeStubs", "range": { @@ -47357,6 +44453,22 @@ "lineCount": 1 } }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 19, + "endColumn": 37, + "lineCount": 1 + } + }, + { + "code": "reportUnknownMemberType", + "range": { + "startColumn": 19, + "endColumn": 36, + "lineCount": 1 + } + }, { "code": "reportAny", "range": { diff --git a/doc/conf.py b/doc/conf.py index 852bbd15..f54cc414 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -2,8 +2,7 @@ from urllib.request import urlopen -_conf_url = \ - "https://raw.githubusercontent.com/inducer/sphinxconfig/main/sphinxconfig.py" +_conf_url = "https://raw.githubusercontent.com/inducer/sphinxconfig/main/sphinxconfig.py" with urlopen(_conf_url) as _inf: exec(compile(_inf.read(), _conf_url, "exec"), globals()) @@ -30,9 +29,13 @@ ] sphinxconfig_missing_reference_aliases = { + # sympy + "sp.Matrix": "class:sympy.matrices.dense.DenseMatrix", # pymbolic - "Expression": "obj:pymbolic.typing.Expression", "ArithmeticExpression": "obj:pymbolic.ArithmeticExpression", + "Expression": "obj:pymbolic.typing.Expression", + # sumpy + "ArithmeticExpr": "obj:sumpy.kernel.ArithmeticExpr", } diff --git a/sumpy/codegen.py b/sumpy/codegen.py index 29abf02a..f903464e 100644 --- a/sumpy/codegen.py +++ b/sumpy/codegen.py @@ -549,7 +549,12 @@ def map_constant(self, expr, rec_self=None): class VectorComponentRewriter(CSECachingIdentityMapper, CallExternalRecMapper): """For names in name_whitelist, turn ``a3`` into ``a[3]``.""" - def __init__(self, name_whitelist=frozenset()): + name_whitelist: frozenset[str] + + def __init__(self, name_whitelist: frozenset[str] | None = None) -> None: + if name_whitelist is None: + name_whitelist = frozenset() + self.name_whitelist = name_whitelist def map_variable(self, expr, *args): diff --git a/sumpy/derivative_taker.py b/sumpy/derivative_taker.py index 926b0977..e7181c1e 100644 --- a/sumpy/derivative_taker.py +++ b/sumpy/derivative_taker.py @@ -39,7 +39,7 @@ """ import logging -from typing import Any +from typing import TYPE_CHECKING import numpy as np @@ -49,6 +49,9 @@ from sumpy.tools import add_mi, add_to_sac +if TYPE_CHECKING: + import sympy as sp + logger = logging.getLogger(__name__) @@ -341,7 +344,7 @@ def diff(self, mi, q=0): # {{{ DifferentiatedExprDerivativeTaker -DerivativeCoeffDict = dict[tuple[int, ...], Any] +DerivativeCoeffDict = dict[tuple[int, ...], int | float | complex | sym.Expr] @tag_dataclass @@ -387,8 +390,10 @@ def diff(self, mi, save_intermediate=lambda x: x): # {{{ Helper functions -def diff_derivative_coeff_dict(derivative_coeff_dict: DerivativeCoeffDict, - variable_idx, variables): +def diff_derivative_coeff_dict( + derivative_coeff_dict: DerivativeCoeffDict, + variable_idx: int, + variables: sp.Matrix) -> DerivativeCoeffDict: """Differentiate a derivative transformation dictionary given by *derivative_coeff_dict* using the variable given by **variable_idx** and return a new derivative transformation dictionary. @@ -397,15 +402,17 @@ def diff_derivative_coeff_dict(derivative_coeff_dict: DerivativeCoeffDict, new_derivative_coeff_dict: DerivativeCoeffDict = defaultdict(lambda: 0) for mi, coeff in derivative_coeff_dict.items(): - # In the case where we have x * u.diff(x), the result should - # be x.diff(x) + x * u.diff(x, x) + # In the case where we have x * u.diff(x), the result should be + # x.diff(x) + x * u.diff(x, x) # Calculate the first term by differentiating the coefficients new_coeff = sym.sympify(coeff).diff(variables[variable_idx]) new_derivative_coeff_dict[mi] += new_coeff + # Next calculate the second term by differentiating the derivatives new_mi = list(mi) new_mi[variable_idx] += 1 new_derivative_coeff_dict[tuple(new_mi)] += coeff + return {derivative: coeff for derivative, coeff in new_derivative_coeff_dict.items() if coeff != 0} diff --git a/sumpy/e2e.py b/sumpy/e2e.py index e6bedebf..4f5162f0 100644 --- a/sumpy/e2e.py +++ b/sumpy/e2e.py @@ -387,7 +387,7 @@ def get_inner_loopy_kernel(self, result_dtype): ncoeff_src = len(self.src_expansion) ncoeff_tgt = len(self.tgt_expansion) - domains = [] + domains: list[str] = [] insns = self.get_translation_loopy_insns(result_dtype) tgt_coeffs = pymbolic.var("tgt_coeffs") for i in range(ncoeff_tgt): diff --git a/sumpy/expansion/diff_op.py b/sumpy/expansion/diff_op.py index e3d9ad07..f2127a44 100644 --- a/sumpy/expansion/diff_op.py +++ b/sumpy/expansion/diff_op.py @@ -113,7 +113,7 @@ def order(self) -> int: deg = max(deg, max(sum(ident.mi) for ident in eq)) return deg - def __mul__(self, param: Number_ish) -> LinearPDESystemOperator: + def __mul__(self, param: Number_ish | sym.Expr) -> LinearPDESystemOperator: eqs: list[Mapping[DerivativeIdentifier, sp.Expr]] = [] for eq in self.eqs: deriv_ident_to_coeff = {} diff --git a/sumpy/kernel.py b/sumpy/kernel.py index 3ac1e03f..12d390ad 100644 --- a/sumpy/kernel.py +++ b/sumpy/kernel.py @@ -26,54 +26,89 @@ from abc import ABC, abstractmethod from collections import defaultdict from dataclasses import dataclass -from typing import TYPE_CHECKING, ClassVar, Generic, Literal, TypeVar +from typing import ( + TYPE_CHECKING, + ClassVar, + Generic, + Literal, + TypeAlias, + TypeVar, + cast, + overload, +) import numpy as np from typing_extensions import override import loopy as lp import pymbolic.primitives as prim -from pymbolic import ArithmeticExpression, Expression, var +from pymbolic import Expression, var from pymbolic.mapper import CSECachingMapperMixin, IdentityMapper from pymbolic.primitives import make_sym_vector from pytools import memoize_method import sumpy.symbolic as sym +from sumpy.derivative_taker import ( + DerivativeCoeffDict, + DifferentiatedExprDerivativeTaker, + ExprDerivativeTaker, + diff_derivative_coeff_dict, +) from sumpy.symbolic import SpatialConstant, pymbolic_real_norm_2 if TYPE_CHECKING: - from collections.abc import Iterable, Sequence + from collections.abc import Callable, Iterable, Sequence import sympy as sp - from sumpy.derivative_taker import ExprDerivativeTaker + from sumpy.assignment_collection import SymbolicAssignmentCollection from sumpy.expansion.diff_op import LinearPDESystemOperator - __doc__ = """ Kernel interface ---------------- -.. autoclass:: Kernel +.. autoclass:: ArithmeticExpr + .. autoclass:: KernelArgument +.. autoclass:: Kernel + :show-inheritance: Symbolic kernels ---------------- .. autoclass:: ExpressionKernel + :show-inheritance: + :members: mapper_method PDE kernels ----------- .. autoclass:: LaplaceKernel + :show-inheritance: + :members: mapper_method .. autoclass:: BiharmonicKernel + :show-inheritance: + :members: mapper_method .. autoclass:: HelmholtzKernel + :show-inheritance: + :members: mapper_method .. autoclass:: YukawaKernel + :show-inheritance: + :members: mapper_method .. autoclass:: StokesletKernel + :show-inheritance: + :members: mapper_method .. autoclass:: StressletKernel + :show-inheritance: + :members: mapper_method .. autoclass:: ElasticityKernel + :show-inheritance: + :members: mapper_method .. autoclass:: LineOfCompressionKernel + :show-inheritance: + :members: mapper_method Derivatives ----------- @@ -83,24 +118,54 @@ .. autoclass:: DerivativeBase .. autoclass:: AxisTargetDerivative + :show-inheritance: + :undoc-members: + :members: mapper_method,target_array_name .. autoclass:: AxisSourceDerivative + :show-inheritance: + :members: mapper_method +.. autoclass:: DirectionalDerivative + :show-inheritance: + :members: directional_kind .. autoclass:: DirectionalSourceDerivative + :show-inheritance: + :members: mapper_method,directional_kind .. autoclass:: DirectionalTargetDerivative + :show-inheritance: + :undoc-members: + :members: mapper_method,directional_kind,target_array_name Transforming kernels -------------------- +.. autoclass:: TargetPointMultiplier + :undoc-members: + :members: mapper_method,target_array_name + +.. autoclass:: ResultT + .. autoclass:: KernelMapper + :show-inheritance: .. autoclass:: KernelCombineMapper + :show-inheritance: .. autoclass:: KernelIdentityMapper + :show-inheritance: .. autoclass:: AxisSourceDerivativeRemover + :show-inheritance: .. autoclass:: AxisTargetDerivativeRemover + :show-inheritance: .. autoclass:: SourceDerivativeRemover + :show-inheritance: .. autoclass:: TargetDerivativeRemover -.. autoclass:: TargetPointMultiplier + :show-inheritance: +.. autoclass:: TargetTransformationRemover + :show-inheritance: .. autoclass:: DerivativeCounter + :show-inheritance: """ +ArithmeticExpr: TypeAlias = int | float | complex | sym.Basic + @dataclass(frozen=True) class KernelArgument: @@ -109,12 +174,13 @@ class KernelArgument: """ loopy_arg: lp.KernelArgument - """A :class:`loopy.KernelArgument` instance describing the type, - name, and other features of this kernel argument when - passed to a generated piece of code.""" + """A :class:`loopy.KernelArgument` instance describing the type, name, and + other features of this kernel argument when passed to a generated piece of + code. + """ @property - def name(self): + def name(self) -> str: return self.loopy_arg.name @@ -124,9 +190,11 @@ def name(self): class Kernel(ABC): """Basic kernel interface. - .. attribute:: is_complex_valued - .. attribute:: is_translation_invariant - .. attribute:: dim + .. autoattribute:: mapper_method + .. autoattribute:: is_translation_invariant + + .. autoattribute:: dim + .. autoproperty:: is_complex_valued .. automethod:: get_base_kernel .. automethod:: replace_base_kernel @@ -140,65 +208,108 @@ class Kernel(ABC): .. automethod:: get_source_args """ - if TYPE_CHECKING: - @property - def is_complex_valued(self) -> bool: - ... - dim: int + """Dimension of the space the kernel is defined in.""" + + # TODO: Allow kernels that are not translation invariant + is_translation_invariant: ClassVar[bool] = True + """A boolean flag indicating whether the kernel is translation invariant.""" + mapper_method: ClassVar[str] + """The name of the mapper method called for the kernel.""" + + @property + @abstractmethod + def is_complex_valued(self) -> bool: + """A boolean flag indicating whether this kernel is complex valued.""" def get_base_kernel(self) -> Kernel: - """Return the kernel being wrapped by this one, or else - *self*. + """ + :returns: the kernel being wrapped by this one, or else *self*. """ return self def replace_base_kernel(self, new_base_kernel: Kernel) -> Kernel: - """Return the base kernel being wrapped by this one, or else - *new_base_kernel*. + """ + :returns: the base kernel being wrapped by this one, or else + *new_base_kernel*. """ return new_base_kernel def prepare_loopy_kernel(self, loopy_knl: lp.TranslationUnit) -> lp.TranslationUnit: - """Apply some changes (such as registering function - manglers) to the kernel. Return the new kernel. + """Apply some changes (such as registering function manglers) to the kernel. + + :returns: a new :mod:`loopy` kernel with the applied changes. """ return loopy_knl - def get_code_transformer(self): - """Return a function to postprocess the :mod:`pymbolic` - expression generated from the result of - :meth:`get_expression` on the way to code generation. + def get_code_transformer(self) -> Callable[[Expression], Expression]: + """ + :returns: a function to postprocess the :mod:`pymbolic` expression + generated from the result of :meth:`get_expression` on the way to + code generation. """ return lambda expr: expr @abstractmethod - def get_expression(self, dist_vec: np.ndarray) -> sp.Expr: - r"""Return a :mod:`sympy` expression for the kernel.""" - ... + def get_expression(self, dist_vec: sp.Matrix) -> ArithmeticExpr: + """ + :returns: a :mod:`sympy` expression for the kernel. + """ - def _diff(self, expr, vec, mi): - """Take the derivative of an expression + @abstractmethod + def get_pde_as_diff_op(self) -> LinearPDESystemOperator: + r""" + :returns: the PDE for the kernel as a + :class:`sumpy.expansion.diff_op.LinearPDESystemOperator` object + :math:`\mathcal{L}`, where :math:`\mathcal{L}(u) = 0` is the PDE. """ + + def _diff(self, + expr: sym.Expr, + vec: sp.Matrix, + mi: tuple[int, ...]) -> sym.Expr: + """Take the derivative of an expression.""" for i in range(self.dim): if mi[i] == 0: continue expr = expr.diff(vec[i], mi[i]) + return expr - def postprocess_at_source(self, expr, avec): + @abstractmethod + def get_derivative_taker( + self, + dvec: sp.Matrix, + rscale: ArithmeticExpr, + sac: SymbolicAssignmentCollection, + ) -> ExprDerivativeTaker: + """ + :returns: an :class:`~sumpy.derivative_taker.ExprDerivativeTaker` instance + that supports taking derivatives of the base kernel with respect to + *dvec*. + """ + + @overload + def postprocess_at_source( + self, expr: sym.Expr, avec: sp.Matrix + ) -> sym.Expr: ... + + @overload + def postprocess_at_source( + self, expr: ExprDerivativeTaker, avec: sp.Matrix + ) -> DifferentiatedExprDerivativeTaker: ... + + def postprocess_at_source( + self, expr: sym.Expr | ExprDerivativeTaker, avec: sp.Matrix, + ) -> sym.Expr | DifferentiatedExprDerivativeTaker: """Transform a kernel evaluation or expansion expression in a place - where the vector a (something - source) is known. ("something" may be - an expansion center or a target.) + where the vector :math:`a` (something - source) is known. ("something" may be + an expansion center or a target) The typical use of this function is to apply source-variable derivatives to the kernel. """ - from sumpy.derivative_taker import ( - DifferentiatedExprDerivativeTaker, - ExprDerivativeTaker, - ) - expr_dict = {(0,)*self.dim: 1} + expr_dict: DerivativeCoeffDict = {(0,)*self.dim: 1} expr_dict = self.get_derivative_coeff_dict_at_source(expr_dict) if isinstance(expr, ExprDerivativeTaker): return DifferentiatedExprDerivativeTaker(expr, expr_dict) @@ -206,144 +317,137 @@ def postprocess_at_source(self, expr, avec): result = 0 for mi, coeff in expr_dict.items(): result += coeff * self._diff(expr, avec, mi) + + assert isinstance(result, sym.Expr) return result - def postprocess_at_target(self, expr, bvec): + @overload + def postprocess_at_target( + self, expr: sym.Expr, bvec: sp.Matrix, + ) -> sym.Expr: ... + + @overload + def postprocess_at_target( + self, expr: ExprDerivativeTaker, bvec: sp.Matrix, + ) -> DifferentiatedExprDerivativeTaker: ... + + def postprocess_at_target( + self, expr: sym.Expr | ExprDerivativeTaker, bvec: sp.Matrix, + ) -> sym.Expr | DifferentiatedExprDerivativeTaker: """Transform a kernel evaluation or expansion expression in a place - where the vector b (target - something) is known. ("something" may be - an expansion center or a target.) + where the vector :math:`b` (target - something) is known. ("something" may + be an expansion center or a target.) The typical use of this function is to apply target-variable derivatives to the kernel. - - :arg expr: may be a :class:`sympy.core.expr.Expr` or a - :class:`sumpy.derivative_taker.DifferentiatedExprDerivativeTaker`. """ return expr - def get_derivative_coeff_dict_at_source(self, expr_dict): - r"""Get the derivative transformation of the expression at source - represented by the dictionary expr_dict which is mapping from multi-index - `mi` to coefficient `coeff`. - Expression represented by the dictionary `expr_dict` is - :math:`\sum_{mi} \frac{\partial^mi}{x^mi}G * coeff`. Returns an - expression of the same type. + def get_derivative_coeff_dict_at_source( + self, expr_dict: DerivativeCoeffDict, + ) -> DerivativeCoeffDict: + r"""Get the derivative transformation of the expression at the source. + + The transformation is represented by the *expr_dict* which maps from a + multi-index *mi* to a coefficient *coeff*. The Expression represented by + *expr_dict* is :math:`\sum_{mi} \frac{\partial^mi}{x^mi}G * coeff`. This function is meant to be overridden by child classes where necessary. """ return expr_dict @abstractmethod - def get_global_scaling_const(self) -> ArithmeticExpression: - r"""Return a global scaling constant of the kernel. + def get_global_scaling_const(self) -> ArithmeticExpr: + r"""A global scaling constant of the kernel. + Typically, this ensures that the kernel is scaled so that - :math:`\mathcal L(G)(x)=C\delta(x)` with a constant of 1, where - :math:`\mathcal L` is the PDE operator associated with the kernel. - Not to be confused with *rscale*, which keeps expansion - coefficients benignly scaled. + :math:`\mathcal{L}(G)(x) = C \delta(x)` with a constant of 1, where + :math:`\mathcal{L}` is the PDE operator associated with the kernel. Not + to be confused with *rscale*, which keeps expansion coefficients + benignly scaled. """ - ... def get_args(self) -> Sequence[KernelArgument]: - """Return list of :class:`KernelArgument` instances describing - extra arguments used by the kernel. + """ + :returns: list of :class:`KernelArgument` instances describing extra + arguments used by the kernel. """ return [] def get_source_args(self) -> Sequence[KernelArgument]: - """Return list of :class:`KernelArgument` instances describing - extra arguments used by kernel in picking up contributions - from point sources. + """ + :returns: list of :class:`KernelArgument` instances describing extra + arguments used by kernel in picking up contributions from point sources. """ return [] - @abstractmethod - def get_pde_as_diff_op(self) -> LinearPDESystemOperator: - ... - - @abstractmethod - def get_derivative_taker(self, dvec, rscale, sac) -> ExprDerivativeTaker: - ... - - # TODO: Allow kernels that are not translation invariant - is_translation_invariant: ClassVar[bool] = True - - mapper_method: ClassVar[str] - # }}} @dataclass(frozen=True) -class ExpressionKernel(Kernel): +class ExpressionKernel(Kernel, ABC): r""" .. autoattribute:: expression .. autoattribute:: global_scaling_const - .. autoattribute:: is_complex_valued """ + mapper_method: ClassVar[str] = "map_expression_kernel" + expression: Expression - """A :mod:`pymbolic` expression depending on - variables *d_1* through *d_N* where *N* equals *dim*. - (These variables match what is returned from - :func:`pymbolic.primitives.make_sym_vector` with - argument `"d"`.) Any variable that is not *d* or - a :class:`~sumpy.symbolic.SpatialConstant` will be - viewed as potentially spatially varying. + """A :mod:`pymbolic` expression depending on variables *d_1* through *d_N* + where *N* equals *dim*. These variables match what is returned from + :func:`pymbolic.primitives.make_sym_vector` with argument `"d"`. Any + variable that is not *d* or a :class:`~sumpy.symbolic.SpatialConstant` will + be viewed as potentially spatially varying. """ global_scaling_const: Expression - - r"""A constant :mod:`pymbolic` expression for the - global scaling of the kernel. Typically, this ensures that - the kernel is scaled so that :math:`\mathcal L(G)(x)=C\delta(x)` - with a constant of 1, where :math:`\mathcal L` is the PDE - operator associated with the kernel. Not to be confused with - *rscale*, which keeps expansion coefficients benignly scaled. + r"""A constant :mod:`pymbolic` expression for the global scaling of the + kernel. Typically, this ensures that the kernel is scaled so that + :math:`\mathcal{L}(G)(x)=C\delta(x)` with a constant of 1, where + :math:`\mathcal{L}` is the PDE operator associated with the kernel. Not to + be confused with *rscale*, which keeps expansion coefficients benignly + scaled. """ - def __repr__(self): + @override + def __str__(self) -> str: return f"ExprKnl{self.dim}D" - def get_expression(self, scaled_dist_vec): - """Return :attr:`expression` as a :class:`sumpy.symbolic.Basic`.""" - + @override + def get_expression(self, dist_vec: sp.Matrix) -> ArithmeticExpr: from sumpy.symbolic import PymbolicToSympyMapperWithSymbols expr = PymbolicToSympyMapperWithSymbols()(self.expression) - if self.dim != len(scaled_dist_vec): - raise ValueError("dist_vec length does not match expected dimension") + if self.dim != len(dist_vec): + raise ValueError( + "'dist_vec' length does not match expected dimension: " + f"kernel dim is '{self.dim}' and dist_vec has length '{len(dist_vec)}'") from sumpy.symbolic import Symbol expr = expr.xreplace({ Symbol(f"d{i}"): dist_vec_i - for i, dist_vec_i in enumerate(scaled_dist_vec) + for i, dist_vec_i in enumerate(dist_vec) }) return expr - def get_global_scaling_const(self): - """Return a global scaling of the kernel as a :class:`sumpy.symbolic.Basic`. - """ - + @override + def get_global_scaling_const(self) -> ArithmeticExpr: from sumpy.symbolic import PymbolicToSympyMapperWithSymbols - return PymbolicToSympyMapperWithSymbols()( - self.global_scaling_const) + return PymbolicToSympyMapperWithSymbols()(self.global_scaling_const) - mapper_method: ClassVar[str] = "map_expression_kernel" - - def get_derivative_taker(self, dvec, rscale, sac): - """Return a :class:`sumpy.derivative_taker.ExprDerivativeTaker` instance - that supports taking derivatives of the base kernel with respect to dvec. - """ - from sumpy.derivative_taker import ExprDerivativeTaker + @override + def get_derivative_taker( + self, + dvec: sp.Matrix, + rscale: ArithmeticExpr, + sac: SymbolicAssignmentCollection, + ) -> ExprDerivativeTaker: return ExprDerivativeTaker(self.get_expression(dvec), dvec, rscale, sac) - def get_pde_as_diff_op(self): - r""" - Returns the PDE for the kernel as a - :class:`sumpy.expansion.diff_op.LinearPDESystemOperator` object `L` - where `L(u) = 0` is the PDE. - """ + @override + def get_pde_as_diff_op(self) -> LinearPDESystemOperator: raise NotImplementedError @@ -368,7 +472,9 @@ def is_complex_valued(self) -> bool: # {{{ PDE kernels class LaplaceKernel(ExpressionKernel): - def __init__(self, dim: int): + mapper_method: ClassVar[str] = "map_laplace_kernel" + + def __init__(self, dim: int) -> None: # See (Kress LIE, Thm 6.2) for scaling if dim == 2: r = pymbolic_real_norm_2(make_sym_vector("d", dim)) @@ -379,39 +485,40 @@ def __init__(self, dim: int): expr = 1/r scaling = 1/(4*var("pi")) else: - raise NotImplementedError("unsupported dimensionality") + raise NotImplementedError(f"unsupported dimension: '{dim}'") - super().__init__( - dim, - expression=expr, - global_scaling_const=scaling, - ) + super().__init__(dim, expression=expr, global_scaling_const=scaling) @property @override def is_complex_valued(self) -> bool: return False - def __repr__(self): + @override + def __str__(self) -> str: return f"LapKnl{self.dim}D" - mapper_method: ClassVar[str] = "map_laplace_kernel" - - def get_derivative_taker(self, dvec, rscale, sac): - """Return a :class:`sumpy.derivative_taker.ExprDerivativeTaker` instance - that supports taking derivatives of the base kernel with respect to dvec. - """ + @override + def get_derivative_taker( + self, + dvec: sp.Matrix, + rscale: ArithmeticExpr, + sac: SymbolicAssignmentCollection, + ) -> ExprDerivativeTaker: from sumpy.derivative_taker import LaplaceDerivativeTaker return LaplaceDerivativeTaker(self.get_expression(dvec), dvec, rscale, sac) - def get_pde_as_diff_op(self): + @override + def get_pde_as_diff_op(self) -> LinearPDESystemOperator: from sumpy.expansion.diff_op import laplacian, make_identity_diff_op w = make_identity_diff_op(self.dim) return laplacian(w) class BiharmonicKernel(ExpressionKernel): - def __init__(self, dim: int): + mapper_method: ClassVar[str] = "map_biharmonic_kernel" + + def __init__(self, dim: int) -> None: r = pymbolic_real_norm_2(make_sym_vector("d", dim)) if dim == 2: # Ref: Farkas, Peter. Mathematical foundations for fast algorithms @@ -427,33 +534,31 @@ def __init__(self, dim: int): expr = r scaling = -1/(8*var("pi")) else: - raise RuntimeError("unsupported dimensionality") + raise NotImplementedError(f"unsupported dimension: '{dim}'") - super().__init__( - dim, - expression=expr, - global_scaling_const=scaling, - ) + super().__init__(dim, expression=expr, global_scaling_const=scaling) @property @override def is_complex_valued(self) -> bool: return False - def __repr__(self): + @override + def __str__(self) -> str: return f"BiharmKnl{self.dim}D" - mapper_method: ClassVar[str] = "map_biharmonic_kernel" - - def get_derivative_taker(self, dvec, rscale, sac): - """Return a :class:`sumpy.derivative_taker.ExprDerivativeTaker` instance - that supports taking derivatives of the base kernel with respect to dvec. - """ + @override + def get_derivative_taker( + self, + dvec: sp.Matrix, + rscale: ArithmeticExpr, + sac: SymbolicAssignmentCollection, + ) -> ExprDerivativeTaker: from sumpy.derivative_taker import RadialDerivativeTaker - return RadialDerivativeTaker(self.get_expression(dvec), dvec, rscale, - sac) + return RadialDerivativeTaker(self.get_expression(dvec), dvec, rscale, sac) - def get_pde_as_diff_op(self): + @override + def get_pde_as_diff_op(self) -> LinearPDESystemOperator: from sumpy.expansion.diff_op import laplacian, make_identity_diff_op w = make_identity_diff_op(self.dim) return laplacian(laplacian(w)) @@ -461,15 +566,23 @@ def get_pde_as_diff_op(self): @dataclass(frozen=True) class HelmholtzKernel(ExpressionKernel): - helmholtz_k_name: str """ - The argument name to use for the Helmholtz - parameter when generating functions to evaluate this kernel. + .. autoattribute:: helmholtz_k_name + .. autoattribute:: allow_evanescent + """ + + mapper_method: ClassVar[str] = "map_helmholtz_kernel" + + helmholtz_k_name: str + """The argument name to use for the Helmholtz parameter when generating + functions to evaluate this kernel. """ allow_evanescent: bool - def __init__(self, dim: int, helmholtz_k_name: str = "k", - allow_evanescent: bool = False): + def __init__(self, + dim: int, + helmholtz_k_name: str = "k", + allow_evanescent: bool = False) -> None: k = SpatialConstant(helmholtz_k_name) # Guard against code using the old positional interface. @@ -484,13 +597,9 @@ def __init__(self, dim: int, helmholtz_k_name: str = "k", expr = var("exp")(var("I")*k*r)/r scaling = 1/(4*var("pi")) else: - raise RuntimeError("unsupported dimensionality") + raise NotImplementedError(f"unsupported dimension: '{dim}'") - super().__init__( - dim, - expression=expr, - global_scaling_const=scaling, - ) + super().__init__(dim, expression=expr, global_scaling_const=scaling) object.__setattr__(self, "helmholtz_k_name", helmholtz_k_name) object.__setattr__(self, "allow_evanescent", allow_evanescent) @@ -500,46 +609,56 @@ def __init__(self, dim: int, helmholtz_k_name: str = "k", def is_complex_valued(self) -> bool: return True - def __repr__(self): + @override + def __str__(self) -> str: return f"HelmKnl{self.dim}D({self.helmholtz_k_name})" - def prepare_loopy_kernel(self, loopy_knl): + @override + def prepare_loopy_kernel(self, loopy_knl: lp.TranslationUnit) -> lp.TranslationUnit: from sumpy.codegen import register_bessel_callables return register_bessel_callables(loopy_knl) - def get_args(self): + @override + def get_args(self) -> Sequence[KernelArgument]: k_dtype = np.complex128 if self.allow_evanescent else np.float64 return [ KernelArgument( loopy_arg=lp.ValueArg(self.helmholtz_k_name, k_dtype), )] - mapper_method: ClassVar[str] = "map_helmholtz_kernel" - - def get_derivative_taker(self, dvec, rscale, sac): - """Return a :class:`sumpy.derivative_taker.ExprDerivativeTaker` instance - that supports taking derivatives of the base kernel with respect to dvec. - """ + @override + def get_derivative_taker( + self, + dvec: sp.Matrix, + rscale: ArithmeticExpr, + sac: SymbolicAssignmentCollection, + ) -> ExprDerivativeTaker: from sumpy.derivative_taker import HelmholtzDerivativeTaker return HelmholtzDerivativeTaker(self.get_expression(dvec), dvec, rscale, sac) - def get_pde_as_diff_op(self): + @override + def get_pde_as_diff_op(self) -> LinearPDESystemOperator: from sumpy.expansion.diff_op import laplacian, make_identity_diff_op w = make_identity_diff_op(self.dim) k = sym.Symbol(self.helmholtz_k_name) - return (laplacian(w) + k**2 * w) + return laplacian(w) + k**2 * w @dataclass(frozen=True) class YukawaKernel(ExpressionKernel): + """ + .. autoattribute:: yukawa_lambda_name + """ + + mapper_method: ClassVar[str] = "map_yukawa_kernel" + yukawa_lambda_name: str + """The argument name to use for the Yukawa parameter when generating + functions to evaluate this kernel. + """ - def __init__(self, dim: int, yukawa_lambda_name: str = "lam"): - """ - :arg yukawa_lambda_name: The argument name to use for the Yukawa - parameter when generating functions to evaluate this kernel. - """ + def __init__(self, dim: int, yukawa_lambda_name: str = "lam") -> None: lam = SpatialConstant(yukawa_lambda_name) # NOTE: The Yukawa kernel is given by [1] @@ -567,14 +686,9 @@ def __init__(self, dim: int, yukawa_lambda_name: str = "lam"): scaling = -1/(4 * var("pi")**2) else: - raise RuntimeError("unsupported dimensionality") - - super().__init__( - dim, - expression=expr, - global_scaling_const=scaling, - ) + raise NotImplementedError(f"unsupported dimension: '{dim}'") + super().__init__(dim, expression=expr, global_scaling_const=scaling) object.__setattr__(self, "yukawa_lambda_name", yukawa_lambda_name) @property @@ -583,74 +697,84 @@ def is_complex_valued(self) -> bool: # FIXME return True - def __repr__(self): + @override + def __str__(self) -> str: return f"YukKnl{self.dim}D({self.yukawa_lambda_name})" - def prepare_loopy_kernel(self, loopy_knl): + @override + def prepare_loopy_kernel(self, loopy_knl: lp.TranslationUnit) -> lp.TranslationUnit: from sumpy.codegen import register_bessel_callables return register_bessel_callables(loopy_knl) - def get_args(self): + @override + def get_args(self) -> Sequence[KernelArgument]: return [ KernelArgument( loopy_arg=lp.ValueArg(self.yukawa_lambda_name, np.float64), )] - def get_derivative_taker(self, dvec, rscale, sac): - """Return a :class:`sumpy.derivative_taker.ExprDerivativeTaker` instance - that supports taking derivatives of the base kernel with respect to dvec. - """ + @override + def get_derivative_taker( + self, + dvec: sp.Matrix, + rscale: ArithmeticExpr, + sac: SymbolicAssignmentCollection, + ) -> ExprDerivativeTaker: from sumpy.derivative_taker import HelmholtzDerivativeTaker return HelmholtzDerivativeTaker(self.get_expression(dvec), dvec, rscale, sac) - def get_pde_as_diff_op(self): + @override + def get_pde_as_diff_op(self) -> LinearPDESystemOperator: from sumpy.expansion.diff_op import laplacian, make_identity_diff_op + w = make_identity_diff_op(self.dim) lam = sym.Symbol(self.yukawa_lambda_name) - return (laplacian(w) - lam**2 * w) - - mapper_method: ClassVar[str] = "map_yukawa_kernel" + return laplacian(w) - lam**2 * w @dataclass(frozen=True) class ElasticityKernel(ExpressionKernel): + """ + .. autoattribute:: icomp + .. autoattribute:: jcomp + .. autoattribute:: viscosity_mu + .. autoattribute:: poisson_ratio + """ + mapper_method: ClassVar[str] = "map_elasticity_kernel" + icomp: int + """Component index for the kernel.""" jcomp: int - viscosity_mu: ArithmeticExpression - poisson_ratio: ArithmeticExpression + """Component index for the kernel.""" + + viscosity_mu: float | SpatialConstant + r"""The argument name to use for the dynamic viscosity :math:`\mu` when + generating functions to evaluate this kernel. Can also be a numeric value. + """ + poisson_ratio: float | SpatialConstant + r"""The argument name to use for Poisson's ratio :math:`\nu` when generating + functions to evaluate this kernel. Can also be a numeric value. + """ def __new__(cls, - dim: int, - icomp: int, - jcomp: int, - viscosity_mu: str | ArithmeticExpression = "mu", - poisson_ratio: str | ArithmeticExpression = "nu", - ): + dim: int, icomp: int, jcomp: int, + viscosity_mu: float | str | SpatialConstant = "mu", + poisson_ratio: float | str | SpatialConstant = "nu", + ) -> ElasticityKernel: if poisson_ratio == 0.5: - instance = super().__new__(StokesletKernel) + return super().__new__(StokesletKernel) else: - instance = super().__new__(cls) - return instance + return super().__new__(cls) def __init__(self, - dim: int, - icomp: int, - jcomp: int, - viscosity_mu: str | ArithmeticExpression = "mu", - poisson_ratio: str | ArithmeticExpression = "nu", - ): - r""" - :arg viscosity_mu: The argument name to use for - dynamic viscosity :math:`\mu` when generating functions to - evaluate this kernel. Can also be a numeric value. - :arg poisson_ratio: The argument name to use for - Poisson's ratio :math:`\nu` when generating functions to - evaluate this kernel. Can also be a numeric value. - """ + dim: int, icomp: int, jcomp: int, + viscosity_mu: float | str | SpatialConstant = "mu", + poisson_ratio: float | str | SpatialConstant = "nu") -> None: if isinstance(viscosity_mu, str): mu = SpatialConstant(viscosity_mu) else: mu = viscosity_mu + if isinstance(poisson_ratio, str): nu = SpatialConstant(poisson_ratio) else: @@ -679,18 +803,14 @@ def __init__(self, scaling = -1/(16*var("pi")*(1 - nu)*mu) else: - raise RuntimeError("unsupported dimensionality") + raise NotImplementedError(f"unsupported dimension: '{dim}'") + + super().__init__(dim, expression=expr, global_scaling_const=scaling) - object.__setattr__(self, "viscosity_mu", mu) - object.__setattr__(self, "poisson_ratio", nu) object.__setattr__(self, "icomp", icomp) object.__setattr__(self, "jcomp", jcomp) - - super().__init__( - dim, - expression=expr, - global_scaling_const=scaling, - ) + object.__setattr__(self, "viscosity_mu", mu) + object.__setattr__(self, "poisson_ratio", nu) @override def __reduce__(self): @@ -704,79 +824,107 @@ def is_complex_valued(self) -> bool: return False @override - def __repr__(self): - return f"ElasticityKnl{self.dim}D_{self.icomp}{self.jcomp}" + def __str__(self) -> str: + return ( + f"ElasticityKnl{self.dim}D_{self.icomp}{self.jcomp}" + f"({self.viscosity_mu}, {self.poisson_ratio})") @memoize_method - def get_args(self): + @override + def get_args(self) -> Sequence[KernelArgument]: from sumpy.tools import get_all_variables variables = get_all_variables(self.viscosity_mu) - res = [] + + args: list[KernelArgument] = [] for v in variables: - res.append(KernelArgument(loopy_arg=lp.ValueArg(v.name, np.float64))) - return res + self.get_source_args() + args.append(KernelArgument(loopy_arg=lp.ValueArg(v.name, np.float64))) + + return [*args, *self.get_source_args()] @memoize_method - def get_source_args(self): + @override + def get_source_args(self) -> Sequence[KernelArgument]: from sumpy.tools import get_all_variables variables = get_all_variables(self.poisson_ratio) - res = [] + + args: list[KernelArgument] = [] for v in variables: - res.append(KernelArgument(loopy_arg=lp.ValueArg(v.name, np.float64))) - return res + args.append(KernelArgument(loopy_arg=lp.ValueArg(v.name, np.float64))) - mapper_method: ClassVar[str] = "map_elasticity_kernel" + return args @override - def get_pde_as_diff_op(self): + def get_pde_as_diff_op(self) -> LinearPDESystemOperator: from sumpy.expansion.diff_op import laplacian, make_identity_diff_op + w = make_identity_diff_op(self.dim) return laplacian(laplacian(w)) @dataclass(frozen=True) class StokesletKernel(ElasticityKernel): + """ + .. autoattribute:: icomp + .. autoattribute:: jcomp + .. autoattribute:: viscosity_mu + """ + def __new__(cls, dim: int, icomp: int, jcomp: int, - viscosity_mu: str | ArithmeticExpression = "mu", - poisson_ratio: str | ArithmeticExpression | None = None, - ): + viscosity_mu: float | str | SpatialConstant = "mu", + poisson_ratio: float | str | SpatialConstant | None = None, + ) -> StokesletKernel: return object.__new__(cls) def __init__(self, dim: int, icomp: int, jcomp: int, - viscosity_mu: str | ArithmeticExpression = "mu", - poisson_ratio: str | ArithmeticExpression | None = None, - ): + viscosity_mu: float | str | SpatialConstant = "mu", + poisson_ratio: float | str | SpatialConstant | None = None) -> None: if poisson_ratio is None: poisson_ratio = 0.5 + if poisson_ratio != 0.5: - raise ValueError("StokesletKernel must have a Poisson ratio of 0.5") + raise ValueError( + "'StokesletKernel' must have a Poisson ratio of 0.5: " + f"got '{poisson_ratio}'") super().__init__(dim, icomp, jcomp, viscosity_mu, poisson_ratio) @override - def __repr__(self): - return f"StokesletKnl{self.dim}D_{self.icomp}{self.jcomp}" + def __str__(self) -> str: + return ( + f"StokesletKnl{self.dim}D_{self.icomp}{self.jcomp}" + f"({self.viscosity_mu}, {self.poisson_ratio})") @dataclass(frozen=True) class StressletKernel(ExpressionKernel): + """ + .. autoattribute:: icomp + .. autoattribute:: jcomp + .. autoattribute:: kcomp + .. autoattribute:: viscosity_mu + """ + mapper_method: ClassVar[str] = "map_stresslet_kernel" + icomp: int + """Component index for the kernel.""" jcomp: int + """Component index for the kernel.""" kcomp: int - viscosity_mu: SpatialConstant + """Component index for the kernel.""" + viscosity_mu: float | SpatialConstant + r"""The argument name to use for the dynamic viscosity :math:`\mu` when + generating functions to evaluate this kernel. Can also be a numeric value. + """ - def __init__(self, dim, icomp, jcomp, kcomp, viscosity_mu="mu"): - r""" - :arg viscosity_mu: The argument name to use for - dynamic viscosity :math:`\mu` the then generating functions to - evaluate this kernel. - """ + def __init__(self, + dim: int, icomp: int, jcomp: int, kcomp: int, + viscosity_mu: float | str | SpatialConstant = "mu") -> None: # mu is unused but kept for consistency with the Stokeslet. if isinstance(viscosity_mu, str): mu = SpatialConstant(viscosity_mu) @@ -800,70 +948,79 @@ def __init__(self, dim, icomp, jcomp, kcomp, viscosity_mu="mu"): scaling = 3/(4*var("pi")) else: - raise RuntimeError("unsupported dimensionality") + raise NotImplementedError(f"unsupported dimension: '{dim}'") + + super().__init__(dim, expression=expr, global_scaling_const=scaling) object.__setattr__(self, "icomp", icomp) object.__setattr__(self, "jcomp", jcomp) object.__setattr__(self, "kcomp", kcomp) object.__setattr__(self, "viscosity_mu", mu) - super().__init__( - dim, - expression=expr, - global_scaling_const=scaling, - ) - @property @override def is_complex_valued(self) -> bool: return False - def __repr__(self): - return f"StressletKnl{self.dim}D_{self.icomp}{self.jcomp}{self.kcomp}" + @override + def __str__(self) -> str: + return ( + f"StressletKnl{self.dim}D_{self.icomp}{self.jcomp}{self.kcomp}" + f"({self.viscosity_mu})") @memoize_method - def get_args(self): + @override + def get_args(self) -> Sequence[KernelArgument]: from sumpy.tools import get_all_variables variables = get_all_variables(self.viscosity_mu) return [ KernelArgument(loopy_arg=lp.ValueArg(v.name, np.float64)) for v in variables] - mapper_method: ClassVar[str] = "map_stresslet_kernel" - - def get_pde_as_diff_op(self): + @override + def get_pde_as_diff_op(self) -> LinearPDESystemOperator: from sumpy.expansion.diff_op import laplacian, make_identity_diff_op w = make_identity_diff_op(self.dim) return laplacian(laplacian(w)) +@dataclass(frozen=True) class LineOfCompressionKernel(ExpressionKernel): """A kernel for the line of compression or dilatation of constant strength - along the axis "axis" from zero to negative infinity. This is used for the - explicit solution to half-space Elasticity problem. See [1] for details. + along the axis "axis" from zero to negative infinity. + + This is used for the explicit solution to half-space Elasticity problem. + See [Mindlin1936]_ for details. - [1]: Mindlin, R.: Force at a Point in the Interior of a Semi-Infinite Solid - https://doi.org/10.1063/1.1745385 + .. [Mindlin1936] R. D. Mindlin (1936). + *Force at a Point in the Interior of a Semi-Infinite Solid*. + Physics. 7 (5): 195-202. + `doi:10.1063/1.1745385 `__. + + .. autoattribute:: axis + .. autoattribute:: viscosity_mu + .. autoattribute:: poisson_ratio """ + + mapper_method: ClassVar[str] = "map_line_of_compression_kernel" + axis: int - viscosity_mu: SpatialConstant - poisson_ratio: SpatialConstant + """Axis number (defaulting to 2 for the z axis).""" + viscosity_mu: float | SpatialConstant + r"""The argument name to use for the dynamic viscosity :math:`\mu` when + generating functions to evaluate this kernel. Can also be a numeric value. + """ + poisson_ratio: float | SpatialConstant + r"""The argument name to use for Poisson's ratio :math:`\nu` when + generating functions to evaluate this kernel. Can also be a numeric value. + """ def __init__(self, dim: int = 3, axis: int = 2, - viscosity_mu: str | SpatialConstant = "mu", - poisson_ratio: str | SpatialConstant = "nu" - ): - r""" - :arg axis: axis number defaulting to 2 for the z axis. - :arg viscosity_mu: The argument name to use for - dynamic viscosity :math:`\mu` when generating functions to - evaluate this kernel. Can also be a numeric value. - :arg poisson_ratio: The argument name to use for - Poisson's ratio :math:`\nu` when generating functions to - evaluate this kernel. Can also be a numeric value. - """ + viscosity_mu: float | str | SpatialConstant = "mu", + poisson_ratio: float | str | SpatialConstant = "nu" + ) -> None: if isinstance(viscosity_mu, str): mu = SpatialConstant(viscosity_mu) else: @@ -880,39 +1037,39 @@ def __init__(self, expr = d[axis] * var("log")(r + d[axis]) - r scaling = (1 - 2*nu)/(4*var("pi")*mu) else: - raise RuntimeError("unsupported dimensionality") + raise NotImplementedError(f"unsupported dimension: '{dim}'") - self.viscosity_mu = mu - self.poisson_ratio = nu - self.axis = axis + super().__init__(dim, expression=expr, global_scaling_const=scaling) - super().__init__( - dim, - expression=expr, - global_scaling_const=scaling, - ) + object.__setattr__(self, "axis", axis) + object.__setattr__(self, "viscosity_mu", mu) + object.__setattr__(self, "poisson_ratio", nu) @property @override def is_complex_valued(self) -> bool: return False - def __repr__(self): + @override + def __str__(self) -> str: return f"LineOfCompressionKnl{self.dim}D_{self.axis}" @memoize_method - def get_args(self): + @override + def get_args(self) -> Sequence[KernelArgument]: from sumpy.tools import get_all_variables - variables = list(get_all_variables(self.viscosity_mu)) \ - + list(get_all_variables(self.poisson_ratio)) - res = [] + variables = [ + *get_all_variables(self.viscosity_mu), + *get_all_variables(self.poisson_ratio)] + + args: list[KernelArgument] = [] for v in variables: - res.append(KernelArgument(loopy_arg=lp.ValueArg(v.name, np.float64))) - return res + args.append(KernelArgument(loopy_arg=lp.ValueArg(v.name, np.float64))) - mapper_method: ClassVar[str] = "map_line_of_compression_kernel" + return args - def get_pde_as_diff_op(self): + @override + def get_pde_as_diff_op(self) -> LinearPDESystemOperator: from sumpy.expansion.diff_op import laplacian, make_identity_diff_op w = make_identity_diff_op(self.dim) return laplacian(w) @@ -926,47 +1083,79 @@ def get_pde_as_diff_op(self): @dataclass(frozen=True) class KernelWrapper(Kernel, ABC): inner_kernel: Kernel + """The kernel that is being wrapped (to take a derivative of, etc.).""" - def __init__(self, inner_kernel: Kernel): + def __init__(self, inner_kernel: Kernel) -> None: Kernel.__init__(self, inner_kernel.dim) object.__setattr__(self, "inner_kernel", inner_kernel) - def get_base_kernel(self): + @property + @override + def is_complex_valued(self) -> bool: + return self.inner_kernel.is_complex_valued + + @override + def get_base_kernel(self) -> Kernel: return self.inner_kernel.get_base_kernel() - def prepare_loopy_kernel(self, loopy_knl): + @override + def prepare_loopy_kernel(self, loopy_knl: lp.TranslationUnit) -> lp.TranslationUnit: return self.inner_kernel.prepare_loopy_kernel(loopy_knl) - @property - def is_complex_valued(self): - return self.inner_kernel.is_complex_valued - - def get_expression(self, scaled_dist_vec): - return self.inner_kernel.get_expression(scaled_dist_vec) + @override + def get_expression(self, dist_vec: sp.Matrix) -> ArithmeticExpr: + return self.inner_kernel.get_expression(dist_vec) - def get_derivative_coeff_dict_at_source(self, expr_dict): + @override + def get_derivative_coeff_dict_at_source( + self, expr_dict: DerivativeCoeffDict, + ) -> DerivativeCoeffDict: return self.inner_kernel.get_derivative_coeff_dict_at_source(expr_dict) - def postprocess_at_target(self, expr, bvec): + @overload + def postprocess_at_target( + self, expr: sym.Expr, bvec: sp.Matrix, + ) -> sym.Expr: ... + + @overload + def postprocess_at_target( + self, expr: ExprDerivativeTaker, bvec: sp.Matrix, + ) -> DifferentiatedExprDerivativeTaker: ... + + @override + def postprocess_at_target( + self, expr: sym.Expr | ExprDerivativeTaker, bvec: sp.Matrix, + ) -> sym.Expr | DifferentiatedExprDerivativeTaker: return self.inner_kernel.postprocess_at_target(expr, bvec) - def get_global_scaling_const(self): + @override + def get_global_scaling_const(self) -> ArithmeticExpr: return self.inner_kernel.get_global_scaling_const() - def get_code_transformer(self): + @override + def get_code_transformer(self) -> Callable[[Expression], Expression]: return self.inner_kernel.get_code_transformer() - def get_args(self): + @override + def get_args(self) -> Sequence[KernelArgument]: return self.inner_kernel.get_args() - def get_source_args(self): + @override + def get_source_args(self) -> Sequence[KernelArgument]: return self.inner_kernel.get_source_args() - def replace_base_kernel(self, new_base_kernel): - raise NotImplementedError("replace_base_kernel is not implemented " - "for this wrapper.") + @override + def replace_base_kernel(self, new_base_kernel: Kernel) -> Kernel: + raise NotImplementedError( + f"'replace_base_kernel' is not implemented for '{type(self).__name__}'") - def get_derivative_taker(self, dvec, rscale, sac): + @override + def get_derivative_taker( + self, + dvec: sp.Matrix, + rscale: ArithmeticExpr, + sac: SymbolicAssignmentCollection, + ) -> ExprDerivativeTaker: return self.inner_kernel.get_derivative_taker(dvec, rscale, sac) # }}} @@ -975,23 +1164,48 @@ def get_derivative_taker(self, dvec, rscale, sac): # {{{ derivatives class DerivativeBase(KernelWrapper, ABC): + """Bases: :class:`Kernel` + + .. autoattribute:: inner_kernel + .. automethod:: replace_inner_kernel + """ + @override def get_pde_as_diff_op(self) -> LinearPDESystemOperator: return self.inner_kernel.get_pde_as_diff_op() + @abstractmethod + def replace_inner_kernel(self, new_inner_kernel: Kernel) -> Kernel: + """Replace the inner kernel of this wrapper. + + This is essentially the same as :meth:`Kernel.replace_base_kernel`, but it does + not recurse. + """ + @dataclass(frozen=True) class AxisSourceDerivative(DerivativeBase): + """ + .. autoattribute:: axis + """ + + mapper_method: ClassVar[str] = "map_axis_source_derivative" + axis: int + """Direction axis for the source derivative.""" - def __init__(self, axis: int, inner_kernel: Kernel): + def __init__(self, axis: int, inner_kernel: Kernel) -> None: super().__init__(inner_kernel) object.__setattr__(self, "axis", axis) - def __str__(self): + @override + def __str__(self) -> str: return f"d/dy{self.axis} {self.inner_kernel}" - def get_derivative_coeff_dict_at_source(self, expr_dict): + @override + def get_derivative_coeff_dict_at_source( + self, expr_dict: DerivativeCoeffDict, + ) -> DerivativeCoeffDict: expr_dict = self.inner_kernel.get_derivative_coeff_dict_at_source( expr_dict) result = {} @@ -1001,75 +1215,97 @@ def get_derivative_coeff_dict_at_source(self, expr_dict): result[tuple(new_mi)] = -coeff return result - def replace_base_kernel(self, new_base_kernel): + @override + def replace_base_kernel(self, new_base_kernel: Kernel) -> Kernel: return type(self)(self.axis, self.inner_kernel.replace_base_kernel(new_base_kernel)) - def replace_inner_kernel(self, new_inner_kernel): + @override + def replace_inner_kernel(self, new_inner_kernel: Kernel) -> Kernel: return type(self)(self.axis, new_inner_kernel) - mapper_method: ClassVar[str] = "map_axis_source_derivative" - @dataclass(frozen=True) class AxisTargetDerivative(DerivativeBase): + """ + .. autoattribute:: axis + """ + + mapper_method: ClassVar[str] = "map_axis_target_derivative" target_array_name: ClassVar[str] = "targets" axis: int - def __init__(self, axis: int, inner_kernel: Kernel): + def __init__(self, axis: int, inner_kernel: Kernel) -> None: super().__init__(inner_kernel) object.__setattr__(self, "axis", axis) @override - def __str__(self): + def __str__(self) -> str: return f"d/dx{self.axis} {self.inner_kernel}" - def postprocess_at_target(self, expr, bvec): - from sumpy.derivative_taker import ( - DifferentiatedExprDerivativeTaker, - diff_derivative_coeff_dict, - ) - from sumpy.symbolic import make_sym_vector as make_sympy_vector + @overload + def postprocess_at_target( + self, expr: sym.Expr, bvec: sp.Matrix, + ) -> sym.Expr: ... + + @overload + def postprocess_at_target( + self, expr: ExprDerivativeTaker, bvec: sp.Matrix, + ) -> DifferentiatedExprDerivativeTaker: ... - target_vec = make_sympy_vector(self.target_array_name, self.dim) + @override + def postprocess_at_target( + self, expr: sym.Expr | ExprDerivativeTaker, bvec: sp.Matrix, + ) -> sym.Expr | DifferentiatedExprDerivativeTaker: + target_vec = sym.make_sym_vector(self.target_array_name, self.dim) # bvec = tgt - ctr - expr = self.inner_kernel.postprocess_at_target(expr, bvec) - if isinstance(expr, DifferentiatedExprDerivativeTaker): - transformation = diff_derivative_coeff_dict(expr.derivative_coeff_dict, + inner_expr = self.inner_kernel.postprocess_at_target(expr, bvec) + if isinstance(inner_expr, DifferentiatedExprDerivativeTaker): + transformation = diff_derivative_coeff_dict( + inner_expr.derivative_coeff_dict, self.axis, target_vec) - return DifferentiatedExprDerivativeTaker(expr.taker, transformation) + return DifferentiatedExprDerivativeTaker(inner_expr.taker, transformation) else: # Since `bvec` and `tgt` are two different symbolic variables # need to differentiate by both to get the correct answer - return expr.diff(bvec[self.axis]) + expr.diff(target_vec[self.axis]) + return (inner_expr.diff(bvec[self.axis]) + + inner_expr.diff(target_vec[self.axis])) - def replace_base_kernel(self, new_base_kernel): + @override + def replace_base_kernel(self, new_base_kernel: Kernel) -> Kernel: return type(self)(self.axis, self.inner_kernel.replace_base_kernel(new_base_kernel)) - def replace_inner_kernel(self, new_inner_kernel): + @override + def replace_inner_kernel(self, new_inner_kernel: Kernel) -> Kernel: return type(self)(self.axis, new_inner_kernel) - mapper_method: ClassVar[str] = "map_axis_target_derivative" - class _VectorIndexAdder(CSECachingMapperMixin[Expression, []], IdentityMapper[[]]): - def __init__(self, vec_name, additional_indices): + vec_name: str + additional_indices: tuple[Expression, ...] + + def __init__(self, + vec_name: str, + additional_indices: tuple[Expression, ...]) -> None: self.vec_name = vec_name self.additional_indices = additional_indices - def map_subscript(self, expr): + @override + def map_subscript(self, expr: prim.Subscript) -> Expression: from pymbolic.primitives import CommonSubexpression, cse_scope - if (expr.aggregate.name == self.vec_name - and isinstance(expr.index, int)): + name = getattr(expr.aggregate, "name", None) + + if name == self.vec_name and isinstance(expr.index, int): return CommonSubexpression( expr.aggregate[(expr.index, *self.additional_indices)], prefix=None, scope=cse_scope.EVALUATION) else: return IdentityMapper.map_subscript(self, expr) + @override def map_common_subexpression_uncached(self, expr: prim.CommonSubexpression) -> Expression: result = self.rec(expr.child) @@ -1082,79 +1318,100 @@ def map_common_subexpression_uncached(self, @dataclass(frozen=True) class DirectionalDerivative(DerivativeBase): + """ + .. autoattribute:: dir_vec_name + """ directional_kind: ClassVar[Literal["src", "tgt"]] + """The kind of this directional derivative (can only be a source or target).""" dir_vec_name: str + """Name of the vector used for the direction.""" - def __init__(self, inner_kernel: Kernel, dir_vec_name: str | None = None): + def __init__(self, inner_kernel: Kernel, dir_vec_name: str | None = None) -> None: if dir_vec_name is None: dir_vec_name = f"{self.directional_kind}_derivative_dir" KernelWrapper.__init__(self, inner_kernel) object.__setattr__(self, "dir_vec_name", dir_vec_name) - def replace_base_kernel(self, new_base_kernel): - return type(self)(self.inner_kernel.replace_base_kernel(new_base_kernel), + @override + def __str__(self) -> str: + d = "y" if self.directional_kind == "src" else "x" + return fr"{self.dir_vec_name}·∇_{d} {self.inner_kernel}" + + @override + def replace_base_kernel(self, new_base_kernel: Kernel) -> Kernel: + return type(self)( + self.inner_kernel.replace_base_kernel(new_base_kernel), dir_vec_name=self.dir_vec_name) @override - def __str__(self): - return r"{}·∇_{} {}".format( - self.dir_vec_name, - "y" if self.directional_kind == "src" else "x", - self.inner_kernel) + def replace_inner_kernel(self, new_inner_kernel: Kernel) -> Kernel: + return type(self)(new_inner_kernel, dir_vec_name=self.dir_vec_name) class DirectionalTargetDerivative(DirectionalDerivative): + mapper_method: ClassVar[str] = "map_directional_target_derivative" directional_kind: ClassVar[Literal["src", "tgt"]] = "tgt" - target_array_name = "targets" + target_array_name: ClassVar[str] = "targets" @override - def get_code_transformer(self): + def get_code_transformer(self) -> Callable[[Expression], Expression]: from sumpy.codegen import VectorComponentRewriter - vcr = VectorComponentRewriter([self.dir_vec_name]) - from pymbolic.primitives import Variable - via = _VectorIndexAdder(self.dir_vec_name, (Variable("itgt"),)) + vcr = VectorComponentRewriter(frozenset([self.dir_vec_name])) + via = _VectorIndexAdder(self.dir_vec_name, (prim.Variable("itgt"),)) inner_transform = self.inner_kernel.get_code_transformer() - def transform(expr): + def transform(expr: Expression) -> Expression: return via(vcr(inner_transform(expr))) return transform - def postprocess_at_target(self, expr, bvec): - from sumpy.derivative_taker import ( - DifferentiatedExprDerivativeTaker, - diff_derivative_coeff_dict, - ) - from sumpy.symbolic import make_sym_vector as make_sympy_vector - dir_vec = make_sympy_vector(self.dir_vec_name, self.dim) - target_vec = make_sympy_vector(self.target_array_name, self.dim) + @overload + def postprocess_at_target( + self, expr: sym.Expr, bvec: sp.Matrix, + ) -> sym.Expr: ... + + @overload + def postprocess_at_target( + self, expr: ExprDerivativeTaker, bvec: sp.Matrix, + ) -> DifferentiatedExprDerivativeTaker: ... + + @override + def postprocess_at_target( + self, expr: sym.Expr | ExprDerivativeTaker, bvec: sp.Matrix, + ) -> sym.Expr | DifferentiatedExprDerivativeTaker: + dir_vec = sym.make_sym_vector(self.dir_vec_name, self.dim) + target_vec = sym.make_sym_vector(self.target_array_name, self.dim) - expr = self.inner_kernel.postprocess_at_target(expr, bvec) + inner_expr = self.inner_kernel.postprocess_at_target(expr, bvec) # bvec = tgt - center - if not isinstance(expr, DifferentiatedExprDerivativeTaker): + if not isinstance(inner_expr, DifferentiatedExprDerivativeTaker): result = 0 for axis in range(self.dim): # Since `bvec` and `tgt` are two different symbolic variables # need to differentiate by both to get the correct answer - result += (expr.diff(bvec[axis]) + expr.diff(target_vec[axis])) \ - * dir_vec[axis] + result += ( + (inner_expr.diff(bvec[axis]) + inner_expr.diff(target_vec[axis])) + * dir_vec[axis]) + + assert isinstance(result, sym.Expr) return result - new_transformation = defaultdict(lambda: 0) + new_transformation: DerivativeCoeffDict = defaultdict(lambda: 0) for axis in range(self.dim): axis_transformation = diff_derivative_coeff_dict( - expr.derivative_coeff_dict, axis, target_vec) + inner_expr.derivative_coeff_dict, axis, target_vec) for mi, coeff in axis_transformation.items(): new_transformation[mi] += coeff * dir_vec[axis] - return DifferentiatedExprDerivativeTaker(expr.taker, - dict(new_transformation)) + return DifferentiatedExprDerivativeTaker( + inner_expr.taker, dict(new_transformation)) - def get_args(self): + @override + def get_args(self) -> Sequence[KernelArgument]: return [ KernelArgument( loopy_arg=lp.GlobalArg( @@ -1167,29 +1424,32 @@ def get_args(self): *self.inner_kernel.get_args() ] - def prepare_loopy_kernel(self, loopy_knl): + @override + def prepare_loopy_kernel(self, loopy_knl: lp.TranslationUnit) -> lp.TranslationUnit: loopy_knl = self.inner_kernel.prepare_loopy_kernel(loopy_knl) return lp.tag_array_axes(loopy_knl, self.dir_vec_name, "sep,C") - mapper_method: ClassVar[str] = "map_directional_target_derivative" - class DirectionalSourceDerivative(DirectionalDerivative): + mapper_method: ClassVar[str] = "map_directional_source_derivative" directional_kind: ClassVar[Literal["src", "tgt"]] = "src" - def get_code_transformer(self): + @override + def get_code_transformer(self) -> Callable[[Expression], Expression]: inner = self.inner_kernel.get_code_transformer() from sumpy.codegen import VectorComponentRewriter - vcr = VectorComponentRewriter([self.dir_vec_name]) - from pymbolic.primitives import Variable - via = _VectorIndexAdder(self.dir_vec_name, (Variable("isrc"),)) + vcr = VectorComponentRewriter(frozenset([self.dir_vec_name])) + via = _VectorIndexAdder(self.dir_vec_name, (prim.Variable("isrc"),)) - def transform(expr): + def transform(expr: Expression) -> Expression: return via(vcr(inner(expr))) return transform - def get_derivative_coeff_dict_at_source(self, expr_dict): + @override + def get_derivative_coeff_dict_at_source( + self, expr_dict: DerivativeCoeffDict, + ) -> DerivativeCoeffDict: from sumpy.symbolic import make_sym_vector as make_sympy_vector dir_vec = make_sympy_vector(self.dir_vec_name, self.dim) @@ -1197,15 +1457,17 @@ def get_derivative_coeff_dict_at_source(self, expr_dict): expr_dict) # avec = center-src -> minus sign from chain rule - result = defaultdict(lambda: 0) + result: DerivativeCoeffDict = defaultdict(lambda: 0) for mi, coeff in expr_dict.items(): for axis in range(self.dim): new_mi = list(mi) new_mi[axis] += 1 result[tuple(new_mi)] += -coeff * dir_vec[axis] - return result - def get_source_args(self): + return dict(result) + + @override + def get_source_args(self) -> Sequence[KernelArgument]: return [ KernelArgument( loopy_arg=lp.GlobalArg( @@ -1216,68 +1478,75 @@ def get_source_args(self): ), *self.inner_kernel.get_source_args()] - def prepare_loopy_kernel(self, loopy_knl): + @override + def prepare_loopy_kernel(self, loopy_knl: lp.TranslationUnit) -> lp.TranslationUnit: loopy_knl = self.inner_kernel.prepare_loopy_kernel(loopy_knl) return lp.tag_array_axes(loopy_knl, self.dir_vec_name, "sep,C") - mapper_method: ClassVar[str] = "map_directional_source_derivative" - class TargetPointMultiplier(KernelWrapper): - """Wraps a kernel :math:`G(x, y)` and outputs :math:`x_j G(x, y)` + """Bases: :class:`Kernel` + + Wraps a kernel :math:`G(x, y)` and outputs :math:`x_j G(x, y)` where :math:`x, y` are targets and sources respectively. - """ - axis: int + .. autoattribute:: axis + """ + mapper_method: ClassVar[str] = "map_target_point_multiplier" target_array_name: ClassVar[str] = "targets" - def __init__(self, axis, inner_kernel): + axis: int + """Coordinate axis with which to multiply the kernel.""" + + def __init__(self, axis: int, inner_kernel: Kernel) -> None: KernelWrapper.__init__(self, inner_kernel) self.axis = axis - def __str__(self): + @override + def __str__(self) -> str: return f"x{self.axis} {self.inner_kernel}" - def replace_base_kernel(self, new_base_kernel): - return type(self)(self.axis, - self.inner_kernel.replace_base_kernel(new_base_kernel)) + @overload + def postprocess_at_target( + self, expr: sym.Expr, bvec: sp.Matrix, + ) -> sym.Expr: ... - def replace_inner_kernel(self, new_inner_kernel): - return type(self)(self.axis, new_inner_kernel) - - def postprocess_at_target(self, expr, avec): - from sumpy.derivative_taker import ( - DifferentiatedExprDerivativeTaker, - ExprDerivativeTaker, - ) - from sumpy.symbolic import make_sym_vector as make_sympy_vector + @overload + def postprocess_at_target( + self, expr: ExprDerivativeTaker, bvec: sp.Matrix, + ) -> DifferentiatedExprDerivativeTaker: ... - expr = self.inner_kernel.postprocess_at_target(expr, avec) - target_vec = make_sympy_vector(self.target_array_name, self.dim) + @override + def postprocess_at_target( + self, expr: sym.Expr | ExprDerivativeTaker, bvec: sp.Matrix, + ) -> sym.Expr | DifferentiatedExprDerivativeTaker: + inner_expr = self.inner_kernel.postprocess_at_target(expr, bvec) + target_vec = sym.make_sym_vector(self.target_array_name, self.dim) zeros = tuple([0]*self.dim) - mult = target_vec[self.axis] - - if isinstance(expr, DifferentiatedExprDerivativeTaker): - transform = {mi: coeff * mult for mi, coeff in - expr.derivative_coeff_dict.items()} - return DifferentiatedExprDerivativeTaker(expr.taker, transform) - elif isinstance(expr, ExprDerivativeTaker): - return DifferentiatedExprDerivativeTaker({zeros: mult}) + mult = cast("sym.Symbol", target_vec[self.axis]) + + if isinstance(inner_expr, DifferentiatedExprDerivativeTaker): + transform: DerivativeCoeffDict = { + mi: coeff * mult for mi, coeff in + inner_expr.derivative_coeff_dict.items()} + + return DifferentiatedExprDerivativeTaker(inner_expr.taker, transform) + elif isinstance(inner_expr, ExprDerivativeTaker): + return DifferentiatedExprDerivativeTaker(expr.orig_expr, {zeros: mult}) else: - return mult * expr + return mult * inner_expr @override - def get_code_transformer(self): + def get_code_transformer(self) -> Callable[[Expression], Expression]: from sumpy.codegen import VectorComponentRewriter - vcr = VectorComponentRewriter([self.target_array_name]) - from pymbolic.primitives import Variable - via = _VectorIndexAdder(self.target_array_name, (Variable("itgt"),)) + vcr = VectorComponentRewriter(frozenset([self.target_array_name])) + via = _VectorIndexAdder(self.target_array_name, (prim.Variable("itgt"),)) inner_transform = self.inner_kernel.get_code_transformer() - def transform(expr): + def transform(expr: Expression) -> Expression: return via(vcr(inner_transform(expr))) return transform @@ -1286,7 +1555,13 @@ def transform(expr): def get_pde_as_diff_op(self) -> LinearPDESystemOperator: raise NotImplementedError("no PDE is known") - mapper_method: ClassVar[str] = "map_target_point_multiplier" + @override + def replace_base_kernel(self, new_base_kernel: Kernel) -> Kernel: + return type(self)(self.axis, + self.inner_kernel.replace_base_kernel(new_base_kernel)) + + def replace_inner_kernel(self, new_inner_kernel: Kernel) -> Kernel: + return type(self)(self.axis, new_inner_kernel) # }}} @@ -1297,33 +1572,55 @@ def get_pde_as_diff_op(self) -> LinearPDESystemOperator: class KernelMapper(Generic[ResultT]): + """ + .. automethod:: __call__ + """ def rec(self, kernel: Kernel) -> ResultT: try: - method = getattr(self, kernel.mapper_method) + method = cast( + "Callable[[Kernel], ResultT]", + getattr(self, kernel.mapper_method)) except AttributeError as err: raise RuntimeError(f"{type(self)} cannot handle {type(kernel)}") from err else: return method(kernel) - __call__ = rec + def __call__(self, kernel: Kernel) -> ResultT: + return self.rec(kernel) class KernelCombineMapper(KernelMapper[ResultT], ABC): + """ + .. automethod:: combine + """ + @abstractmethod def combine(self, values: Iterable[ResultT]) -> ResultT: raise NotImplementedError - def map_axis_target_derivative(self, kernel): + def map_axis_target_derivative( + self, kernel: AxisTargetDerivative) -> ResultT: return self.rec(kernel.inner_kernel) - map_directional_target_derivative = map_axis_target_derivative - map_directional_source_derivative = map_axis_target_derivative - map_axis_source_derivative = map_axis_target_derivative - map_target_point_multiplier = map_axis_target_derivative + def map_axis_source_derivative( + self, kernel: AxisSourceDerivative) -> ResultT: + return self.rec(kernel.inner_kernel) + + def map_directional_target_derivative( + self, kernel: DirectionalTargetDerivative) -> ResultT: + return self.rec(kernel.inner_kernel) + + def map_directional_source_derivative( + self, kernel: DirectionalSourceDerivative) -> ResultT: + return self.rec(kernel.inner_kernel) + + def map_target_point_multiplier( + self, kernel: TargetPointMultiplier) -> ResultT: + return self.rec(kernel.inner_kernel) class KernelIdentityMapper(KernelMapper[Kernel]): - def map_expression_kernel(self, kernel): + def map_expression_kernel(self, kernel: ExpressionKernel) -> Kernel: return kernel map_laplace_kernel = map_expression_kernel @@ -1334,42 +1631,65 @@ def map_expression_kernel(self, kernel): map_line_of_compression_kernel = map_expression_kernel map_stresslet_kernel = map_expression_kernel - def map_axis_target_derivative(self, kernel): + def map_axis_target_derivative(self, kernel: AxisTargetDerivative) -> Kernel: return type(kernel)(kernel.axis, self.rec(kernel.inner_kernel)) - map_axis_source_derivative = map_axis_target_derivative - map_target_point_multiplier = map_axis_target_derivative + def map_axis_source_derivative(self, kernel: AxisSourceDerivative) -> Kernel: + return type(kernel)(kernel.axis, self.rec(kernel.inner_kernel)) + + def map_target_point_multiplier(self, kernel: TargetPointMultiplier) -> Kernel: + return type(kernel)(kernel.axis, self.rec(kernel.inner_kernel)) - def map_directional_target_derivative(self, kernel): - return type(kernel)( - self.rec(kernel.inner_kernel), - kernel.dir_vec_name) + def map_directional_target_derivative( + self, kernel: DirectionalTargetDerivative) -> Kernel: + return type(kernel)(self.rec(kernel.inner_kernel), + dir_vec_name=kernel.dir_vec_name) - map_directional_source_derivative = map_directional_target_derivative + def map_directional_source_derivative( + self, kernel: DirectionalSourceDerivative) -> Kernel: + return type(kernel)(self.rec(kernel.inner_kernel), + dir_vec_name=kernel.dir_vec_name) class AxisSourceDerivativeRemover(KernelIdentityMapper): - def map_axis_source_derivative(self, kernel): + """Removes all axis source derivatives from the kernel.""" + + @override + def map_axis_source_derivative(self, kernel: AxisSourceDerivative) -> Kernel: return self.rec(kernel.inner_kernel) class AxisTargetDerivativeRemover(KernelIdentityMapper): - def map_axis_target_derivative(self, kernel): + """Removes all axis target derivatives from the kernel.""" + + @override + def map_axis_target_derivative(self, kernel: AxisTargetDerivative) -> Kernel: return self.rec(kernel.inner_kernel) class TargetDerivativeRemover(AxisTargetDerivativeRemover): - def map_directional_target_derivative(self, kernel): + """Removes all target derivatives from the kernel.""" + + @override + def map_directional_target_derivative( + self, kernel: DirectionalTargetDerivative) -> Kernel: return self.rec(kernel.inner_kernel) class SourceDerivativeRemover(AxisSourceDerivativeRemover): - def map_directional_source_derivative(self, kernel): + """Removes all source derivatives from the kernel.""" + + @override + def map_directional_source_derivative( + self, kernel: DirectionalSourceDerivative) -> Kernel: return self.rec(kernel.inner_kernel) class TargetTransformationRemover(TargetDerivativeRemover): - def map_target_point_multiplier(self, kernel): + """Removes all target transformations from the kernel.""" + + @override + def map_target_point_multiplier(self, kernel: TargetPointMultiplier) -> Kernel: return self.rec(kernel.inner_kernel) @@ -1377,10 +1697,13 @@ def map_target_point_multiplier(self, kernel): class DerivativeCounter(KernelCombineMapper[int]): - def combine(self, values): - return max(values) + """Counts the number of derivatives in the kernel.""" - def map_expression_kernel(self, kernel): + @override + def combine(self, values: Iterable[int]) -> int: + return sum(values) + + def map_expression_kernel(self, kernel: ExpressionKernel) -> int: return 0 map_laplace_kernel = map_expression_kernel @@ -1390,8 +1713,9 @@ def map_expression_kernel(self, kernel): map_line_of_compression_kernel = map_expression_kernel map_stresslet_kernel = map_expression_kernel - def map_axis_target_derivative(self, kernel): - return 1 + self.rec(kernel.inner_kernel) + @override + def map_axis_target_derivative(self, kernel: AxisTargetDerivative) -> int: + return self.combine([1, self.rec(kernel.inner_kernel)]) map_directional_target_derivative = map_axis_target_derivative map_directional_source_derivative = map_axis_target_derivative diff --git a/sumpy/symbolic.py b/sumpy/symbolic.py index 17aa4aa6..c3c7eaa2 100644 --- a/sumpy/symbolic.py +++ b/sumpy/symbolic.py @@ -110,6 +110,7 @@ def _find_symbolic_backend(): # Before adding a function here, make sure it's present in both modules. Add = sym.Add Basic = sym.Basic +Expr = sym.Expr Mul = sym.Mul Pow = sym.Pow exp = sym.exp @@ -253,7 +254,7 @@ def pymbolic_real_norm_2(x): return var("sqrt")(np.dot(x, x)) -def make_sym_vector(name, components): +def make_sym_vector(name: str, components: int) -> Matrix: return sym.Matrix([sym.Symbol(f"{name}{i}") for i in range(components)]) diff --git a/sumpy/tools.py b/sumpy/tools.py index e08226fa..35baf405 100644 --- a/sumpy/tools.py +++ b/sumpy/tools.py @@ -54,6 +54,8 @@ import pyopencl import pyopencl as cl + from pymbolic.primitives import Variable + from pymbolic.typing import Expression from sumpy.expansion import ExpansionBase from sumpy.kernel import Kernel, KernelArgument @@ -203,7 +205,7 @@ def map_variable(self, expr): self.vars.add(expr) -def get_all_variables(expr): +def get_all_variables(expr: Expression) -> set[Variable]: mapper = GatherAllVariables() mapper(expr) return mapper.vars