src/HOL/Tools/Sledgehammer/MaSh/src/server.py
author hoelzl
Wed, 09 Apr 2014 09:37:49 +0200
changeset 56481 47500d0881f9
parent 54432 68f8bd1641da
child 57124 e4c2c792226f
permissions -rwxr-xr-x
add divide_simps
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
     1
#!/usr/bin/env python
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
     2
#     Title:      HOL/Tools/Sledgehammer/MaSh/src/server.py
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
     3
#     Author:     Daniel Kuehlwein, ICIS, Radboud University Nijmegen
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
     4
#     Copyright   2013
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
     5
#
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
     6
# The MaSh Server.
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
     7
54011
427b77238746 new version of MaSh that really honors the --port option and that checks for file name mismatches
blanchet
parents: 53957
diff changeset
     8
import SocketServer,os,string,logging,sys
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
     9
from multiprocessing import Manager
53555
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    10
from threading import Timer
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    11
from time import time
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    12
from dictionaries import Dictionaries
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    13
from parameters import init_parser
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    14
from sparseNaiveBayes import sparseNBClassifier
53555
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    15
from KNN import KNN,euclidean
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    16
from KNNs import KNNAdaptPointFeatures,KNNUrban
54432
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    17
#from bayesPlusMetric import sparseNBPlusClassifier
53555
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    18
from predefined import Predefined
53789
8d9f4e89d8c8 new version of MaSh program, with proper shutdown
blanchet
parents: 53557
diff changeset
    19
from ExpandFeatures import ExpandFeatures
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    20
from stats import Statistics
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    21
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    22
54056
8298976acb54 more robustness in MaSh
blanchet
parents: 54011
diff changeset
    23
class ThreadingTCPServer(SocketServer.ThreadingTCPServer):
8298976acb54 more robustness in MaSh
blanchet
parents: 54011
diff changeset
    24
    
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    25
    def __init__(self, *args, **kwargs):
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    26
        SocketServer.ThreadingTCPServer.__init__(self,*args, **kwargs)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    27
        self.manager = Manager()
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    28
        self.lock = Manager().Lock()
53555
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    29
        self.idle_timeout = 28800.0 # 8 hours in seconds
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    30
        self.idle_timer = Timer(self.idle_timeout, self.shutdown)
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    31
        self.idle_timer.start()        
54056
8298976acb54 more robustness in MaSh
blanchet
parents: 54011
diff changeset
    32
        self.model = None
8298976acb54 more robustness in MaSh
blanchet
parents: 54011
diff changeset
    33
        self.dicts = None
8298976acb54 more robustness in MaSh
blanchet
parents: 54011
diff changeset
    34
        self.callCounter = 0
53555
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    35
        
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    36
    def save(self):
54056
8298976acb54 more robustness in MaSh
blanchet
parents: 54011
diff changeset
    37
        if self.model == None or self.dicts == None:
8298976acb54 more robustness in MaSh
blanchet
parents: 54011
diff changeset
    38
            try:
8298976acb54 more robustness in MaSh
blanchet
parents: 54011
diff changeset
    39
                self.logger.warning('Cannot save nonexisting models.')
8298976acb54 more robustness in MaSh
blanchet
parents: 54011
diff changeset
    40
            except:
8298976acb54 more robustness in MaSh
blanchet
parents: 54011
diff changeset
    41
                pass
8298976acb54 more robustness in MaSh
blanchet
parents: 54011
diff changeset
    42
            return
53555
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    43
        # Save Models
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    44
        self.model.save(self.args.modelFile)
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    45
        self.dicts.save(self.args.dictsFile)
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    46
        if not self.args.saveStats == None:
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    47
            statsFile = os.path.join(self.args.outputDir,self.args.saveStats)
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    48
            self.stats.save(statsFile)   
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    49
               
53789
8d9f4e89d8c8 new version of MaSh program, with proper shutdown
blanchet
parents: 53557
diff changeset
    50
    def save_and_shutdown(self): 
53555
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    51
        self.save()          
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    52
        self.shutdown()
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    53
54144
0fadd32e8d50 accept very long lines in MaSh
blanchet
parents: 54079
diff changeset
    54
class MaShHandler(SocketServer.StreamRequestHandler):
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    55
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    56
    def init(self,argv):
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    57
        if argv == '':
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    58
            self.server.args = init_parser([])
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    59
        else:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    60
            argv = argv.split(';')
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    61
            self.server.args = init_parser(argv)
