PR #2475: Expression syntax extension

Merged, abandoned or rejected pull requests are moved here to clear the main Pull Requests forum.
User avatar
DeepSOIC
Veteran
Posts: 7896
Joined: Fri Aug 29, 2014 12:45 am
Location: used to be Saint-Petersburg, Russia

Re: PR #2475: Expression syntax extension

Post by DeepSOIC »

wmayer wrote: Mon Sep 30, 2019 12:22 pm
This is true for numbers (1/X = X^-1), but there is a rigorous mathematical notion behind it, that allows to define X^-3 or X^(1/2), but for matrices or Placements, what would mean :
On Wikipedia you can find some information for square roots of a matrix but it's only well-defined for positive-definite matrices while for arbitrary matrices it causes ambiguities. But what when using 1/3 as exponent instead? Here I couldn't find a valid definition. So, a power function for arbitrary exponents makes probably not much sense (especially not in a CAD program) and it should be limited to integers only as done by the current implementation.
I've been actually wanting this arbitrary exponent as a way to interpolate between placements.
You don't have to define, what ^(1/3) means, as 1/3 can't be precisely represented by a float anyway. A fractional part of float is a sum of fractions:
bit1*1/2 + bit2*1/4 + bit3*1/8 +...
Power-of-two fractional powers can be easily calculated by multiplying M^(1/2) by itself.
User avatar
Zolko
Veteran
Posts: 2213
Joined: Mon Dec 17, 2018 10:02 am

Re: PR #2475: Expression syntax extension

Post by Zolko »

wmayer wrote: Mon Sep 30, 2019 2:07 pm As shown here the inverted placement of
y = R * x + t is x = Q * y - Q * t
where Q is the transposed and inverse of R. Now make the block matrices (R|t) and (Q|-Q*t) and imagine that for both matrices the fourth row is (0, 0, 0, 1). I claim that (Q|-Q*t) is the inverse of (R|t)
yes, OK, I understand. Mathematically it's correct, I didn't think about the last 1 in the 4x4 corner, I assumed all 0-s. But now, you propose to calculate the inverse of a Placement by calculating the inverse of the 4x4 matrix, instead of transposing the orthonormal 3x3 R matrix and changing the sign of the translation vector T ? What algorithm do you propose to invert the non-orthonormal 4x4 matrix ?

What I claim is that inverting a 3x3 Rotation matrix and 4x4 Placement matrix use different algorithms (for a Rotation it's a simple transpose, for a Placement it's not a simple transpose), and making a generic matrix.power() function that inverts the matrices of Placement and Rotation in the same manner is a questionable solution. Whereas it is a good solution for multiplications, because the generic matrix multiplication will bring in both cases optimal results.

And what I still didn't see is a practical use-case for the matrix.power(N) feature with N≠-1.
try the Assembly4 workbench for FreCAD — tutorials here and here
wmayer
Founder
Posts: 20243
Joined: Thu Feb 19, 2009 10:32 am
Contact:

Re: PR #2475: Expression syntax extension

Post by wmayer »

What algorithm do you propose to invert the non-orthonormal 4x4 matrix ?
Maybe Gauß-Jordan. Or you can check the Eigen3 library which has a lot of optimized algorithms. However, the code is partially difficult to understand as it's heavily template-based.
But now, you propose to calculate the inverse of a Placement by calculating the inverse of the 4x4 matrix, instead of transposing the orthonormal 3x3 R matrix and changing the sign of the translation vector T ?
No. The Placement internally uses a quaternion and there it's trivial to invert it because you only have to either multiply its Q0-Q2 or its Q3 with -1. And the translational part is only a simple multiplication with the inverted quaternion.
And what I still didn't see is a practical use-case for the matrix.power(N) feature with N≠-1.
Especially in FreeCAD there is probably no obvious use-case where it's really needed. But in a general context this is e.g. very useful in graph theory.
wmayer
Founder
Posts: 20243
Joined: Thu Feb 19, 2009 10:32 am
Contact:

Re: PR #2475: Expression syntax extension

Post by wmayer »

