src/HOL/Library/Sum_of_Squares/neos_csdp_client
changeset 58630 71cdb885b3bb
parent 58629 a6a6cd499d4e
child 58631 41333b45bff9
equal deleted inserted replaced
58629:a6a6cd499d4e 58630:71cdb885b3bb
     1 #!/usr/bin/env python
       
     2 import sys
       
     3 import signal
       
     4 import xmlrpclib
       
     5 import time
       
     6 import re
       
     7 import os
       
     8 
       
     9 # Neos server config
       
    10 neos = xmlrpclib.Server(os.getenv("ISABELLE_NEOS_SERVER"))
       
    11 
       
    12 jobNumber = 0
       
    13 password = ""
       
    14 inputfile = None
       
    15 outputfile = None
       
    16 # interrupt handler
       
    17 def cleanup(signal, frame):
       
    18   sys.stdout.write("Caught interrupt, cleaning up\n")
       
    19   if jobNumber != 0:
       
    20     neos.killJob(jobNumber, password)
       
    21   if inputfile != None:
       
    22     inputfile.close()
       
    23   if outputfile != None:
       
    24     outputfile.close()
       
    25   sys.exit(21)
       
    26 
       
    27 signal.signal(signal.SIGHUP, cleanup)
       
    28 signal.signal(signal.SIGINT, cleanup)
       
    29 signal.signal(signal.SIGQUIT, cleanup)
       
    30 signal.signal(signal.SIGTERM, cleanup)
       
    31 
       
    32 if len(sys.argv) <> 3:
       
    33   sys.stderr.write("Usage: neos_csdp_client <input_filename> <output_filename>\n")
       
    34   sys.exit(19)
       
    35 
       
    36 xml_pre = "<document>\n<category>sdp</category>\n<solver>csdp</solver>\n<inputMethod>SPARSE_SDPA</inputMethod>\n<dat><![CDATA["
       
    37 xml_post = "]]></dat>\n</document>\n"
       
    38 xml = xml_pre
       
    39 inputfile = open(sys.argv[1],"r")
       
    40 buffer = 1
       
    41 while buffer:
       
    42   buffer = inputfile.read()
       
    43   xml += buffer
       
    44 inputfile.close()
       
    45 xml += xml_post
       
    46 
       
    47 (jobNumber,password) = neos.submitJob(xml)
       
    48 
       
    49 if jobNumber == 0:
       
    50   sys.stdout.write("error submitting job: %s" % password)
       
    51   sys.exit(20)
       
    52 else:
       
    53   sys.stdout.write("jobNumber = %d\tpassword = %s\n" % (jobNumber,password))
       
    54 
       
    55 offset=0
       
    56 messages = ""
       
    57 status="Waiting"
       
    58 while status == "Running" or status=="Waiting":
       
    59   time.sleep(1)
       
    60   (msg,offset) = neos.getIntermediateResults(jobNumber,password,offset)
       
    61   messages += msg.data
       
    62   sys.stdout.write(msg.data)
       
    63   status = neos.getJobStatus(jobNumber, password)
       
    64 
       
    65 msg = neos.getFinalResults(jobNumber, password).data
       
    66 sys.stdout.write("---------- Begin CSDP Output -------------\n");
       
    67 sys.stdout.write(msg)
       
    68 
       
    69 # extract solution
       
    70 result = msg.split("Solution:")
       
    71 if len(result) > 1:
       
    72   solution = result[1].strip()
       
    73   if solution != "":
       
    74     outputfile = open(sys.argv[2],"w")
       
    75     outputfile.write(solution)
       
    76     outputfile.close()
       
    77 
       
    78 # extract return code
       
    79 p = re.compile(r"^Error: Command exited with non-zero status (\d+)$", re.MULTILINE)
       
    80 m = p.search(messages)
       
    81 if m:
       
    82   sys.exit(int(m.group(1)))
       
    83 else:
       
    84   sys.exit(0)
       
    85