54432
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    62
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    63
        # Set up logging
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    64
        logging.basicConfig(level=logging.DEBUG,
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    65
                            format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    66
                            datefmt='%d-%m %H:%M:%S',
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    67
                            filename=self.server.args.log+'server',
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    68
                            filemode='w')    
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    69
        self.server.logger = logging.getLogger('server')
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    70
            
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    71
        # Load all data
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    72
        self.server.dicts = Dictionaries()
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    73
        if os.path.isfile(self.server.args.dictsFile):
54432
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    74
            self.server.dicts.load(self.server.args.dictsFile)
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    75
        #elif not self.server.args.dictsFile == '../tmp/dict.pickle':
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    76
        #    raise IOError('Cannot find dictsFile at %s '% self.server.args.dictsFile)        
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    77
        elif self.server.args.init:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    78
            self.server.dicts.init_all(self.server.args)
53555
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    79
        # Pick model
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    80
        if self.server.args.algorithm == 'nb':
54432
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    81
            ###TODO: !! 
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    82
            self.server.model = sparseNBClassifier(self.server.args.NBDefaultPriorWeight,self.server.args.NBPosWeight,self.server.args.NBDefVal)            
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    83
            #self.server.model = sparseNBPlusClassifier(self.server.args.NBDefaultPriorWeight,self.server.args.NBPosWeight,self.server.args.NBDefVal)
53555
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    84
        elif self.server.args.algorithm == 'KNN':
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    85
            #self.server.model = KNN(self.server.dicts)
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    86
            self.server.model = KNNAdaptPointFeatures(self.server.dicts)
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    87
        elif self.server.args.algorithm == 'predef':
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    88
            self.server.model = Predefined(self.server.args.predef)
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    89
        else: # Default case
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
    90
            self.server.model = sparseNBClassifier(self.server.args.NBDefaultPriorWeight,self.server.args.NBPosWeight,self.server.args.NBDefVal)
53789
8d9f4e89d8c8 new version of MaSh program, with proper shutdown
blanchet
parents: 53557
diff changeset
    91
        if self.server.args.expandFeatures:
8d9f4e89d8c8 new version of MaSh program, with proper shutdown
blanchet
parents: 53557
diff changeset
    92
            self.server.expandFeatures = ExpandFeatures(self.server.dicts)
8d9f4e89d8c8 new version of MaSh program, with proper shutdown
blanchet
parents: 53557
diff changeset
    93
            self.server.expandFeatures.initialize(self.server.dicts)
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    94
        # Create Model
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    95
        if os.path.isfile(self.server.args.modelFile):
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    96
            self.server.model.load(self.server.args.modelFile)          
54432
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    97
        #elif not self.server.args.modelFile == '../tmp/model.pickle':
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
    98
        #    raise IOError('Cannot find modelFile at %s '% self.server.args.modelFile)        
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
    99
        elif self.server.args.init:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   100
            trainData = self.server.dicts.featureDict.keys()
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   101
            self.server.model.initializeModel(trainData,self.server.dicts)
53555
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
   102
           
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   103
        if self.server.args.statistics:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   104
            self.server.stats = Statistics(self.server.args.cutOff)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   105
            self.server.statementCounter = 1
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   106
            self.server.computeStats = False
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   107
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   108
        self.server.logger.debug('Initialized in '+str(round(time()-self.startTime,2))+' seconds.')
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   109
        self.request.sendall('Server initialized in '+str(round(time()-self.startTime,2))+' seconds.')
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   110
        self.server.callCounter = 1
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   111
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   112
    def update(self):
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   113
        problemId = self.server.dicts.parse_fact(self.data)    
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   114
        # Statistics
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   115
        if self.server.args.statistics and self.server.computeStats:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   116
            self.server.computeStats = False
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   117
            # Assume '!' comes after '?'
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   118
            if self.server.args.algorithm == 'predef':
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   119
                self.server.predictions = self.server.model.predict(problemId)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   120
            self.server.stats.update(self.server.predictions,self.server.dicts.dependenciesDict[problemId],self.server.statementCounter)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   121
            if not self.server.stats.badPreds == []:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   122
                bp = string.join([str(self.server.dicts.idNameDict[x]) for x in self.server.stats.badPreds], ',')
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   123
                self.server.logger.debug('Poor predictions: %s',bp)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   124
            self.server.statementCounter += 1
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   125
53789
8d9f4e89d8c8 new version of MaSh program, with proper shutdown
blanchet
parents: 53557
diff changeset
   126
        if self.server.args.expandFeatures:
8d9f4e89d8c8 new version of MaSh program, with proper shutdown
blanchet
parents: 53557
diff changeset
   127
            self.server.expandFeatures.update(self.server.dicts.featureDict[problemId],self.server.dicts.dependenciesDict[problemId])
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   128
        # Update Dependencies, p proves p
