Initializing help system before first use

Maximal inscribing square


Type: Nonconvex NLP
Rating: 3 (intermediate)
Description: Computing a maximal inscribing square for the curve (sin(t)*cos(t), sin(t)*t). Comparison of results with different solver choices.
File(s): inscribedsquare.mos, inscribedsquare_graph.mos


inscribedsquare.mos
(!******************************************************
   Mosel Example Problems
   ======================

   file inscribedsquare.mos 
   ````````````````````````
   Computes a maximal inscribing square for the curve 
   (sin(t)*cos(t), sin(t)*t), t in [-pi,pi]

   Source: https://www.minlplib.org/inscribedsquare01.html

   x2..x5 are the four values of the parameter t. 
   x6 and x7 are the (x,y) coordinates of the first corner of the square. 
   (x8, x9) is a vector pointing to a second vertex, all the other vertices 
   are given by a combination of these four values. 
   The length of the vector (x8,x9) is exactly the side length of the
   square, which we are maximizing, that is, the square of it, to keep it nicer.
   
   (c) 2023 Fair Isaac Corporation
       author: S. Heipcke, July 2023
*******************************************************!)
model "inscribedsquare"
 uses "mmxnlp"
 parameters
   ALG=1      ! Solver choice:  1: global, 2: SLP, 3: Knitro
 end-parameters

 declarations
   x2,x3,x4,x5,x6,x7,x8,x9: mpvar
 end-declarations

! Variable bounds
 x2 >= -3.14159265358979; x2 <= 3.14159265358979;
 x3 >= -3.14159265358979; x3 <= 3.14159265358979;
 x4 >= -3.14159265358979; x4 <= 3.14159265358979;
 x5 >= -3.14159265358979; x5 <= 3.14159265358979;
 x6 is_free
 x7 is_free

(! Optionally, set initial values:
 setinitval(x2, -3.14159265358979)
 setinitval(x3, -1.5707963267949)
 setinitval(x4, 1.5707963267949)
 setinitval(x5, 1.5707963267949)
 setinitval(x6, 1.22464679914735E-16)
 setinitval(x7, 3.84734138744358E-16)
 setinitval(x8, 1)
 setinitval(x9, 1)
!)

 Obj:= x8^2 + x9^2;

! Constraints
 E2:= sin(x2)*cos(x2) - x6 = 0;
 E3:= sin(x2)*x2 - x7 = 0;
 E4:= sin(x3)*cos(x3) - x6 - x8 = 0;
 E5:= sin(x3)*x3 - x7 - x9 = 0;
 E6:= sin(x4)*cos(x4) - x6 + x9 = 0;
 E7:= sin(x4)*x4 - x7 - x8 = 0;
 E8:= sin(x5)*cos(x5) - x6 - x8 + x9 = 0;
 E9:= sin(x5)*x5 - x7 - x8 - x9 = 0;

 setparam("XNLP_VERBOSE",true)        ! Uncomment to see detailed output
 case ALG of
  1: writeln("Using global solver")
  2: do
     writeln("Using SLP as local solver")
    ! Use multi-start heuristic 
     addmultistart("random points", XNLP_MSSET_INITIALVALUES, 100)
     setparam("XPRS_NLPSOLVER", 1)       ! Use a local NLP solver
     setparam("XNLP_SOLVER", 0)          ! Select SLP as local solver
   end-do
  3: do
     writeln("Using Knitro as local solver")
    ! Use multi-start heuristic 
     addmultistart("random points", XNLP_MSSET_INITIALVALUES, 100)
     setparam("XPRS_NLPSOLVER", 1)       ! Use a local NLP solver
     setparam("XNLP_SOLVER", 1)          ! Select Knitro as local solver
   end-do
 end-case

 maximize(Obj)

 writeln("Solution value: ", getobjval)
 writeln("Corner point: ", x6.sol, ",", x7.sol)
 writeln("Side vector: ", x8.sol, "  ", x9.sol)
 writeln("t=", x2.sol, "  ", x3.sol, "  ", x4.sol, "  ", x5.sol)
 
end-model

inscribedsquare_graph.mos
(!******************************************************
   Mosel Example Problems
   ======================

   file inscribedsquare_graph.mos 
   ``````````````````````````````
   Computes a maximal inscribing square for the curve 
   (sin(t)*cos(t), sin(t)*t), t in [-pi,pi]

   Source: https://www.minlplib.org/inscribedsquare01.html

   x2..x5 are the four values of the parameter t. 
   x6 and x7 are the (x,y) coordinates of the first corner of the square. 
   (x8, x9) is a vector pointing to a second vertex, all the other vertices 
   are given by a combination of these four values. 
   The length of the vector (x8,x9) is exactly the side length of the
   square, which we are maximizing, that is, the square of it, to keep it nicer.
   
   - Graphical representation of results -
   
   (c) 2023 Fair Isaac Corporation
       author: S. Heipcke, July 2023
*******************************************************!)
model "inscribedsquare"
 uses "mmxnlp", "mmsvg"
 parameters
   ALG=1      ! Solver choice:  1: global, 2: SLP, 3: Knitro
 end-parameters

 declarations
   x2,x3,x4,x5,x6,x7,x8,x9: mpvar
 end-declarations

