B Ÿ@`íBã@s.ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z dd„Z e de ddZ e dƒdZe  d¡Ze d ¡ZGd d „d eƒZd d „ZGdd„deƒZedkr*eejƒdkrêej d¡e d¡eƒZejddkr6x&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 5d e&e'¡e4rzej 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&se #e9¡Z$e %e$¡\Z&Z'Wn8e:k rHe ,¡dZ-ej d&¡e d¡YnXy–e ;d¡d'Ze&e'e=¡\Z?Z=e@e?e jAƒrœe?jBZ?ej e?¡ej Ce&e'¡Z.ProxiedTransport_PY2cs$ˆ|ƒ|_|jjs ˆd|ƒ|_dS)Nzhttp://)ÚproxyÚhostname)Úselfr)rrr Ú 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)Úhttplibrrr Úmake_connectionAs  z>ProxiedTransport..ProxiedTransport_PY2.make_connectioncSs| dd|j|f¡dS)NÚPOSTz%s%s)Ú putrequestr)rÚ connectionÚhandlerÚ request_bodyrrr Ú send_requestRsz;ProxiedTransport..ProxiedTransport_PY2.send_requestcSs| d|j¡dS)NÚHost)Ú putheaderr)rr$rrrr Ú send_hostVsz8ProxiedTransport..ProxiedTransport_PY2.send_hostN)rrrrr!r'r*r)r rrr ÚProxiedTransport_PY2:s r+cs&eZdZ‡fdd„Z‡‡fdd„ZdS)z.ProxiedTransport..ProxiedTransport_PY3cs$ˆ|ƒ|_|jjs ˆd|ƒ|_dS)Nzhttp://)rr)rr)rrr ras z8ProxiedTransport..ProxiedTransport_PY3.set_proxycsJˆ|ƒj}|stj}|dkr$ˆj}nˆj}||jj|jjƒ}| |¡|S)Nr)rr rrrrrÚ set_tunnel)rrrrr$)r rrr r!gs  z>ProxiedTransport..ProxiedTransport_PY3.make_connectionN)rrrrr!r)r rrr ÚProxiedTransport_PY3`s r-) rrrr rÚ TransportÚ urllib.parseÚ http.clientr)r+r-r)r rr ÚProxiedTransport4s   r1c@sleZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„ZdS)Ú kestrelAMPLcCs | ¡dS)N)Úsetup_connection)rrrr Ú__init__~szkestrelAMPL.__init__cCs|jdk r|j ¡dS)N)ÚneosÚ transportÚclose)rrrr Ú__del__s zkestrelAMPL.__del__c Cs tj dtj dd¡¡}tjdkr:tj dtj d|¡¡}|rTtƒ|_|j |¡n tjdkrjt  ¡|_n t  ¡|_tj dtjtj tj f|jd|_t d ¡y|j ¡}t d ¡WnLtjtjtjjjfk rt ¡d }d|_t d ¡t d ¡YnXdS)NZ http_proxyZ HTTP_PROXYÚrZ https_proxyZ HTTPS_PROXYz %s://%s:%s)r6z"Connecting to the NEOS server ... zOK.ézFail.z!NEOS is temporarily unavailable. )ÚosÚenvironÚgetr rr1r6rrÚ SafeTransportr.Ú ServerProxyrrr5ÚloggerÚinfoZpingÚsocketÚerrorÚ ProtocolErrorrÚmovesÚ http_clientÚ BadStatusLineÚsysÚexc_infoÚwarning)rrÚresultÚerrr r3s4            zkestrelAMPL.setup_connectioncCstj t ¡dt d¡¡S)Nz at%s.jobsZampl_id)r;ÚpathÚjoinÚtempfileÚ gettempdirÚgetenv)rrrr rO±szkestrelAMPL.tempfilecCs|j t|¡}t |¡dS)N)r5ZkillJobÚ jobNumberr@rA)rZ jobnumberÚpasswordÚresponserrr Úkill´szkestrelAMPL.killcCsT|jdkrgSd}x8|dkrJy |j d¡Stjk rF|d7}YqXqWgSdS)NréÚkestrelr:)r5ÚlistSolversInCategoryrBÚtimeout)rÚattemptrrr Úsolvers¸s   zkestrelAMPL.solverscCs`|j ||¡}t|tjƒr |j}|dd…dkr<|dd…}t|ddƒ}| |¡| ¡dS)Néüÿÿÿz.solÚwb) r5ZgetFinalResultsÚ isinstancerÚBinaryÚdataÚopenÚwriter7)rÚstubrRrSÚresultsZsolfilerrr ÚretrieveÄs   zkestrelAMPL.retrievecCsl| ¡}|j ||d¡\}}|dkr2td|fƒ‚t d||f¡t d¡t dtj||f¡||fS)NrWrz%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 )ÚgetEmailAddressr5Z submitJobÚ RuntimeErrorr@rAr r)rÚxmlÚuserrRrSrrr ÚsubmitÑs  zkestrelAMPL.submitcCs(tj dd¡}t |¡r|Stdƒ‚dS)NZ NEOS_EMAILr9zVNEOS requires a valid email address. Please set the 'NEOS_EMAIL' environment variable.)r;r<r=Ú _email_reÚmatchrg)rÚemailrrr rfäs  zkestrelAMPL.getEmailAddresscCsfd}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 rr9Úkestrel_optionsNzjob\s*=\s*(\d+)zpassword\s*=\s*(\S+))r;rQÚreÚsearchÚ IGNORECASEÚintÚgroups)rrRrSÚoptionsÚmrrr Ú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 rWz:AMPLrNrnZKESTREL_OPTIONSzsolver\s*=*\s*(\S+)z.%s is not available on NEOS. Choose from: %sz )r5rXÚfindÚappendrtr;r<rQrorprqrsÚupperrgrN)rZallKestrelSolversZkestrelAmplSolversÚsÚiruZNEOS_solver_nameZ solver_namerrr Ú getSolverNames:         zkestrelAMPL.getSolverNamecCs>| ¡}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}qW|d7}|S)Néýÿÿÿz.nlÚrbr])ÚmodeÚfileobj)ZadjÚcolÚenvZfixZspcÚrowZslcZunvÚ.Úrr9zpriority[\s=]+(\S+)z%s rzkestrel_options:solver=%s z %s_optionsz%s_options:%s zutf-8a' kestrel %s %s AMPL %s %s %s z<%s> )Zkestrel_auxfilesZmip_prioritiesZobjective_precisionz )r|ÚioÚBytesIOr;rMÚexistsrar ÚGzipFilerbÚreadr7ÚaccessÚR_OKrorprtrsÚlowerr<rQryrrÚbase64Ú encodestringÚgetvalueÚ encodebytesÚdecoderf)rrcZsolverZzipped_nl_fileZnlfileZzipperZ ampl_filesÚkeyÚfÚvalÚbufÚpriorityruZsolver_optionsZsolver_options_keyZsolver_options_valueZ nl_stringrhÚoptionrrr ÚformXML*sd            zkestrelAMPL.formXMLN)rrrr4r8r3rOrUr[rerjrfrvr|r™rrrr r2|s"   *r2Ú__main__éz+kestrel should be called from inside AMPL. r:r[rWú rjZ kestproblemÚaz%d %s rer…zError, could not open file %s. zDid you use kestrelsub? z(\d+) ([a-zA-Z]+)Z kestresultzrestofstack: %s ÚwrUz8To 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†r;rorrHÚtimerBrŽrOÚloggingZpyomo.common.dependenciesrr rr Ú getLoggerr@ÚcompilerkÚobjectr r1r2rÚlenÚargvÚstdoutrbÚexitrWÚsortedr5rXrzÚprintr™rhrjrRrSraZjobfiler7ÚIOErrorrIrLrlÚreadlinerurrrsrŠZ restofstackreÚunlinkrvrUrcÚKeyboardInterruptÚsleepÚstatusÚoffsetZgetIntermediateResultsÚoutputr^r_r`Z getJobStatusÚmsgrrrr Ús´     Hv