src/HOL/Tools/Sledgehammer/MaSh/src/mash.py
author blanchet
Tue, 20 Aug 2013 14:36:22 +0200
changeset 53100 1133b9e83f09
parent 50951 e1cbaa7d5536
child 53115 e08a58161bf1
permissions -rwxr-xr-x
new version of MaSh tool -- experimental server
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
     1
#!/usr/bin/env python
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
     2
#     Title:      HOL/Tools/Sledgehammer/MaSh/src/mash
50222
40e3c3be6bca added file headers
blanchet
parents: 50220
diff changeset
     3
#     Author:     Daniel Kuehlwein, ICIS, Radboud University Nijmegen
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
     4
#     Copyright   2012 - 2013
50222
40e3c3be6bca added file headers
blanchet
parents: 50220
diff changeset
     5
#
40e3c3be6bca added file headers
blanchet
parents: 50220
diff changeset
     6
# Entry point for MaSh (Machine Learning for Sledgehammer).
40e3c3be6bca added file headers
blanchet
parents: 50220
diff changeset
     7
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
     8
'''
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
     9
MaSh - Machine Learning for Sledgehammer
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    10
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    11
MaSh allows to use different machine learning algorithms to predict relevant fact for Sledgehammer.
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    12
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    13
Created on July 12, 2012
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    14
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    15
@author: Daniel Kuehlwein
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    16
'''
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    17
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    18
import socket,sys,time,logging
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    19
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    20
from spawnDaemon import spawnDaemon
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    21
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    22
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    23
import logging,string,os,sys
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    24
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    25
50619
b958a94cf811 new version of MaSh, with theory-level reasoning
blanchet
parents: 50482
diff changeset
    26
from theoryStats import TheoryStatistics
b958a94cf811 new version of MaSh, with theory-level reasoning
blanchet
parents: 50482
diff changeset
    27
from theoryModels import TheoryModels
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    28
from dictionaries import Dictionaries
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    29
from predefined import Predefined
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    30
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    31
from parameters import init_parser
50840
a5cc092156da new version of MaSh Python component
blanchet
parents: 50827
diff changeset
    32
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    33
def communicate(data,host,port):
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    34
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    35
    try:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    36
        sock.connect((host,port))
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    37
        sock.sendall(data)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    38
        received = sock.recv(262144)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    39
    except:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    40
        logger = logging.getLogger('communicate')
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    41
        logger.warning('Communication with server failed.')
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    42
        received = -1
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    43
    finally:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    44
        sock.close()    
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    45
    return received
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    46
50951
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    47
def mash(argv = sys.argv[1:]):
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    48
    # Initializing command-line arguments
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    49
    args = init_parser(argv)
50951
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    50
    
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
    51
    # Set up logging
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    52
    logging.basicConfig(level=logging.DEBUG,
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    53
                        format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    54
                        datefmt='%d-%m %H:%M:%S',
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    55
                        filename=args.log,
50951
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    56
                        filemode='w')    
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    57
    logger = logging.getLogger('mash')
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    58
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    59
    if args.quiet:
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    60
        logger.setLevel(logging.WARNING)
50951
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    61
        #console.setLevel(logging.WARNING)
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    62
    else:
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    63
        console = logging.StreamHandler(sys.stdout)
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    64
        console.setLevel(logging.INFO)
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    65
        formatter = logging.Formatter('# %(message)s')
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    66
        console.setFormatter(formatter)
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    67
        logging.getLogger('').addHandler(console)
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    68
        
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    69
    if not os.path.exists(args.outputDir):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    70
        os.makedirs(args.outputDir)
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    71
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    72
    # If server is not running, start it.
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    73
    try:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    74
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    75
        sock.connect((args.host,args.port))       
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    76
        sock.close()
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    77
    except:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    78
        logger.info('Starting Server.')
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    79
        spawnDaemon('server.py')
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    80
        # TODO: Make this fault tolerant
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    81
        time.sleep(0.5)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    82
        # Init server
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    83
        data = "i "+";".join(argv)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    84
        received = communicate(data,args.host,args.port)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    85
        logger.info(received)     
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    86
    
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    87
    if args.inputFile == None:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    88
        return
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    89
    logger.debug('Using the following settings: %s',args)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    90
    # IO Streams
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    91
    OS = open(args.predictions,'w')
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    92
    IS = open(args.inputFile,'r')
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    93
    count = 0
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    94
    for line in IS:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    95
        count += 1
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    96
        #if count == 127:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    97
        #    break as       
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    98
        received = communicate(line,args.host,args.port)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
    99
        if not received == '':
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   100
            OS.write('%s\n' % received)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   101
        #logger.info(received)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   102
    OS.close()
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   103
    IS.close()
50619
b958a94cf811 new version of MaSh, with theory-level reasoning
blanchet
parents: 50482
diff changeset
   104
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   105
    # Statistics
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   106
    if args.statistics:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   107
        received = communicate('avgStats',args.host,args.port)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   108
        logger.info(received)
50827
aba769dc82e9 updated MaSh Python component
blanchet
parents: 50619
diff changeset
   109
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   110
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   111
if __name__ == "__main__":
50951
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
   112
    sys.exit(mash())