Skip to content

Slangpy Math library matrix multiplication incomplete #551

@sleeplessai

Description

@sleeplessai

The slangpy.math library does not support all dimensions of matrix multiplication.
To reproduce using the following snippet,

import slangpy as sgl

spalt2world = sgl.float4x3([-0.0402, 0.0673, 0.0824,        0.0000, -0.0626, -0.0861,       0.0398, 0.0000, -4.8637,        -1.1342, -6.3513, 1.0000,])
world2ndc = sgl.float4x4([-0.0724, 0.4652, 1.6573, 0.7338,        -0.5483, 2.4286, -0.7057, 1.5564,       -0.9765, -0.2153, 0.0178, 4.2501,       -0.9764, -0.2153, 0.0178, 4.2597,])
ndc2pix = sgl.float4x3([628.0000, 0.0000, 0.0000,       627.5000, 0.0000, 414.0000,     0.0000, 413.5000, 0.0000,       0.0000, 0.0000, 1.0000,])

full_transformation1 = sgl.math.transpose(spalt2world) @ world2ndc @ ndc2pix
full_transformation2 = sgl.math.mul(sgl.math.transpose(spalt2world), world2ndc) @ ndc2pix

I got the warning and error

full_transformation1 = sgl.math.transpose(spalt2world) @ world2ndc @ ndc2pix
                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~

TypeError: unsupported operand type(s) for @: 'slangpy.math.float3x4' and 'slangpy.math.float4x4'

full_transformation2 = sgl.math.mul(sgl.math.mul(sgl.math.transpose(spalt2world), world2ndc), ndc2pix)
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

TypeError: mul(): incompatible function arguments. The following argument types are supported:
1. mul(x: slangpy.math.float2x2, y: slangpy.math.float2x2) -> slangpy.math.float2x2
2. mul(x: slangpy.math.float2x2, y: slangpy.math.float2) -> slangpy.math.float2
3. mul(x: slangpy.math.float2, y: slangpy.math.float2x2) -> slangpy.math.float2
4. mul(x: slangpy.math.float2x3, y: slangpy.math.float3x2) -> slangpy.math.float2x2
5. mul(x: slangpy.math.float2x3, y: slangpy.math.float3) -> slangpy.math.float2
6. mul(x: slangpy.math.float2, y: slangpy.math.float2x3) -> slangpy.math.float3
7. mul(x: slangpy.math.float2x4, y: slangpy.math.float4x2) -> slangpy.math.float2x2
8. mul(x: slangpy.math.float2x4, y: slangpy.math.float4) -> slangpy.math.float2
9. mul(x: slangpy.math.float2, y: slangpy.math.float2x4) -> slangpy.math.float4
10. mul(x: slangpy.math.float3x2, y: slangpy.math.float2x3) -> slangpy.math.float3x3
11. mul(x: slangpy.math.float3x2, y: slangpy.math.float2) -> slangpy.math.float3
12. mul(x: slangpy.math.float3, y: slangpy.math.float3x2) -> slangpy.math.float2
13. mul(x: slangpy.math.float3x3, y: slangpy.math.float3x3) -> slangpy.math.float3x3
14. mul(x: slangpy.math.float3x3, y: slangpy.math.float3) -> slangpy.math.float3
15. mul(x: slangpy.math.float3, y: slangpy.math.float3x3) -> slangpy.math.float3
16. mul(x: slangpy.math.float3x4, y: slangpy.math.float4x3) -> slangpy.math.float3x3
17. mul(x: slangpy.math.float3x4, y: slangpy.math.float4) -> slangpy.math.float3
18. mul(x: slangpy.math.float3, y: slangpy.math.float3x4) -> slangpy.math.float4
19. mul(x: slangpy.math.float4x2, y: slangpy.math.float2x4) -> slangpy.math.float4x4
20. mul(x: slangpy.math.float4x2, y: slangpy.math.float2) -> slangpy.math.float4
21. mul(x: slangpy.math.float4, y: slangpy.math.float4x2) -> slangpy.math.float2
22. mul(x: slangpy.math.float4x3, y: slangpy.math.float3x4) -> slangpy.math.float4x4
23. mul(x: slangpy.math.float4x3, y: slangpy.math.float3) -> slangpy.math.float4
24. mul(x: slangpy.math.float4, y: slangpy.math.float4x3) -> slangpy.math.float3
25. mul(x: slangpy.math.float4x4, y: slangpy.math.float4x4) -> slangpy.math.float4x4
26. mul(x: slangpy.math.float4x4, y: slangpy.math.float4) -> slangpy.math.float4
27. mul(x: slangpy.math.float4, y: slangpy.math.float4x4) -> slangpy.math.float4
28. mul(x: slangpy.math.quatf, y: slangpy.math.quatf) -> slangpy.math.quatf
29. mul(x: slangpy.math.quatf, y: slangpy.math.float3) -> slangpy.math.float3

Invoked with types: slangpy.math.float3x4, slangpy.math.float4x4

It appears that the math library's dimensional support for matrix multiplication is incomplete, which may also include other vector and matrix calculations. Currently, it can only be used to construct slangpy variables by passing the results calculated using NumPy.
I'm not sure if this is intentional, but it's important to clarify the functional scope and basic guarantees of the slangpy.math library.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions