# # This module contains functions and data structures for solving linear # programming problems by way of a more convenient interface than direct # invocation of the virtual machine's library functions, because it # allows symbolic names for variables, positive and negative solutions, # and costs proportional to magnitudes. A few matrix operations are also # included. Replacement functions implemented in virtual code are # provided in case the virtual machine doesn't have the required # libraries (lapack, umf, and pcx or glpk) but performance and memory # efficiency will suffer considerably. # # Copyright (C) 2007-2010 Dennis Furey # # linear_system (1870) # - lower_bounds # - upper_bounds # - costs # - taxes # - equations # - integers # - binaries # - derivations # mmult (255) # lp_solver (8605) # minverse (1795) # mip_solver (8952) # mp_solve (1756) # mp_sparso (4281) # msolve (1573) # replacement_lp_solver (7999) # solution (34208) # sparso (4119) # standard_form (19687) # # compressed with granularity 100 # # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # {iwIwj{ik{kWP]NawgvxgF[kFseRjfmZy^gzuGZF>[fcgeKwPdKe`[fyNxvWzvoCv>=Z^tvkkjKKwO_ >Se_vIIfjvWkeVWZtjfcv@[duPfjjtj{vhtozrGdNCwTSinvvjgkfv[avRzwOzqfvpAv]CwAaf]fzgk {fv]xczx{ww?wZiRgd>[eTSDz@fBg]fv[clVjpAeCv\v[cwYJowKvj=fv`[hBZerf]flVjd[^``afFB]gdfCvZ^A>]]\Dt[fx[kZ`jjgfvjahJsd=T\Ffd<]f=XNKnkPmnWkIvhfl`gAaFd@]glVBg^cnmZvjj[h]fvOQfwlg?kKgGKvhfmLgUF^]hTdVjl A@ZZ]ftBk?m=WvBgech]fvKAg\zk=VpkE[{gWkwsZgFhPo` ^f=BfBggIQFxezyQhw`f[l [c{zKZhFurcnoivhfp@\Ff=DfBggANRdVjBSjp_JiJ\ l\tz@Sa]T\S@[c{wRYQgQIFScuZ[xmOraK@hjqvysnnoIQoBH]fv>ySDVxBSKTEON=Vv=Cw_vBUchcw Au{yXikNObkF[b[ezUzRYiyXGFeEGsPzg{vhwyPpqODVj]MQhBl\ag?S^[cwW GpXvHzsN\[\]z\[\]zyysqQxUoFizqvbZkGwwoFnqMPoNnBgJ>rd[nWL@oHqN^[latRRiS[gfzONhs[y[FuFyg{KIpyOOIAYYf]gq@kDA_E@HvgkA=X^[\B[\ECtE z=A{nIRvcU`AwMn?JOygqff ZPAlhS>]y\Sj[ivcIAPKMF[g_db=`E\UKo@YnyQYSVd>u?HfazG]SQpk{{tI?njB[jxi[oNoGIHoNpn dT?FPo{s[PeGOOIQOOHmYLzEOqJN@WC=[GQXSNJmkhQ wAYuGw@yuCZLReRpjgfpvjKcRTQQEoDL?tL?zPcsSnl[]cw=zB[dST[dST[cuz[cvt[vIyQiqZe{=zC ywkpphqRPqPnpaLnnjkEWpsInz\ EXSCtc\atc\aw{{=Z[iMQeqYXI{S_@S]=zeyct[srvqOOPnfnhvtebnLBgQpzPLV[ uo{{`gRhRP]>tuFQQNxs^xs\^gsgoZ>Fk>FkWBozQJBgNvtBgQ^kUnkvgpKOFJVJWlvkJKqqJcWETan REVELSDa=Xl[cw=z[eZ[{tcwAwCfCSyQxi?[qtJK]AuTRDAmCt[kjvsIWPfGNgNqxnpNdjS<<]NE{SF kcuynZ=vKj=ZVgoZ>FkZDfytyjsl^gs_rvKWkhNiYFgLVdgftVfrvyRNycHnwgpFZ^mVzjD=ki>M>M>J[>J[G=zHSezEZbAtakAahsysVoxM@XyGLsyY>S\Mz?`@T@Ct EZEzCwqhnpiM?>iHBXn`D@msq={pze?{LREmZgcOTQ=RkHhfB]fzg]ddK^jQ{znwsfVk\gaOMyOVJJNc[CXQeYDE<`jjSHCtal>SRVRxz>ZM CiQQaInc`XyGLsqVE{>S\?^=[uzHSb[c{tngIPH^eOIFnj?OR<]y_XfWAlEBFYkZT?K>SSUX`k?nh^H uF\NDo`fGRK]FMOIAahalQfBc`XyKlsPPAnEzS]fyYD[TZkfzR[co\VjdV kPgnNh>sYOdx[?H\nArnSU\EYUgbOsMPnOpsYY?yYl@dVZMnIO_ZfZPAlhS>]y\Sj[d[ac{{yINp^n@ nZXtlCRwOZHxCw>CuYv@sj?IxL?ljILJILJXg_QTJXcDyjonjhHSQPlVdVxjf[]fvo@=TLVjBgqp]y] vtVyDVjf>tPdqUzAoHNnyqf>>jV>NR\\dLqXiok=WscuxCKGFd@dVZSnWcLUbfZ=?pTE?TL=d[mX^Sfuz[r@SQUtM{oLKy]Z[y{PqAQ=TLZMOQpzwyU]f[cm_B\>\GgqIZ^KikNSHBm]@R>kzBeGe]f]HGkuOLfJzOXnxSkczVQfvxsS=[qKIga[ hSjZDfxRxDfxRxS[OmlMexcR<>JZJBATShLM{nB[tSac{voNdEDzFwzqQ_KpLbBd[T[`xs]f\?ngfXnoSN{pkSP]{>afw_tWF{tVqfuwyuyiIoVjFoAPpn>Axf]ft^g maqXRyrqM[OsaWWhXKWgVJKWgVJYyqa@f\Mk^HSCrCw@DAtEZx]zSzqQPT[yAOylrQF]L`TY= TL[]`x>Gl\BfaQzNaQUIWwAx`k?Npx`k?Np{xRSortF<=<=S@a{n@CutcxcvKH[ezS^ IF\[coUyFPUOhA\T<`_{zMUZFzjBgd[U{zBgfxEZ]>{c^MT<=ZGcmQ@[eCt@[qPi=Y=GkQF^FmSgmM\]x]uz[Y_BguETW>U\B]xcl T=D_JX<<>\BgH{=E=_\FuorkOQDW>Bg^c]grgd@[tBg[y^`l]c`cY`r{ct>mZSTSa]ZlSgOLE>qOgHxSKnuNq=Rl[]fwBg^={lVez[PbHwBr?QFPdmgElTXH<\O` fB_PB]Oz?YdKGkJcEGluPDfyMnusEnusRfqpQZ{xnIKP\aKjIEtISdEZ>[qQM_RHf]KE Wdkb>Lh=TLZL=f{zY\RvyH]lalV{L`yy`JXRtUCWPM{nS]P@So[=`amEX\[qOLIQ@RH^jQ[ HbTbVK\Vh[cm_>>e]n?]gqG?==?dSPO{OL\WB>=TBk=aoxBlAp@QB[ZNxLaGlmJkRfzP>CyFF]{] fd[T[`<<>vt[LD?\=hDETx\UbG]HfQP_dT?\[GN@\?qO=[aKFXRJgxgPAcqkPYSLqESD _JAXcfxInZglolzmp@{WlIF?WQbwDyiOL=TSn^R=ryJF@LdM>M{QQN^WAF@=\=z[=gdpegoXxPyh`=pyPea{OnXSVvxiMNY[o`dt^sOCFy@J=F_rvIjdo?\n[ODSKpqIUDGE\BkJx\B gLmxoXUByIED_JOs_Hj\^{<SzgSEW\HSpe=\EbF_xHoxb=UfBv\ND@ehGs {_ETIRbL>sPd[D[L^zAK@EmAgUmE{GE\fDVndLJ]^yp?PljCJ\OFxcD\bB Epzet?yzyn=HaILNviwFHyPU^rvjjP?XKYEDgpECwFb=aJyTQtDjyQqQF>@nGdcNo@^o\SftF@HJH>]VKgLBt=M NPpdF^>]fvkascQCNuqa]ZOM]EPwQ[QKFugdLDT^eu__dJ?ptVjBUx_PA>[bC`Df<<\BgvkMyPxgpVr [X\aypYUyOcnaSEfyHNX^BOyid>qNtVkHkLc>_OxoP@\VxBgfHjLLGVRIVYc`aqNBiJwM[AGGEofzJ` ^ZSzB]xX^jBkM?qSYOqqPf^Bl]fvx`\QKNYOKhXj[PbryPgPaGGqOLVkMnE{]z[UUHGvjBm]JF_x[bL F_O<[]fljA?ijssUshRF@PpYNvlIuFzCD>\BgtS=z[D[D[uuOnBg]v_EltTb`eZ>^DDBei\u\xOmPkfQPa\AMdMA_wPlEnBgfYlA p@U^cuZ[cpcDVxDD\A?>ylBniApPhRderkIideL@cXDLNdVptIBTdfFCn[D[D[PpBm\F=dl]xVqGbwo ZAL^gm`nLfP=L=jP`>d\H=T=x=Y=BTbU^\=LbdHG_TwDSs<=X X`k?L^FAUlFb>da[qEQU[YSXKGPK?h[zNjPaNOdRunYFJKlUz[H@jkMXIhnXiGDx]d[DZh aOs=^dg^dw=zaXXU\FkGO\opg?@bVjESS=LqrE ]fu_Fta@`]]f{=v]jGu^T[OHbn?d^Elkl=tKDPiNQPd<]nD