B ÔÂ_e>ã@s*ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl mZdd„ZededdZe  d¡ZGd d „d eƒZd d „ZGd d„dƒZedkr&eejƒdkræej d¡e d¡eƒZejddkr2x&eej  d¡ƒD]Z!e"de!ƒqWe d¡nôejddkr†e #d¡Z$e %e$¡\Z&Z'e(e  ¡dƒZ)e) de&e'f¡e) *¡n ejddkrˆye(e  ¡dƒZ)WnDe+k rìe ,¡dZ-ej d¡ej d¡e d¡YnXe .de) /¡¡Z0e0r e1e0 2¡dƒZ&e0 2¡dZ'e) 3¡Z4e) *¡e 5de&e'¡e4rvej d e4¡e(e  ¡d!ƒZ)e) e4¡e) *¡ne 6e  ¡¡nžejdd"krÔe 7¡\Z&Z'e&r¸e 8e&e'¡nej d#¡ej d$¡nRy8ejdZ9e 7¡\Z&Z'e&s e #e9¡Z$e %e$¡\Z&Z'Wn8e:k rDe ,¡dZ-ej d%¡e d¡YnXy–e ;d¡d&Ze&e'e=¡\Z?Z=e@e?ejAƒr˜e?jBZ?ej e?¡ej Ce&e'¡Z.ProxiedTransport_PY2cs$ˆ|ƒ|_|jjs ˆd|ƒ|_dS)Nzhttp://)ÚproxyÚhostname)Úselfr)rr r Ú set_proxy;s z8ProxiedTransport..ProxiedTransport_PY2.set_proxycsZˆ|ƒ}|jr| ¡|_ndtj| ¡f|_|jjdkrBˆj}nˆj}||jj|jjƒS)Nz%s://%sr) rÚgeturlÚrealhostr rÚHTTPSConnectionÚHTTPConnectionrr)rrÚtargetÚ connClass)Úhttplibrr r Úmake_connectionAs  z>ProxiedTransport..ProxiedTransport_PY2.make_connectioncSs| dd|j|f¡dS)NÚPOSTz%s%s)Ú putrequestr)rÚ connectionÚhandlerÚ request_bodyr r r Ú send_requestRsz;ProxiedTransport..ProxiedTransport_PY2.send_requestcSs| d|j¡dS)NÚHost)Ú putheaderr)rr$rr r r Ú send_hostVsz8ProxiedTransport..ProxiedTransport_PY2.send_hostN)rrrrr!r'r*r )r rr r ÚProxiedTransport_PY2:s r+cs&eZdZ‡fdd„Z‡‡fdd„ZdS)z.ProxiedTransport..ProxiedTransport_PY3cs$ˆ|ƒ|_|jjs ˆd|ƒ|_dS)Nzhttp://)rr)rr)rr r ras z8ProxiedTransport..ProxiedTransport_PY3.set_proxycsJˆ|ƒj}|stj}|dkr$ˆj}nˆj}||jj|jjƒ}| |¡|S)Nr)rr rrrrrÚ set_tunnel)rrrrr$)r rr r r!gs  z>ProxiedTransport..ProxiedTransport_PY3.make_connectionN)rrrrr!r )r rr r ÚProxiedTransport_PY3`s r-) rrrr rÚ TransportÚ urllib.parseÚ http.clientr)r+r-r )r rr ÚProxiedTransport4s   r1c@s\eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dS)Ú kestrelAMPLcCs | ¡dS)N)Úsetup_connection)rr r r Ú__init__~szkestrelAMPL.__init__c CsÞtj dtj dd¡¡}tjdkr:tj dtj d|¡¡}d}|rRtƒ}| |¡tjdtjtj tj f|d|_ t   d ¡y|j  ¡}t   d ¡WnDtjtjtfk rØt ¡d }d|_ t   d ¡t  d ¡YnXdS)NZ http_proxyZ HTTP_PROXYÚrZ https_proxyZ HTTPS_PROXYz %s://%s:%s)Ú transportz"Connecting to the NEOS server ... zOK.ézFail.z!NEOS is temporarily unavailable. )ÚosÚenvironÚgetr rr1rrÚ ServerProxyrrÚneosÚloggerÚinfoZpingÚsocketÚerrorÚ ProtocolErrorrÚsysÚexc_infoÚwarning)rrr6ÚresultÚer r r r3s.         zkestrelAMPL.setup_connectioncCstj t ¡dt d¡¡S)Nz at%s.jobsZampl_id)r8ÚpathÚjoinÚtempfileÚ gettempdirÚgetenv)rr r r rIŸszkestrelAMPL.tempfilecCs|j t|¡}t |¡dS)N)r<ZkillJobÚ jobNumberr=r>)rZ jobnumberÚpasswordÚresponser r r Úkill¢szkestrelAMPL.killcCsT|jdkrgSd}x8|dkrJy |j d¡Stjk rF|d7}YqXqWgSdS)NréÚkestrelr7)r<ÚlistSolversInCategoryr?Útimeout)rÚattemptr r r Úsolvers¦s   zkestrelAMPL.solverscCs`|j ||¡}t|tjƒr |j}|dd…dkr<|dd…}t|ddƒ}| |¡| ¡dS)Néüÿÿÿz.solÚwb) r<ZgetFinalResultsÚ isinstancerÚBinaryÚdataÚopenÚwriteÚclose)rÚstubrLrMÚresultsZsolfiler r r Úretrieve²s   zkestrelAMPL.retrievecCs x dD]}t |¡}|dk rPqWt t ¡¡}d||f}|j ||d¡\}}|dkrftd|fƒ‚t  d||f¡t  d¡t  dt j ||f¡||fS) N)ÚLOGNAMEÚUSERÚUSERNAMEz%s on %srQrz%s Job not submittedz(Job %d submitted to NEOS, password='%s' z.Check the following URL for progress report : z]%s://www.neos-server.org/neos/cgi-bin/nph-neos-solver.cgi?admin=results&jobnumber=%d&pass=%s ) r8rKr?ÚgetfqdnÚ gethostnamer<Z submitJobÚ RuntimeErrorr=r>r r)rÚxmlÚ_ÚunamerÚuserrLrMr r r ÚsubmitÀs      zkestrelAMPL.submitcCsfd}d}t d¡}|dk r^t d|tj¡}|r>t| ¡dƒ}t d|tj¡}|r^| ¡d}||fS)zl If kestrel_options is set to job/password, then return the job and password values rr5Úkestrel_optionsNzjob\s*=\s*(\d+)zpassword\s*=\s*(\S+))r8rKÚreÚsearchÚ IGNORECASEÚintÚgroups)rrLrMÚoptionsÚmr r r ÚgetJobAndPasswordØs  zkestrelAMPL.getJobAndPasswordcCs|j d¡}g}x0|D](}| d¡}|dkr| |d|…¡qWd|_dtjkr`t d¡|_ndtjkrvt d¡|_|jdk rät  d|jtj ¡}d}|rä|  ¡d}x"|D]}|  ¡|  ¡kr¬|}Pq¬W|sät d|d  |¡fƒ‚|jdksø|dkrt d|d  |¡fƒ‚|S) zÍ Read in the kestrel_options to pick out the solver name. The tricky parts: we don't want to be case sensitive, but NEOS is. we need to read in options variable rQz:AMPLrNrlZKESTREL_OPTIONSzsolver\s*=*\s*(\S+)z.%s is not available on NEOS. Choose from: %sz )r<rRÚfindÚappendrrr8r9rKrmrnrorqÚupperrfrH)rZallKestrelSolversZkestrelAmplSolversÚsÚirsZNEOS_solver_nameZ solver_namer r r Ú getSolverNameés:         zkestrelAMPL.getSolverNamecCs8| ¡}t ¡}tj |¡r8|dd…dkr8|dd…}t|ddƒ}tjd|d}|  |  ¡¡|  ¡|  ¡i}xjdD]b}t  |d|tj ¡r|t|d|dƒ}d } |  ¡} x| rÌ| | 7} |  ¡} q¶W|  ¡| ||<q|Wd } t d |j¡} | r d |  ¡d } d | ¡} d|}d }|tjkr:t |¡}n>| ¡tjkrZt | ¡¡}n| ¡tjkrxt | ¡¡}|d ks–| d| ¡|f7} tjr®t | ¡¡}nt | ¡¡ d¡}d|| | |f}x$|D]}|d||||f7}qØWx2dD]*}|tjkrþ|d|t |¡|f7}qþW|d7}|S)Néýÿÿÿz.nlÚrbrW)ÚmodeÚfileobj)ZadjÚcolÚenvZfixZspcÚrowZslcZunvÚ.Úrr5zpriority[\s=]+(\S+)z%s rzkestrel_options:solver=%s z %s_optionsz%s_options:%s zutf-8a kestrel %s AMPL %s %s %s z<%s> )Zkestrel_auxfilesZmip_prioritiesZobjective_precisionz )rzÚioÚBytesIOr8rGÚexistsr[ÚgzipÚGzipFiler\Úreadr]ÚaccessÚR_OKrmrnrrrqÚlowerr9rKrwrrÚbase64Ú encodestringÚgetvalueÚdecode)rr^ZsolverZzipped_nl_fileZnlfileZzipperZ ampl_filesÚkeyÚfÚvalÚbufÚpriorityrsZsolver_optionsZsolver_options_keyZsolver_options_valueZ nl_stringrgÚoptionr r r ÚformXMLsb           zkestrelAMPL.formXMLN) rrrr4r3rIrOrUr`rkrtrzr—r r r r r2|s *r2Ú__main__éz+kestrel should be called from inside AMPL. r7rUrQú rkZ kestproblemÚaz%d %s r`rƒzError, could not open file %s. zDid you use kestrelsub? z(\d+) ([a-zA-Z]+)Z kestresultzrestofstack: %s ÚwrOz8To kill a NEOS job, first set kestrel_options variable: z8 ampl: option kestrel_options "job=#### password=xxxx"; z-Keyboard Interrupt while submitting problem. ZRunningZWaitingézð Keyboard Interrupt Job is still running on remote machine To stop job: ampl: option kestrel_options "job=%d password=%s"; ampl: commands kestrelkill; To retrieve results: ampl: option kestrel_options "job=%d password=%s"; ampl: solve; )Er„r8rmrrBÚtimer?r‡rrIÚloggingZsix.moves.http_clientrZpyomo.common.dependenciesrr rÚ getLoggerr=Úobjectr r1r2rÚlenÚargvÚstdoutr\ÚexitrQÚsortedr<rRrxÚprintr—rgrkrLrMr[Zjobfiler]ÚIOErrorrCrFÚmatchÚreadlinersrprqr‰Z restofstackr`ÚunlinkrtrOr^ÚKeyboardInterruptÚsleepÚstatusÚoffsetZgetIntermediateResultsÚoutputrXrYrZZ getJobStatusÚmsgr r r r Ús´    H]