numeric icon indicating copy to clipboard operation
numeric copied to clipboard

QPsolve failure case

Open gilbo opened this issue 11 years ago • 2 comments

The following input to qpsolve:

Dmat: [13,18,-6] [18,27,-9] [-6,-9,4] dvec: [-4,0,-100] Amat: [0] [0] [-1] bvec: [-25]

produces the solution vector:

[21:56:14.131] x:-3.999999999999967 y:-30.666666666666707 z:-100.00000000000006

which is incorrect as best I can ascertain. The problem above was arrived at by summing the energy

(2x + 3y - z)^2 + (x-4)^2 + (z-100)^2

with the additional constraint that

z <= 25

From that description it is clear that the answer should be x=4, z=25, and y set appropriately to zero out the first energy term

gilbo avatar Aug 07 '13 05:08 gilbo

I see that quadprog has been updated.

cygnyx avatar Nov 21 '14 02:11 cygnyx

Using the original quadprog package in R,

R version 3.2.2 (2015-08-14) -- "Fire Safety"
Copyright (C) 2015 The R Foundation for Statistical Computing
Platform: x86_64-w64-mingw32/x64 (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

  Natural language support but running in an English locale

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> require(quadprog)
Loading required package: quadprog
> 
> Dmat <- matrix(c(13,18,-6, 18,27,-9, -6,-9,4),3,3)
> dvec <- c(-4,0,-100)
> Amat <- matrix(c(0,0,-1),3,1)
> bvec <- c(-25)
> 
> solve.QP(Dmat,dvec,Amat,bvec=bvec,meq=1)
$solution
[1] -4 11 25

$value
[1] 2804.5

$unconstrained.solution
[1]   -4.00000  -30.66667 -100.00000

$iterations
[1] 2 0

$Lagrangian
[1] 125

$iact
[1] 1

> Dmat
     [,1] [,2] [,3]
[1,]   13   18   -6
[2,]   18   27   -9
[3,]   -6   -9    4
> dvec
[1]   -4    0 -100
> Amat
     [,1]
[1,]    0
[2,]    0
[3,]   -1
> bvec
[1] -25
> 

With quadprog js

var dmat = [], dvec = [], amat = [], bvec = [], meq;

    dmat[1] = [];
    dmat[2] = [];
    dmat[3] = [];
    dmat[1][1] = 13;
    dmat[2][1] = 18;
    dmat[3][1] = -6;
    dmat[1][2] = 18;
    dmat[2][2] = 27;
    dmat[3][2] = -9;
    dmat[1][3] = -6;
    dmat[2][3] = -9;
    dmat[3][3] = 4;

    dvec[1] = -4;
    dvec[2] = 0;
    dvec[3] = -100;

    amat[1] = [];
    amat[2] = [];
    amat[3] = [];
    amat[1][1] = 0;
    amat[2][1] = 0;
    amat[3][1] = -1;

    bvec[1] = -25;

    meq = 1;

    qp.solveQP(dmat, dvec, amat, bvec, meq);
{ solution: [ , -4.000000000000016, 11.000000000000007, 25 ],
  Lagrangian: [ , 125 ],
  value: [ , 2804.500000000001 ],
  unconstrained_solution: [ , -3.999999999999967, -30.666666666666707, -100.00000000000006 ],
  iterations: [ , 2, 0 ],
  iact: [ , 1 ],
  message: '' }

The response seems quite similar apart numerical rounding.

Feel free to open an issue in https://github.com/albertosantini/node-quadprog/ project if you found cases where the figures between R package and js porting are different.

albertosantini avatar Dec 09 '15 18:12 albertosantini