mapSolution broken in R2019b?
1 view (last 30 days)
Show older comments
In R2019a, the following code works as intended,
%% Define the variables
x=optimvar('x',{'x1','x2'},'LowerBound',[-100,-200]);
y=optimvar('y',1,3,'LowerBound',[0 0 0],'UpperBound',[+300,+400,+500]);
%% Define some constraints
C.inequ=2*sum(y)+sum(x)<=1000;
C.equ=5*sum(x)==100;
prob=optimproblem('Constraints',C,'Objective',sum(x)+sum(y));
idx=mapSolution(prob,1:5)
resulting in the output,
idx =
struct with fields:
x: [1 2]
y: [1 2 3]
Something must have been changed in R2019b/R2020a, however, because I instead get an error:
Not enough input arguments.
Error in optim.internal.problemdef.ProblemImpl/mapSolution
Error in test (line 12)
idx=mapSolution(prob,1:5)
Were there any intentional changes in the behavior of the mapSolution function, and if so how do I get the code above to work in current Matlab?
3 Comments
Accepted Answer
Paul Kerr-Delworth
on 28 Aug 2020
Hi Matt and Walter,
Firstly Matt, many apologies that you've run into this unintended behavior. Also, many thanks to you both for looking into this and flagging it up.
What has happened here? The short answer is that mapSolution was made an internal function in R2019a and replaced with varindex. Once we made mapSolution internal, we repurposed it in R2019b leading to the internal error you encountered. We will tidy up the error and add a note in the documentation pointing you to varindex
Matt's original code works with varindex
%% Define the variables
x=optimvar('x',{'x1','x2'},'LowerBound',[-100,-200]);
y=optimvar('y',1,3,'LowerBound',[0 0 0],'UpperBound',[+300,+400,+500]);
%% Define some constraints
C.inequ=2*sum(y)+sum(x)<=1000;
C.equ=5*sum(x)==100;
prob=optimproblem('Constraints',C,'Objective',sum(x)+sum(y));
idx = varindex(prob);
Resulting in the output
idx =
struct with fields:
x: [1 2]
y: [3 4 5]
Also, varindex allows you to get the variable index by name, e.g.
idx = varindex(prob, 'y')
Resulting a double as the output
idx =
3 4 5
Matt, may I ask if you were aware of varindex? Also, is there anything in mapSolution that you are relying on that varindex doesn't provide?
Thanks again for flagging this and hope varindex helps!
Cheers,
Paul
Documentation for varindex:
5 Comments
Paul Kerr-Delworth
on 1 Sep 2020
Edited: Paul Kerr-Delworth
on 1 Sep 2020
Hi Matt,
Many thanks for the clarification, that's really helpful for us.
For a backwards compatible solution that can work, you can add your own version of varindex to the path as a separate function
function solstruct = varindex(prob)
if ~isa(prob, 'optim.problemdef.OptimizationProblem')
error('First input to VARINDEX must be an OptimizationProblem');
end
if verLessThan('matlab', '9.6')
error('This function is intended for R2017b - R2018b. Make this a separate function on the path.')
end
N = sum(structfun(@numel, prob.Variables));
solstruct = mapSolution(prob, 1:N);
end
Now for R2017b-R2018b, this function will be called as varindex doesn't exist. From 19a onwards the shipping OptimizationProblem method will be called as it is higher in the precedence order than your varindex.
Would you be happy to move to varindex with this solution?
Cheers.
Paul
More Answers (1)
Matt J
on 17 Aug 2020
Edited: Matt J
on 25 Aug 2020
1 Comment
Walter Roberson
on 25 Aug 2020
Internal code does not do detailed argument checking for performance reasons.
See Also
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!