Opened 11 years ago
Last modified 6 years ago
#2387 assigned defect
Operator overloading fails for matrices
Reported by: | Per Östlund | Owned by: | Per Östlund |
---|---|---|---|
Priority: | high | Milestone: | 2.0.0 |
Component: | New Instantiation | Version: | trunk |
Keywords: | Cc: |
Description
There seems to be some issues when trying to use overloaded operators with matrices. For example this model:
operator record Complex Real re; Real im; encapsulated operator 'constructor' function fromReal import Complex; input Real re; input Real im = 0; output Complex result(re = re, im = im); end fromReal; end 'constructor'; encapsulated operator '*' function multiply import Complex; input Complex c1; input Complex c2; output Complex c3; algorithm c3 := Complex(c1.re*c2.re - c1.im*c2.im, c1.re*c2.im + c1.im*c2.re); end multiply; function scalarProduct import Complex; input Complex c1[:]; input Complex c2[size(c1, 1)]; output Complex c3; algorithm c3 := Complex(0); for i in 1:size(c1, 1) loop c3 := c3 + c1[i] * c2[i]; end for; end scalarProduct; end '*'; encapsulated operator function '+' import Complex; input Complex c1; input Complex c2; output Complex c3; algorithm c3 := Complex(c1.re + c2.re, c1.im + c2.im); end '+'; end Complex; model ComplexTest Complex c1 = Complex(1.0, 0.0); Complex c2[3, 3] = {{c1, c1, c1}, {c1, c1, c1}, {c1, c1, c1}}; Complex c3[3, 1] = {{c1}, {c1}, {c1}}; Complex c4[3, 1] = c2 * c3; end ComplexTest;
In the binding of c4 we have c2 * c3, which is currently evaluated to a Complex[3] array instead of Complex[3, 1] as it should. This is because we don't check the restrictions on the function arguments for scalarProduct, and mistakenly use it even though the dimensions don't match.
If the scalarProduct function is removed the compiler still fails with:
Could not vectorize function because dimensions 3 and 1mismatch.
Change History (15)
comment:1 by , 11 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
comment:2 by , 11 years ago
Status: | assigned → accepted |
---|
comment:3 by , 11 years ago
Milestone: | 1.9.0 → 1.9.1 |
---|
comment:4 by , 10 years ago
Milestone: | 1.9.1 → 1.9.2 |
---|
This ticket was not closed for 1.9.1, which has now been released. It was batch modified for milestone 1.9.2 (but maybe an empty milestone was more appropriate; feel free to change it).
comment:5 by , 10 years ago
Milestone: | 1.9.2 → 1.9.3 |
---|
Milestone changed to 1.9.3 since 1.9.2 was released.
comment:10 by , 8 years ago
Milestone: | 1.11.0 → 1.12.0 |
---|
Milestone moved to 1.12.0 due to 1.11.0 already being released.
comment:11 by , 7 years ago
Milestone: | 1.12.0 → Future |
---|
The milestone of this ticket has been reassigned to "Future".
If you think the issue is still valid and relevant for you, please select milestone 1.13.0 for back-end, code generation and run-time issues, or 2.0.0 for front-end issues.
If you are aware that the problem is no longer present, please select the milestone corresponding to the version of OMC you used to check that, and set the status to "worksforme".
In both cases, a short informative comment would be welcome.
comment:12 by , 7 years ago
Milestone: | Future → 2.0.0 |
---|
@mahge930 please check that this works with the new front-end
comment:13 by , 6 years ago
Owner: | changed from | to
---|---|
Status: | accepted → assigned |
@mahge930 no longer working on this
comment:14 by , 6 years ago
Component: | Frontend → New Instantiation |
---|
comment:15 by , 6 years ago
Issue still present as reported initially, when instantiating ComplexTest
the NF reports:
[1] 10:04:53 Translation Error [ComplexTest: 5:3-5:29]: Cannot resolve type of expression c2 * c3. The operands have types Complex[3, 3], Complex[3, 1] in component <NO_COMPONENT>.
Postponed until 1.9.1