lin.avm 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #
  2. # This module contains functions and data structures for solving linear
  3. # programming problems by way of a more convenient interface than direct
  4. # invocation of the virtual machine's library functions, because it
  5. # allows symbolic names for variables, positive and negative solutions,
  6. # and costs proportional to magnitudes. A few matrix operations are also
  7. # included. Replacement functions implemented in virtual code are
  8. # provided in case the virtual machine doesn't have the required
  9. # libraries (lapack, umf, and pcx or glpk) but performance and memory
  10. # efficiency will suffer considerably.
  11. #
  12. # Copyright (C) 2007-2010 Dennis Furey
  13. #
  14. # linear_system (1870)
  15. # - lower_bounds
  16. # - upper_bounds
  17. # - costs
  18. # - taxes
  19. # - equations
  20. # - integers
  21. # - binaries
  22. # - derivations
  23. # mmult (255)
  24. # lp_solver (8605)
  25. # minverse (1795)
  26. # mip_solver (8952)
  27. # mp_solve (1756)
  28. # mp_sparso (4281)
  29. # msolve (1573)
  30. # replacement_lp_solver (7999)
  31. # solution (34208)
  32. # sparso (4119)
  33. # standard_form (19687)
  34. #
  35. # compressed with granularity 100
  36. #
  37. #
  38. # This program is free software; you can redistribute it and/or modify
  39. # it under the terms of the GNU General Public License as published by
  40. # the Free Software Foundation; version 3.
  41. #
  42. # This program is distributed in the hope that it will be useful,
  43. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  44. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  45. # GNU General Public License for more details.
  46. #
  47. # You should have received a copy of the GNU General Public License
  48. # along with this program; if not, write to the Free Software Foundation,
  49. # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  50. #
  51. {iwIwj{ik{kWP]NawgvxgF[kFseRjfmZy^gzuGZF>[fcgeKwPdKe`[fyNxvWzvoCv>=Z^tvkkjKKwO_
  52. >Se_vIIfjvWkeVWZtjfcv@[duPfjjtj{vhtozrGdNCwTSinvvjgkfv[avRzwOzqfvpAv]CwAaf]fzgk
  53. {fv]xczx{ww?wZiRgd>[eTSDz@fBg]fv[clVjpAeCv\v[cwYJowKvj=fv`[hBZerf]flVjd[<ZBgdEG
  54. ]zkn]xmzlFz`cjb{ePBgfd[DEBtQDdVdVhlAbTVhb<T[oDo<RBAvjsONzzljsfdVx]@R^_J^dV]geb=
  55. ]fd<M{J`bTEzyw<fNawYHgj{iDW>^``afFB]gdf<VgE{Tb^fMzj?vjdMzlFfgkIIv>CvZ^A>]]\D<V\
  56. L[nsd>t[fx[kZ`jjgfvjahJsd=T\Ffd<]f=XNKn<T[fkB[g\zl=WkZvBggoiJ{d^F^dD_nxl\Mzvj\M
  57. xgmz]KvtKhdVjewwWooZ^xgHVowgEx]ft^ZfxE[=<zgmzq]fw]wYIVZhF{fhFgMDqoZ==vBg\mJgdao
  58. PjfxEZ\dVjoYH>kPmnWkIvhfl`gAaFd@]glVBg^cnmZvjj[h]fvOQfwlg?kKgGKvhfmLgUF^]hTdVjl
  59. A@ZZ]ft<MxnBgeExyvvv`eW{uOKKviFpzp_F]{>Bk?m=WvBgech]fvKAg\zk=VpkE[{gWkwsZgFhPo`
  60. ^f=<dWB?D@cDVx<mH]fvAifx[eMRxHHeZ[{vyKEcnnxsphfqBmRLL[l\elW>BfBggIQFxezyQhw`f[l
  61. [c{zKZhFurcnoivhfp@\Ff=<pp]zGDVjiTgfv=CwFG[SGvpCw=zEZS{w[[F{zmo{pwSKxiGhio\iF=T
  62. F]fwcWtVjDCwjNvpllx_@S]=zeycu{{SSyReg{{uyib<Pznf{{h`fhANf`>DfBggANRdVjBSjp_JiJ\
  63. l\tz@Sa]T\S@[c{wRYQgQIFScuZ[xmOraK@hjqvysnnoIQoBH]fv>ySDVxBSKTEON=Vv=Cw_vBUchcw
  64. Au{yXikNObkF[b[ezUzRYiyXGFeEGsPzg{vhwyPpqODVj]MQhBl\ag?<fiNZlat@[\u=B==z>S^[cwW
  65. GpXvHzsN\[\]z\[\]zyysqQxUoFizqvbZkGwwoFnqMPoNnBgJ>rd[nWL@oHqN^[lat<t\Sz[_Aucy``
  66. [KUML[erG=x@[HClMy?>RRiS[gfzONhs[y[FuFyg{KIpyOOIAYYf]gq@kDA_E@HvgkA=X^[\B[\ECtE
  67. z=A{nIRvcU`AwMn<CjA\=w]ZLx{YyYPNCoP`OpmYQStQo{nfcNU{kfzsFfgPgOPpnBjvHy>?JOygqff
  68. ZPAlhS>]y\Sj[ivcIAPKMF[g_db=`E\UKo@YnyQYSVd>u?HfazG]SQpk{{tI?njB[jxi[oNoGIHoNpn
  69. dT?FPo<Kfy@hRPdUbfZ<a\MTUx<mZsXIFzAvdVCwZVfEfElyg\pOQsYYijxrNeYqSkQp{zF[Cux[xaz
  70. KzjBVpzkosploGDfhqGGDHdgFzn{\dzt\B=bXbu\mtUzfa<nQvSWDLCwqEfE<`<mu{DisSUyrWbpXiQ
  71. Dj=^QNw{trAQvlZU{=ucuVKXk{{{vtnsVK>{s[PeGOOIQOOH<OPzvgIPFYsL<BK\B<Md=[NyKPhxm<`
  72. Cogo<\?]Y=T_Ycuzmj[hRljgGRhjW^FwTQSqJUQNdLHKf@??wVoSFScuZ[{{{{h@zZspu[[YuPhpqOQ
  73. QPn_OKopegDtQ=N<<<tU{L^_DyEXf@CiqrN[PwLuzmjmkhQhWwKiQ<OiNnkNVFyQbQLvXu``]CuDM{Q
  74. GEy^czAv[tScuz[c{{{dMw`k[Ozat[kkZPpnqqQNPoAPxmH@_fhxE<>mYLzEOqJN@WC=[GQXSNJmkhQ
  75. wAYuGw@yuCZLReRpjgfpvjKcRTQQEoDL?tL?zPcsSnl[]cw=zB[dST[dST[cuz[cvt[vIyQiqZe{=zC
  76. ywkpphqRPqPnpaLnnjkEWp<aioE\RwwEg\o[GjzY^zmSZOYuFeQPyuHeQNaQSNKqHBgkF]fuSqUq\jq
  77. FhSHSSwxq[MVbAtbSe]ZEatc\mzEtH[dSHSdSHSezO{_qGkLz[Si=zl[^S]Z{WyGGDoGFgHoON^_np^
  78. @shbp^QCa<N<?{SAJkRdkMpyuHeQPfQQNxs^aQPkIgoZZeQPhBgg_dVkaPkySOqGfaaaapxOi>sInz\
  79. EX<al>S<EXlTD[hB>Ctc\atc\aw{{=Z[iMQeqYXI{S_@S]=zeyct[srvqOOPnfnhvtebnLBgQpzPLV[
  80. uo{{`gRhRP]>tuFQQNxs^xs\^gsgoZ>Fk>FkWBozQJBgNvtBgQ^kUnkvgpKOFJVJWlvkJKqqJcWETan
  81. REVELSDa=Xl[cw=z[eZ[{tcwAwCfCSyQxi?[qtJK]AuTRDAmCt[kjvsIWPfGNgNqxnpNdjS<<]NE{SF
  82. kcuynZ=vKj=ZVgoZ>FkZDfytyjsl^gs_rvKWkhNiYFgLVdgftVfrvyRNycHnwgpF<L<LP?VvSsAoQaT
  83. QFurVurT\c^>Z^<EAvD<`Sf[^[auzl[\aoypoYQQKoGpi?[qt@[jKdUbZn[hS]{Z{D^nhFnhNh_PnUi
  84. >mVzjD=ki<jWd[<[ZXVOesYqEdDfytyjslyjssEGlxfKWiynNxX`kCZNO[Xph]gftg]gHAvjyvgqUD^
  85. jPgjdUYdvYLJ{ezuJ^F@\\dN>>M>M>J[>J[G=zHSezEZbAtakAahsysVoxM@XyGLsyY>S\Mz?`@T@Ct
  86. EZEzCwqhnpiM?>iHBXn`D@msq={pze?{LREmZgcOTQ=RkH<yjssEGlxgnNxKFnDo`f=nNxSFnDo`^Ht
  87. eQPigc>hfB]fzg]ddK^jQ{znwsfVk\gaOMyOVJJNc[CXQeYDE<`jj<HR<HRe]Z>SHCtal>SRVRxz>ZM
  88. CiQQaInc`XyGLsqVE{>S\?^=[uzHSb[c{tngIPH^eOIFnj?OR<]y_XfWAlEBFYkZT?K>SSUX`k?nh^H
  89. uF\NDo`f<L?lkD_JVd=<K@<xkIvyEdUPhBBg]ftUm{fzR[co\ga[{lVkRguN_G^NiKO]PwTJ_DJD<@=
  90. <E<`\EXEVTS^SEV>GRK]FMOIAahalQfBc`XyKlsPPAnEz<Uz<`[\ct@Sc{[q_HfqFh@D<Eeg<qFCrPq
  91. d^cbC<p`[zMWpXAxnDo`f<L?ljL?ljILJL?qG_PIL^gsoqGShh\Bg=ftK>S]fyYD[TZkfzR[co\VjdV
  92. kPgnNh>sYOdx[?H\nArnSU\EYUgbOsMPnOpsYY?yYl@dVZMnIO_ZfZPAlhS>]y\Sj[d[ac{{yINp^n@
  93. nZXtlCRwOZHxCw>CuYv@sj?IxL?ljILJILJXg_QTJXcDyjonjhHSQPlVdVxjf[]fvo@=TLVjBgqp]y]
  94. vtVyDVjf>tPdqUzAoHNnyqf>>jV>NR\\dLqXiok=WscuxCKGFd@dVZSnWcLUbfZ<a\MTUx<m[D[Id[c
  95. {[sp`h@fHbOoP@IMM`^N<F{gfCr[{nqY{SAJILJXgcFtjgcIntjGx`kBfnxJQOfH]fBmftNCtViHUb_
  96. ftVjhm<R@Bg]hT]gplnGb[QK<vIG]lRZ\^]@jU<vuysUl@xQQh[h[OGNt<\N]ds^Eet=\UcEjTHZB[a
  97. =YOTSd[cc{kSPPgQS`SJ`ucI<FWccY=VHUz[NGak{uFqenjGftjgkJg^zZgkGoD_JX<QHK[AyN=dZjg
  98. i=ZBfGtf<VjBkOBUdvjCl=hTehoppKG<lhS_c_G\\dLHZmpRCeVyr{w=ShAPVxC>=?pTE?T<BK\B<Md
  99. =ZFRP<apmZAT[cyw{GGFe[toQpSO`_Bk`a^>L=d[<ZmV{z[a{EtC^vjxvjxvknTVjxwBvkn[E`<xgDn
  100. mSUQF\T@LVj<ctVcY<=ftWBGtf<Vj=LZeNfeQ{YorZ=Mu{ph<^{hRKXHs?kSAQsa[ZQ_dQj^_M<y<<<
  101. JB[_y`a\EZTL[d[u{[q_IOPCuysIOQNxnBgZOHTPA^X=HYfKd[EyZJVNxvknTVknTVkEnBgxcwA=fxc
  102. HcDqQphzakwq<DVj`[]glFBg=xCY<=fu<MKB\aIzAvacoq?Lcw]NN{ZOnmSCNAdz[afQQxeQSlC{K<S
  103. FI<>mX^Sfuz[r<SP?{D[u{{qHpfd[TZTnjbUeoFZg{cT<EBFtI<qx=T=xSguqnTVkEnBgnX]fyOLViE
  104. os`\VkPqPpX\xbASKYQWODBkF]xBjbBf=OlFBgLk?qmOqKPiLnWjx<BwF^gfQP_gsYEqMOhYQnxsmVx
  105. smXyWeLc]X<a\nVF@>@SQUtM{oLKy]Z[y{PqAQ=TLZMOQpzwyU]f[cm_B<bhQEubEfYf{b@cDVkPpBg
  106. QI=flF<ViONaQLVh>\>\GgqIZ^KikNSHBm]@R>kzBeGe]f]HGkuOLfJzOXnxSkczVQfvxsS=[qKIga[
  107. hSjZDfxRxDfxRxS[OmlMexcR<>JZJBATShLM{nB[tSac{voNdEDzFwzqQ_KpLbBd[T[`<cc=ntfUlIV
  108. k{uPpBg<d=f\d=f\BdF>xs]f\?ngfXnoSN{pkSP]{>afw_tWF{tVqfuwyuyiIoVjFoAPpn>Axf]ft^g
  109. maqXRyrqM[OsaWWhXKWgVJKWgVJYyqa@f\Mk^H<TULF>SCrCw@DAtEZx]zSzqQPT[yAOylrQF]L`TY=
  110. TL[]`x>Gl<Kh=fuzSZ>\Bf<V\BdV<^gs]gnZgiKnnUUCQQEOaq<LEtVjkCtUfw_tV@vjXkH{RyPQ]X{
  111. WD<lm`Ne{mLVjKWkIoAraSS>aQzNaQUIWwAx`k?Npx`k?Np{xRSortF<=<=S@a{n@CutcxcvKH[ezS^
  112. IF\[coUyFPUOhA\T<`_{zMUZFzjBgd[U{z<V]dVBKWhxBnX]fxgp`ioUKO`TVyN<>BgfxEZ<VjkCtY=
  113. fzOHDKqxaauImKMEfgKFhSxFBgX`kCGQgW`txeY=]OdkI\gPYuRnDobNQnDobNQqsSkKyhip]injT`R
  114. <Asyb[g=Zq\LKh?z[fgNCnCqOjnyrQMxU\[cszH^?fuulVy<R_B[atVBBCEGmfdYOLVkDJ^JXiQWH{O
  115. fK@=grgdalVjgnctPBg{dnxoXlKzpbRKtHejHtDEzldVh^HtLU[sa<a==SGU?d^gro^aQUE<KHjHL?o
  116. G_MoSApJcU[ByDKBR>]>{c^MT<=ZGcmQ@[eCt@[qPi=Y=GkQF^FmSgmM\]x]uz[Y_BguETW>U\B]xcl
  117. T=D_JX<<>\BgH{=E=_\FuorkOQDW>Bg^c]grgd@[tBg[y^`l]c`cY`r<xoQC@paXUCypBe<K?[kMDEV
  118. BRINv_rwLagoTHILYo?PCXqrUv]yR?OEYpj=[I\pY]]>{ct>mZSTSa]ZlSgOLE>qOg<rJHOPAFY=Y=D
  119. [TZTl]f{`nCtf@=T=t@<xf<Vh_n>HxSKnuNq=Rl[]fw<LW>Bg^={lVez[PbHwBr?QFPdmgElTXH<\O`
  120. fB_PB]Oz?YdKGkJcEGluPDfyMnusEnusRfqpQZ{xnIKP\aKjIEtI<pY\Tz<aSn>SdEZ>[qQM_RHf]KE
  121. Wdkb>Lh=TLZL=f{zY\R<BTbIQTVpqD@JnHogZDobp=TBk?]zBg]awdVd[DZwFchQoDxyh?fhOJu{qLU
  122. nOWIP[qHRQD_yD_JRb?rw\jkOD>vyH]lalV{L`yy`JXRtUCWPM{nS]P@So[=`amEX\[qOLIQ@RH^jQ[
  123. HbTbVK\Vh[cm_>>e]n?]gqG?==?dSPO{OL\WB>=TBk=aoxBlAp@QB[ZNxLaGlmJkRfzP>CyF<jsmgE{
  124. nvWK]Iz@<x@snNxVxfxAkFk=W\XyD{UKE?`?AiaQ\pJTRA^{z`aopaxjZjZ^[pHdn\N@CJQO<b>F]{]
  125. fd[T[`<<>vt[LD?\<gZ[KNvdCx>=hDETx\UbG]HfQP_dT?\[GN@\?qO=[aKFXRJgxgPAcqkPYSLqESD
  126. _JAXcfxInZglolzmp@{WlIF?WQbwDyiOL=TSn^R=ryJF@LdM>M{QQN^WAF@=\=z[=g<R@CtxftQJW?y
  127. RnIKA_<LDCxbqD>dpegoXxPyh`=pyPea{OnXSVvxiMNY[o`dt^sOCFy@<x`cDVk]EnBgt?StbDml[_V
  128. wcJGRetmQk@aOMTR[?EXx?\td[qFpMFg\VCnC]eb_{xcfyQDeXQ]e`A@P\=TnQF<f@^FkEMEPSMIO^z
  129. <cwgNXajQnpaE\xQGPRMnFnn^vqDqIOLVkqOLVknkrPsEZ]FYkASGBfo`\hLzK@_V>J<ruP<<MAxpe=
  130. ?Hc<SLLTf=z[NX]fyHE=NpcGaNDH>=F_rvIjdo?\n[ODSKpqIUDGE<TKMWaEpaMsFjxc_CF>\BkJ<d=
  131. fo`[O@glYqpkXmWptAoPZQf^xzIPOm`xzFSiIDnEbTd<D[D[PpBgiDgzx^Qo<T]nNxWnElMoHj^bZKD
  132. \F<IQ@mTnR?ok@psYKEsV^t<W>x<VgoF`hmtzSPXZVDzrwiXq[uolL^GrPALHKYMtzeO==^dlAp@>\B
  133. gLmxoXUByIED_JOs_Hj\^{<<BqH@XL_KYXRPWpCoNCEoOQWnCuPBeP?Jk=Ah?kACXFErXa@qSAMz[ZG
  134. d=>SzgSEW\HSpe=\EbF<ViQO<qDaGID`<yHq[>_x<x^QFz`YpNQ?JAj@yLXqI>Hoxb=UfBv\ND@ehGs
  135. {_ETIRbL>sPd[D[L^zAK@EmAgUmE{GE\fDVndLJ]^yp?PljCJ<x_PlDJaA@j^cY?Hfv@^>\OFxcD\bB
  136. Epzet?yzyn=HaILNvi<SLO^jwlvnWWqQg<zpm\DWP?QTZYEo\RaNqINc@dvKaNNf@\xD<fFyOLn?HTN
  137. fZJBAWHHE>wFHyPU^rvjjP?XKYEDgpECwFb=aJyTQtDjyQqQF>@nGdcNo@^o\SftF@HJH>]VKgLBt=M
  138. NPpdF^>]fvkascQCNuqa]ZOM]EPwQ[QKFugdLDT^eu__dJ?ptVjBUx_PA>[bC`Df<<\BgvkMyPxgpVr
  139. [X\aypYUyOcnaSEfyHNX^BOyid>qNtVkHkLc>_OxoP@\VxBgfHjLLGVRIVYc`aqNBiJwM[AGGEofzJ`
  140. ^ZSzB]xX^jBkM?qSYOqqPf^Bl]fvx`\QKNYOKhXj[PbryPgPaGGqOLVkMnE{]z[UUHGvjBm]JF_x[bL
  141. F_O<[]fljA?ijssUshRF@PpYNvlIuFzCD>\BgtS=z[D[D[uuOnBg]v_EltTb`eZ><R=f_DaIMQOsfM[
  142. ZOlJnc@hf]K=xoE\BgPzD[D[<SLS{{]nTVj=@oJ_z?>^DDBei\u\xOmPkfQPa\AMdMA_wPlEnBgfYlA
  143. p@U^cuZ[cpcDVxDD\A?>ylBniApPhRderkIideL@cXDLNdVptIBTdfFCn[D[D[PpBm\F=dl]xVqGbwo
  144. ZAL^gm`nLfP=L=jP`>d\H=T=x=Y=<d=xPi`CCNUIHxahpv?rv?F^x<Y]T>BTbU^\=LbdHG_TwDSs<=X
  145. X`k?L^FAUlFb>da<AfURR\sjR?nDo`HJy?\<<nNmiQOqN\xHL?mSGR?=P]w_eDu@[TqIDbQ[NUqA`kB
  146. CCcI@PetUc_iZdXs_DkM^_K>[qEQU[YSXKGPK?h[zNjPaNOdRunYFJKlUz[H@jkMXIhnXiGDx]d[DZh
  147. aOs<yPWPq=BiNX=Y=JJ<SfH_n\dMGPebTdyOmIXwl=l>=^dg^dw=zaXXU\FkGO\opg?@bVjESS=LqrE
  148. ]fu_Fta@`]]f{<WJAPTViruhqM]fpnkGJTTVlRgxYsBBlrgxRJjbC\BghPkoxTXBgrvKDKDW\VhNPiN
  149. qEk=fq]PiNbQ=gQ<\>=v]jGu^T[OHbn?d^Elkl=tKDPiNQPd<]nD