Opened 12 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 , 12 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:2 by , 12 years ago
| Status: | assigned → accepted |
|---|
comment:3 by , 12 years ago
| Milestone: | 1.9.0 → 1.9.1 |
|---|
comment:4 by , 11 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 , 11 years ago
| Milestone: | 1.9.2 → 1.9.3 |
|---|
Milestone changed to 1.9.3 since 1.9.2 was released.
comment:10 by , 9 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 , 8 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 , 8 years ago
| Milestone: | Future → 2.0.0 |
|---|
@mahge930 please check that this works with the new front-end
comment:13 by , 7 years ago
| Owner: | changed from to |
|---|---|
| Status: | accepted → assigned |
@mahge930 no longer working on this
comment:14 by , 7 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