54432
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
   129
        if not problemId == 0:
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
   130
            self.server.dicts.dependenciesDict[problemId] = [problemId]+self.server.dicts.dependenciesDict[problemId]
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
   131
        ###TODO: 
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   132
        self.server.model.update(problemId,self.server.dicts.featureDict[problemId],self.server.dicts.dependenciesDict[problemId])
54432
68f8bd1641da have MaSh support nameless facts (i.e. proofs) and use that support
blanchet
parents: 54150
diff changeset
   133
        #self.server.model.update(problemId,self.server.dicts.featureDict[problemId],self.server.dicts.dependenciesDict[problemId],self.server.dicts)
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   134
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   135
    def overwrite(self):
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   136
        # Overwrite old proof.
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   137
        problemId,newDependencies = self.server.dicts.parse_overwrite(self.data)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   138
        newDependencies = [problemId]+newDependencies
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   139
        self.server.model.overwrite(problemId,newDependencies,self.server.dicts)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   140
        self.server.dicts.dependenciesDict[problemId] = newDependencies
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   141
        
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   142
    def predict(self):
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   143
        self.server.computeStats = True
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   144
        if self.server.args.algorithm == 'predef':
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   145
            return
53555
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
   146
        name,features,accessibles,hints,numberOfPredictions = self.server.dicts.parse_problem(self.data)
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   147
        if numberOfPredictions == None:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   148
            numberOfPredictions = self.server.args.numberOfPredictions
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   149
        if not hints == []:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   150
            self.server.model.update('hints',features,hints)
53789
8d9f4e89d8c8 new version of MaSh program, with proper shutdown
blanchet
parents: 53557
diff changeset
   151
        if self.server.args.expandFeatures:
8d9f4e89d8c8 new version of MaSh program, with proper shutdown
blanchet
parents: 53557
diff changeset
   152
            features = self.server.expandFeatures.expand(features)
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   153
        # Create predictions
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   154
        self.server.logger.debug('Starting computation for line %s',self.server.callCounter)
53555
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
   155
                
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
   156
        self.server.predictions,predictionValues = self.server.model.predict(features,accessibles,self.server.dicts)
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   157
        assert len(self.server.predictions) == len(predictionValues)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   158
        self.server.logger.debug('Time needed: '+str(round(time()-self.startTime,2)))
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   159
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   160
        # Output        
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   161
        predictionNames = [str(self.server.dicts.idNameDict[p]) for p in self.server.predictions[:numberOfPredictions]]
53555
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
   162
        #predictionValues = [str(x) for x in predictionValues[:numberOfPredictions]]
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
   163
        #predictionsStringList = ['%s=%s' % (predictionNames[i],predictionValues[i]) for i in range(len(predictionNames))]
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
   164
        #predictionsString = string.join(predictionsStringList,' ')
54079
cb33b304e743 handle huge MaSh requests gracefully
blanchet
parents: 54056
diff changeset
   165
        predictionsString = string.join(predictionNames,' ')        
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   166
        outString = '%s: %s' % (name,predictionsString)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   167
        self.request.sendall(outString)
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   168
    
53115
e08a58161bf1 new version of MaSh tool, with less broken server
blanchet
parents: 53100
diff changeset
   169
    def shutdown(self,saveModels=True):
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   170
        self.request.sendall('Shutting down server.')
53115
e08a58161bf1 new version of MaSh tool, with less broken server
blanchet
parents: 53100
diff changeset
   171
        if saveModels:
53555
12251bc889f1 new version of MaSh
blanchet
parents: 53135
diff changeset
   172
            self.server.save()
53789
8d9f4e89d8c8 new version of MaSh program, with proper shutdown
blanchet
parents: 53557
diff changeset
   173
        self.server.idle_timer.cancel()
8d9f4e89d8c8 new version of MaSh program, with proper shutdown
blanchet
parents: 53557
diff changeset
   174
        self.server.idle_timer = Timer(0.5, self.server.shutdown)
8d9f4e89d8c8 new version of MaSh program, with proper shutdown
blanchet
parents: 53557
diff changeset
   175
        self.server.idle_timer.start()    
8d9f4e89d8c8 new version of MaSh program, with proper shutdown
blanchet
parents: 53557
diff changeset
   176
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   177
    def handle(self):
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   178
        # self.request is the TCP socket connected to the client
53115
e08a58161bf1 new version of MaSh tool, with less broken server
blanchet
parents: 53100
diff changeset
   179
        self.server.lock.acquire()
54144
0fadd32e8d50 accept very long lines in MaSh
blanchet
parents: 54079
diff changeset
   180
        self.data = self.rfile.readline().strip()
53957
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   181
        try:
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   182
            # Update idle shutdown timer
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   183
            self.server.idle_timer.cancel()
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   184
            self.server.idle_timer = Timer(self.server.idle_timeout, self.server.save_and_shutdown)
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   185
            self.server.idle_timer.start()        
