B u `n>ã@s"ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z dd„Z e de ddZ e dƒdZe  d¡ZGd d „d eƒZd d „ZGd d„dƒZedkreejƒdkrÞej d¡e d¡eƒZejddkr*x&eej d¡ƒD]Ze 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' -¡¡Z.e.re/e. 0¡dƒZ$e. 0¡dZ%e' 1¡Z2e' (¡e 3de$e%¡e2rnej d e2¡e&e ¡d!ƒZ'e' e2¡e' (¡ne 4e ¡¡nžejdd"krÌe 5¡\Z$Z%e$r°e 6e$e%¡nej d#¡ej d$¡nRy8ejdZ7e 5¡\Z$Z%e$se !e7¡Z"e #e"¡\Z$Z%Wn8e8k r<e *¡dZ+ej d%¡e d¡YnXy–e 9d¡d&Z:dZ;xfe:d&kshe:d'kr¸ej e=e j?ƒre=j@Z=ej e=¡ej Ae$e%¡Z:e 9d(¡qTWe 3e7e$e%¡e d¡WnHe8k re *¡dZ+d)e$e%e$e%fZBej eB¡e d¡YnXdS)*éN)Úattempt_importcCs tjrddl}n ddlm}|S)Nr)ÚsixÚPY2Ú xmlrpclibÚ xmlrpc.clientÚclient)r©rú6/tmp/pip-unpacked-wheel-n62dbgi3/pyomo/neos/kestrel.pyÚ_xmlrpclib_importers  r r)ÚimporterÚgzipz pyomo.neosc@seZdZdZdZdZdS)ÚNEOSÚhttpszneos-server.orgZ3333N)Ú__name__Ú __module__Ú __qualname__ÚschemeÚhostÚportrrrr r )sr csrtjr8ddlm‰ddl‰G‡‡fdd„dtjƒ}|ƒSddlm‰ddlm‰G‡‡fdd„dtjƒ}|ƒSdS)Nr)Úurlparsecs6eZdZ‡fdd„Z‡‡fdd„Zdd„Zdd„Zd S) z.ProxiedTransport..ProxiedTransport_PY2cs$ˆ|ƒ|_|jjs ˆd|ƒ|_dS)Nzhttp://)ÚproxyÚhostname)Úselfr)rrr Ú set_proxy9s 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_connection?s  z>ProxiedTransport..ProxiedTransport_PY2.make_connectioncSs| dd|j|f¡dS)NÚPOSTz%s%s)Ú putrequestr)rÚ connectionÚhandlerÚ request_bodyrrr Ú send_requestPsz;ProxiedTransport..ProxiedTransport_PY2.send_requestcSs| d|j¡dS)NÚHost)Ú putheaderr)rr$rrrr Ú send_hostTsz8ProxiedTransport..ProxiedTransport_PY2.send_hostN)rrrrr!r'r*r)r rrr ÚProxiedTransport_PY28s r+cs&eZdZ‡fdd„Z‡‡fdd„ZdS)z.ProxiedTransport..ProxiedTransport_PY3cs$ˆ|ƒ|_|jjs ˆd|ƒ|_dS)Nzhttp://)rr)rr)rrr r_s z8ProxiedTransport..ProxiedTransport_PY3.set_proxycsJˆ|ƒj}|stj}|dkr$ˆj}nˆj}||jj|jjƒ}| |¡|S)Nr)rr rrrrrÚ set_tunnel)rrrrr$)r rrr r!es  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 ÚProxiedTransport2s   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)rrrr Ú__init__|szkestrelAMPL.__init__c Csätj dtj dd¡¡}tjdkr:tj dtj d|¡¡}d}|rRtƒ}| |¡tjdtjtj tj f|d|_ t   d ¡y|j  ¡}t   d ¡WnJtjtjtjjjfk 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ÚmovesÚ http_clientÚ BadStatusLineÚsysÚexc_infoÚwarning)rrr6ÚresultÚerrr r3s0          zkestrelAMPL.setup_connectioncCstj t ¡dt d¡¡S)Nz at%s.jobsZampl_id)r8ÚpathÚjoinÚtempfileÚ gettempdirÚgetenv)rrrr rLžszkestrelAMPL.tempfilecCs|j t|¡}t |¡dS)N)r<ZkillJobÚ jobNumberr=r>)rZ jobnumberÚpasswordÚresponserrr Úkill¡szkestrelAMPL.killcCsT|jdkrgSd}x8|dkrJy |j d¡Stjk rF|d7}YqXqWgSdS)NréÚkestrelr7)r<ÚlistSolversInCategoryr?Útimeout)rÚattemptrrr Ú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ÚstubrOrPÚresultsZsolfilerrr Ú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 %srTrz%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 ) r8rNr?ÚgetfqdnÚ gethostnamer<Z submitJobÚ RuntimeErrorr=r>r r)rÚxmlÚ_ÚunamerÚuserrOrPrrr Ú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+))r8rNÚreÚsearchÚ IGNORECASEÚintÚgroups)rrOrPÚ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 rTz:AMPLrNroZKESTREL_OPTIONSzsolver\s*=*\s*(\S+)z.%s is not available on NEOS. Choose from: %sz )r<rUÚfindÚappendrur8r9rNrprqrrrtÚupperrirK)rZallKestrelSolversZkestrelAmplSolversÚsÚirvZNEOS_solver_nameZ solver_namerrr Ú 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ÚrbrZ)Ú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 )r}ÚioÚBytesIOr8rJÚexistsr^r ÚGzipFiler_Úreadr`ÚaccessÚR_OKrprqrurtÚlowerr9rNrzrrÚbase64Ú encodestringÚgetvalueÚ encodebytesÚdecode)rraZsolverZzipped_nl_fileZnlfileZzipperZ ampl_filesÚkeyÚfÚvalÚbufÚpriorityrvZsolver_optionsZsolver_options_keyZsolver_options_valueZ nl_stringrjÚoptionrrr ÚformXMLsb           zkestrelAMPL.formXMLN) rrrr4r3rLrRrXrcrnrwr}ršrrrr r2zs *r2Ú__main__éz+kestrel should be called from inside AMPL. r7rXrTú rnZ kestproblemÚaz%d %s rcr†zError, could not open file %s. zDid you use kestrelsub? z(\d+) ([a-zA-Z]+)Z kestresultzrestofstack: %s ÚwrRz8To 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; )Cr‡r8rprrEÚtimer?rrLÚloggingZpyomo.common.dependenciesrr rr Ú getLoggerr=Úobjectr r1r2rÚlenÚargvÚstdoutr_ÚexitrTÚsortedr<rUr{ÚprintršrjrnrOrPr^Zjobfiler`ÚIOErrorrFrIÚmatchÚreadlinervrsrtr‹Z restofstackrcÚunlinkrwrRraÚKeyboardInterruptÚsleepÚstatusÚoffsetZgetIntermediateResultsÚoutputr[r\r]Z getJobStatusÚmsgrrrr Ús²    H^