! Variable bounds
 x2 >= -3.14159265358979; x2 <= 3.14159265358979;
 x3 >= -3.14159265358979; x3 <= 3.14159265358979;
 x4 >= -3.14159265358979; x4 <= 3.14159265358979;
 x5 >= -3.14159265358979; x5 <= 3.14159265358979;
 x6 is_free
 x7 is_free

(! Optionally, set initial values:
 setinitval(x2, -3.14159265358979)
 setinitval(x3, -1.5707963267949)
 setinitval(x4, 1.5707963267949)
 setinitval(x5, 1.5707963267949)
 setinitval(x6, 1.22464679914735E-16)
 setinitval(x7, 3.84734138744358E-16)
 setinitval(x8, 1)
 setinitval(x9, 1)
!)

 Obj:= x8^2 + x9^2;

! Constraints
 E2:= sin(x2)*cos(x2) - x6 = 0;
 E3:= sin(x2)*x2 - x7 = 0;
 E4:= sin(x3)*cos(x3) - x6 - x8 = 0;
 E5:= sin(x3)*x3 - x7 - x9 = 0;
 E6:= sin(x4)*cos(x4) - x6 + x9 = 0;
 E7:= sin(x4)*x4 - x7 - x8 = 0;
 E8:= sin(x5)*cos(x5) - x6 - x8 + x9 = 0;
 E9:= sin(x5)*x5 - x7 - x8 - x9 = 0;

 setparam("XNLP_VERBOSE",true)        ! Uncomment to see detailed output
 case ALG of
  1: writeln("Using global solver")
  2: do
     writeln("Using SLP as local solver")
    ! Use multi-start heuristic 
     addmultistart("random points", XNLP_MSSET_INITIALVALUES, 100)
     setparam("XPRS_NLPSOLVER", 1)       ! Use a local NLP solver
     setparam("XNLP_SOLVER", 0)          ! Select SLP as local solver
   end-do
  3: do
     writeln("Using Knitro as local solver")
    ! Use multi-start heuristic 
     addmultistart("random points", XNLP_MSSET_INITIALVALUES, 100)
     setparam("XPRS_NLPSOLVER", 1)       ! Use a local NLP solver
     setparam("XNLP_SOLVER", 1)          ! Select Knitro as local solver
   end-do
 end-case

 maximize(Obj)

 writeln("Solution value: ", getobjval)
 writeln("Corner point: ", x6.sol, ",", x7.sol)
 writeln("Side vector: ", x8.sol, "  ", x9.sol)
 writeln("t=", x2.sol, "  ", x3.sol, "  ", x4.sol, "  ", x5.sol)

! **** Display the solution as user graph ****
 declarations
   RT,P: list of real
 end-declarations
! Set the size of the displayed graph
 svgsetgraphscale(100)
 svgsetgraphlabels("x","y")
 svgsetgraphviewbox(-1,0,2.5,2.5)
 
! Draw the graph of the curve
 svgaddgroup("G", "Enclosing graph") 
 STEP:=100
 OFFSET:=0.75    ! Translation offset to avoid negative coordinates in SVG
 forall(i in 0..STEP) RT+=[-M_PI+i/STEP*2*M_PI]
 svgaddline(sum(t in RT) [sin(t)*cos(t)+OFFSET, sin(t)*t])

! Draw the solution square
 svgaddgroup("S", "Square")
 P:=[x6.sol+OFFSET, x7.sol, x6.sol+x8.sol+OFFSET, x7.sol+x9.sol,
     x6.sol+x8.sol-x9.sol+OFFSET, x7.sol+x9.sol+x8.sol, x6.sol-x9.sol+OFFSET, x7.sol+x8.sol]
 (! Same as:
 P:=sum(t in [x2.sol,x3.sol,x5.sol,x4.sol]) [sin(t)*cos(t)+OFFSET, sin(t)*t] 
 !)
 writeln(P)
 svgaddpolygon(P)
 svgaddtext(0.15,2.25,"Solution with " + if(ALG=1, "Global", if(ALG=2, "SLP", "Knitro")) +
   ": "+textfmt(getobjval,6,5))
 svgsetstyle(svggetlastobj, SVG_COLOR, SVG_BLACK)

 svgsave("inscribedsq"+ALG+".svg")
 svgrefresh
 svgwaitclose("Close browser window to terminate model execution.", 1)

end-model

© 2001-2024 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.