53789
8d9f4e89d8c8 new version of MaSh program, with proper shutdown
blanchet
parents: 53557
diff changeset
   186
54144
0fadd32e8d50 accept very long lines in MaSh
blanchet
parents: 54079
diff changeset
   187
            self.startTime = time()
53957
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   188
            if self.data == 'shutdown':
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   189
                self.shutdown()         
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   190
            elif self.data == 'save':
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   191
                self.server.save()       
54011
427b77238746 new version of MaSh that really honors the --port option and that checks for file name mismatches
blanchet
parents: 53957
diff changeset
   192
            elif self.data.startswith('ping'):
427b77238746 new version of MaSh that really honors the --port option and that checks for file name mismatches
blanchet
parents: 53957
diff changeset
   193
                mFile, dFile = self.data.split()[1:]
427b77238746 new version of MaSh that really honors the --port option and that checks for file name mismatches
blanchet
parents: 53957
diff changeset
   194
                if mFile == self.server.args.modelFile and dFile == self.server.args.dictsFile:
427b77238746 new version of MaSh that really honors the --port option and that checks for file name mismatches
blanchet
parents: 53957
diff changeset
   195
                    self.request.sendall('All good.')
427b77238746 new version of MaSh that really honors the --port option and that checks for file name mismatches
blanchet
parents: 53957
diff changeset
   196
                else:
427b77238746 new version of MaSh that really honors the --port option and that checks for file name mismatches
blanchet
parents: 53957
diff changeset
   197
                    self.request.sendall('Files do not match '+' '.join((self.server.args.modelFile,self.server.args.dictsFile)))
53957
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   198
            elif self.data.startswith('i'):            
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   199
                self.init(self.data[2:])
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   200
            elif self.data.startswith('!'):
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   201
                self.update()
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   202
            elif self.data.startswith('p'):
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   203
                self.overwrite()
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   204
            elif self.data.startswith('?'):               
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   205
                self.predict()
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   206
            elif self.data == '':
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   207
                # Empty Socket
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   208
                return
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   209
            elif self.data == 'avgStats':
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   210
                self.request.sendall(self.server.stats.printAvg())            
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   211
            else:
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   212
                self.request.sendall('Unspecified input format: \n%s',self.data)
54150
942bb9d9b7a8 MaSh error handling
blanchet
parents: 54144
diff changeset
   213
            self.server.callCounter += 1
942bb9d9b7a8 MaSh error handling
blanchet
parents: 54144
diff changeset
   214
            self.request.sendall('stop')                       
942bb9d9b7a8 MaSh error handling
blanchet
parents: 54144
diff changeset
   215
        except: # catch exceptions
942bb9d9b7a8 MaSh error handling
blanchet
parents: 54144
diff changeset
   216
            #print 'Caught an error. Check %s for more details' % (self.server.args.log+'server')
942bb9d9b7a8 MaSh error handling
blanchet
parents: 54144
diff changeset
   217
            logging.exception('')
53957
ce12e547e6bb fixed one line that would never have compiled in a typed language + release the lock in case of exceptions
blanchet
parents: 53789
diff changeset
   218
        finally:
53119
ac18480cbf9d new version of MaSh tool, with more server bugfixes
blanchet
parents: 53115
diff changeset
   219
            self.server.lock.release()
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   220
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   221
if __name__ == "__main__":
54056
8298976acb54 more robustness in MaSh
blanchet
parents: 54011
diff changeset
   222
    if not len(sys.argv[1:]) == 2:
8298976acb54 more robustness in MaSh
blanchet
parents: 54011
diff changeset
   223
        print 'No Arguments for HOST and PORT found. Using localhost and 9255'
8298976acb54 more robustness in MaSh
blanchet
parents: 54011
diff changeset
   224
        HOST, PORT = "localhost", 9255
8298976acb54 more robustness in MaSh
blanchet
parents: 54011
diff changeset
   225
    else:
8298976acb54 more robustness in MaSh
blanchet
parents: 54011
diff changeset
   226
        HOST, PORT = sys.argv[1:]
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   227
    SocketServer.TCPServer.allow_reuse_address = True
54011
427b77238746 new version of MaSh that really honors the --port option and that checks for file name mismatches
blanchet
parents: 53957
diff changeset
   228
    server = ThreadingTCPServer((HOST, int(PORT)), MaShHandler)
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   229
    server.serve_forever()        
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   230
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   231
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   232
    
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents:
diff changeset
   233
    
53789
8d9f4e89d8c8 new version of MaSh program, with proper shutdown
blanchet
parents: 53557
diff changeset
   234