DeepSOIC wrote: Mon Sep 30, 2019 2:29 pm
wmayer wrote: Mon Sep 30, 2019 12:22 pm
This is true for numbers (1/X = X^-1), but there is a rigorous mathematical notion behind it, that allows to define X^-3 or X^(1/2), but for matrices or Placements, what would mean :
On Wikipedia you can find some information for square roots of a matrix but it's only well-defined for positive-definite matrices while for arbitrary matrices it causes ambiguities. But what when using 1/3 as exponent instead? Here I couldn't find a valid definition. So, a power function for arbitrary exponents makes probably not much sense (especially not in a CAD program) and it should be limited to integers only as done by the current implementation.
I've been actually wanting this arbitrary exponent as a way to interpolate between placements.
You don't have to define, what ^(1/3) means, as 1/3 can't be precisely represented by a float anyway. A fractional part of float is a sum of fractions:
bit1*1/2 + bit2*1/4 + bit3*1/8 +...
Power-of-two fractional powers can be easily calculated by multiplying M^(1/2) by itself.
OK, when you need such a function then of course we can try to extend it.
User avatar
DeepSOIC
Veteran
Posts: 7896
Joined: Fri Aug 29, 2014 12:45 am
Location: used to be Saint-Petersburg, Russia

Re: PR #2475: Expression syntax extension

Post by DeepSOIC »

wmayer wrote: Mon Sep 30, 2019 3:13 pm OK, when you need such a function then of course we can try to extend it.
Well, I can't say I "need" it, I have already implemented the interpolation by simply interpolating translation and quaternion separately. It is more of a curiosity.

If M^(1/2) isn't a placement matrix, then it isn't going to be useful for me, I think.
User avatar
Zolko
Veteran
Posts: 2213
Joined: Mon Dec 17, 2018 10:02 am

Re: PR #2475: Expression syntax extension

Post by Zolko »

wmayer wrote: Sat Sep 28, 2019 3:02 pm The branch is merged now.
OK, so with FreeCAD_0.19-18353-Linux-Conda_Py3Qt5_glibc2.12-x86_64.AppImage the multiplication of Placements works, I can do:

Code: Select all

Cuve.Placement * Cuve#LCS_1.Placement * constr_Screw_CHC_1.AttachmentOffset
And it does what it's supposed to do. I have to check the inverse part now.
try the Assembly4 workbench for FreCAD — tutorials here and here
User avatar
Zolko
Veteran
Posts: 2213
Joined: Mon Dec 17, 2018 10:02 am

Re: PR #2475: Expression syntax extension

Post by Zolko »

and the inverse also works :

Code: Select all

Cuve.Placement * Cuve#LCS_1.Placement * constr_Screw_CHC_1.AttachmentOffset * Screw_CHC#LCS_0.Placement ^ -1
This is great news, thank-you. I'll update now the Asm4 workbench for the new syntax.
try the Assembly4 workbench for FreCAD — tutorials here and here
triplus
Veteran
Posts: 9471
Joined: Mon Dec 12, 2011 4:45 pm

Re: PR #2475: Expression syntax extension

Post by triplus »

Therefore now Assembly 4 module is fully compatible with FreeCAD 0.19?
User avatar
Zolko
Veteran
Posts: 2213
Joined: Mon Dec 17, 2018 10:02 am

Re: PR #2475: Expression syntax extension

Post by Zolko »

triplus wrote: Fri Oct 04, 2019 2:24 pm Therefore now Assembly 4 module is fully compatible with FreeCAD 0.19?
yes, I've just finished the update to the new syntax. I'll make a new release 0.6 tomorrow, the current 0.5 is not compatible (you still need the -asm3 branch). Works like before, I corrected some bugs on the way. There are still truckloads of bugs probably, but we'll have to see them if/when people test.
try the Assembly4 workbench for FreCAD — tutorials here and here
triplus
Veteran
Posts: 9471
Joined: Mon Dec 12, 2011 4:45 pm

Re: PR #2475: Expression syntax extension

Post by triplus »

That is really good to hear. Thanks to all involved in making it happen. Don't forget about tutorial.

P.S. Now i guess Assembly 3 module still needs some work. For being able to work with FreeCAD 0.19? I have seen AppImage, and likely all other binaries based on Conda, already have SolveSpace library included.
Post Reply