src/HOL/Tools/Sledgehammer/MaSh/src/dictionaries.py
author blanchet
Tue, 20 Aug 2013 14:36:22 +0200
changeset 53100 1133b9e83f09
parent 50951 e1cbaa7d5536
child 53555 12251bc889f1
permissions -rw-r--r--
new version of MaSh tool -- experimental server
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50222
40e3c3be6bca added file headers
blanchet
parents: 50220
diff changeset
     1
#     Title:      HOL/Tools/Sledgehammer/MaSh/src/dictionaries.py
40e3c3be6bca added file headers
blanchet
parents: 50220
diff changeset
     2
#     Author:     Daniel Kuehlwein, ICIS, Radboud University Nijmegen
40e3c3be6bca added file headers
blanchet
parents: 50220
diff changeset
     3
#     Copyright   2012
40e3c3be6bca added file headers
blanchet
parents: 50220
diff changeset
     4
#
40e3c3be6bca added file headers
blanchet
parents: 50220
diff changeset
     5
# Persistent dictionaries: accessibility, dependencies, and features.
40e3c3be6bca added file headers
blanchet
parents: 50220
diff changeset
     6
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
     7
'''
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
     8
Created on Jul 12, 2012
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
     9
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    10
@author: daniel
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    11
'''
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
from os.path import join
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    14
from Queue import Queue
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    15
from readData import create_accessible_dict,create_dependencies_dict,create_feature_dict
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    16
from cPickle import load,dump
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    17
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    18
class Dictionaries(object):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    19
    '''
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    20
    This class contains all info about name-> id mapping, etc.
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    21
    '''
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    22
    def __init__(self):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    23
        '''
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    24
        Constructor
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    25
        '''
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    26
        self.nameIdDict = {}
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    27
        self.idNameDict = {}
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    28
        self.featureIdDict={}
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    29
        self.maxNameId = 0
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    30
        self.maxFeatureId = 0
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    31
        self.featureDict = {}
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    32
        self.dependenciesDict = {}
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    33
        self.accessibleDict = {}
50840
a5cc092156da new version of MaSh Python component
blanchet
parents: 50827
diff changeset
    34
        self.expandedAccessibles = {}
50951
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    35
        # For SInE features
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    36
        self.useSine = False
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    37
        self.featureCountDict = {} 
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    38
        self.triggerFeaturesDict = {} 
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    39
        self.featureTriggeredFormulasDict = {}
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    40
        self.changed = True
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
    41
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    42
    """
50951
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    43
    Init functions. nameIdDict, idNameDict, featureIdDict, articleDict get filled!
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
    44
    """
50951
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    45
    def init_featureDict(self,featureFile,sineFeatures):
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    46
        self.featureDict,self.maxNameId,self.maxFeatureId,self.featureCountDict,self.triggerFeaturesDict,self.featureTriggeredFormulasDict =\
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    47
         create_feature_dict(self.nameIdDict,self.idNameDict,self.maxNameId,self.featureIdDict,self.maxFeatureId,self.featureCountDict,\
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    48
                             self.triggerFeaturesDict,self.featureTriggeredFormulasDict,sineFeatures,featureFile)
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    49
    def init_dependenciesDict(self,depFile):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    50
        self.dependenciesDict = create_dependencies_dict(self.nameIdDict,depFile)
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    51
    def init_accessibleDict(self,accFile):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    52
        self.accessibleDict,self.maxNameId = create_accessible_dict(self.nameIdDict,self.idNameDict,self.maxNameId,accFile)
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
    53
50951
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    54
    def init_all(self,args):
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    55
        self.featureFileName = 'mash_features'
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    56
        self.accFileName = 'mash_accessibility'
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    57
        self.useSine = args.sineFeatures
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    58
        featureFile = join(args.inputDir,self.featureFileName)
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    59
        depFile = join(args.inputDir,args.depFile)
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    60
        accFile = join(args.inputDir,self.accFileName)
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    61
        self.init_featureDict(featureFile,self.useSine)
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    62
        self.init_accessibleDict(accFile)
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    63
        self.init_dependenciesDict(depFile)
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    64
        self.expandedAccessibles = {}
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    65
        self.changed = True
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
    66
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    67
    def get_name_id(self,name):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    68
        """
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    69
        Return the Id for a name.
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    70
        If it doesn't exist yet, a new entry is created.
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    71
        """
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    72
        if self.nameIdDict.has_key(name):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    73
            nameId = self.nameIdDict[name]
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    74
        else:
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    75
            self.nameIdDict[name] = self.maxNameId
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    76
            self.idNameDict[self.maxNameId] = name
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    77
            nameId = self.maxNameId
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
    78
            self.maxNameId += 1
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    79
            self.changed = True
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    80
        return nameId
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    81
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    82
    def add_feature(self,featureName):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    83
        if not self.featureIdDict.has_key(featureName):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    84
            self.featureIdDict[featureName] = self.maxFeatureId
50951
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    85
            if self.useSine:
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    86
                self.featureCountDict[self.maxFeatureId] = 0
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
    87
            self.maxFeatureId += 1
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
    88
            self.changed = True
50827
aba769dc82e9 updated MaSh Python component
blanchet
parents: 50619
diff changeset
    89
        fId = self.featureIdDict[featureName]
50951
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    90
        if self.useSine:
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
    91
            self.featureCountDict[fId] += 1
50827
aba769dc82e9 updated MaSh Python component
blanchet
parents: 50619
diff changeset
    92
        return fId
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
    93
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
    94
    def get_features(self,line):
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
    95
        # Feature Ids
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
    96
        featureNames = [f.strip() for f in line[1].split()]
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
    97
        features = []
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
    98
        for fn in featureNames:
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
    99
            tmp = fn.split('=')
50827
aba769dc82e9 updated MaSh Python component
blanchet
parents: 50619
diff changeset
   100
            weight = 1.0
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   101
            if len(tmp) == 2:
50827
aba769dc82e9 updated MaSh Python component
blanchet
parents: 50619
diff changeset
   102
                fn = tmp[0]
aba769dc82e9 updated MaSh Python component
blanchet
parents: 50619
diff changeset
   103
                weight = float(tmp[1])
aba769dc82e9 updated MaSh Python component
blanchet
parents: 50619
diff changeset
   104
            fId = self.add_feature(tmp[0])
aba769dc82e9 updated MaSh Python component
blanchet
parents: 50619
diff changeset
   105
            features.append((fId,weight))
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   106
        return features
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   107
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   108
    def expand_accessibles(self,acc):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   109
        accessibles = set(acc)
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   110
        unexpandedQueue = Queue()
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   111
        for a in acc:
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   112
            if self.expandedAccessibles.has_key(a):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   113
                accessibles = accessibles.union(self.expandedAccessibles[a])
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   114
            else:
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   115
                unexpandedQueue.put(a)
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   116
        while not unexpandedQueue.empty():
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   117
            nextUnExp = unexpandedQueue.get()
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   118
            nextUnExpAcc = self.accessibleDict[nextUnExp]
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   119
            for a in nextUnExpAcc:
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   120
                if not a in accessibles:
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   121
                    accessibles = accessibles.union([a])
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   122
                    if self.expandedAccessibles.has_key(a):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   123
                        accessibles = accessibles.union(self.expandedAccessibles[a])
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   124
                    else:
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   125
                        unexpandedQueue.put(a)
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   126
        return list(accessibles)
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   127
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   128
    def parse_fact(self,line):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   129
        """
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   130
        Parses a single line, extracting accessibles, features, and dependencies.
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   131
        """
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   132
        assert line.startswith('! ')
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   133
        line = line[2:]
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   134
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   135
        # line = name:accessibles;features;dependencies
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   136
        line = line.split(':')
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   137
        name = line[0].strip()
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   138
        nameId = self.get_name_id(name)
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   139
        line = line[1].split(';')
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   140
        # Accessible Ids
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   141
        unExpAcc = [self.nameIdDict[a.strip()] for a in line[0].split()]
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   142
        self.accessibleDict[nameId] = unExpAcc
50840
a5cc092156da new version of MaSh Python component
blanchet
parents: 50827
diff changeset
   143
        features = self.get_features(line)
a5cc092156da new version of MaSh Python component
blanchet
parents: 50827
diff changeset
   144
        self.featureDict[nameId] = features
50951
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
   145
        if self.useSine:
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
   146
            # SInE Features
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
   147
            minFeatureCount = min([self.featureCountDict[f] for f,_w in features])
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
   148
            triggerFeatures = [f for f,_w in features if self.featureCountDict[f] == minFeatureCount]
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
   149
            self.triggerFeaturesDict[nameId] = triggerFeatures
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
   150
            for f in triggerFeatures:
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
   151
                if self.featureTriggeredFormulasDict.has_key(f): 
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
   152
                    self.featureTriggeredFormulasDict[f].append(nameId)
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
   153
                else:
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
   154
                    self.featureTriggeredFormulasDict[f] = [nameId]        
50840
a5cc092156da new version of MaSh Python component
blanchet
parents: 50827
diff changeset
   155
        self.dependenciesDict[nameId] = [self.nameIdDict[d.strip()] for d in line[2].split()]        
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   156
        self.changed = True
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   157
        return nameId
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   158
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   159
    def parse_overwrite(self,line):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   160
        """
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   161
        Parses a single line, extracts the problemId and the Ids of the dependencies.
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   162
        """
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   163
        assert line.startswith('p ')
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   164
        line = line[2:]
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   165
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   166
        # line = name:dependencies
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   167
        line = line.split(':')
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   168
        name = line[0].strip()
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   169
        nameId = self.get_name_id(name)
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   170
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   171
        dependencies = [self.nameIdDict[d.strip()] for d in line[1].split()]
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   172
        self.changed = True
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   173
        return nameId,dependencies
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   174
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   175
    def parse_problem(self,line):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   176
        """
50827
aba769dc82e9 updated MaSh Python component
blanchet
parents: 50619
diff changeset
   177
        Parses a problem and returns the features, the accessibles, and any hints.
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   178
        """
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   179
        assert line.startswith('? ')
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   180
        line = line[2:]
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   181
        name = None
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   182
        numberOfPredictions = None
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   183
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   184
        # Check whether there is a problem name:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   185
        tmp = line.split('#')
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   186
        if len(tmp) == 2:
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   187
            numberOfPredictions = int(tmp[0].strip())
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   188
            line = tmp[1]
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   189
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   190
        # Check whether there is a problem name:
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   191
        tmp = line.split(':')
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   192
        if len(tmp) == 2:
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   193
            name = tmp[0].strip()
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   194
            line = tmp[1]
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   195
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   196
        # line = accessibles;features
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   197
        line = line.split(';')
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   198
        # Accessible Ids, expand and store the accessibles.
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   199
        unExpAcc = [self.nameIdDict[a.strip()] for a in line[0].split()]
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   200
        if len(self.expandedAccessibles.keys())>=100:
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   201
            self.expandedAccessibles = {}
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   202
            self.changed = True
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   203
        for accId in unExpAcc:
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   204
            if not self.expandedAccessibles.has_key(accId):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   205
                accIdAcc = self.accessibleDict[accId]
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   206
                self.expandedAccessibles[accId] = self.expand_accessibles(accIdAcc)
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   207
                self.changed = True
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   208
        accessibles = self.expand_accessibles(unExpAcc)
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   209
        features = self.get_features(line)
50827
aba769dc82e9 updated MaSh Python component
blanchet
parents: 50619
diff changeset
   210
        # Get hints:
aba769dc82e9 updated MaSh Python component
blanchet
parents: 50619
diff changeset
   211
        if len(line) == 3:
aba769dc82e9 updated MaSh Python component
blanchet
parents: 50619
diff changeset
   212
            hints = [self.nameIdDict[d.strip()] for d in line[2].split()]
aba769dc82e9 updated MaSh Python component
blanchet
parents: 50619
diff changeset
   213
        else:
aba769dc82e9 updated MaSh Python component
blanchet
parents: 50619
diff changeset
   214
            hints = []
50619
b958a94cf811 new version of MaSh, with theory-level reasoning
blanchet
parents: 50388
diff changeset
   215
53100
1133b9e83f09 new version of MaSh tool -- experimental server
blanchet
parents: 50951
diff changeset
   216
        return name,features,accessibles,hints,numberOfPredictions
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   217
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   218
    def save(self,fileName):
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   219
        if self.changed:
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   220
            dictsStream = open(fileName, 'wb')
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   221
            dump((self.accessibleDict,self.dependenciesDict,self.expandedAccessibles,self.featureDict,\
50951
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
   222
                self.featureIdDict,self.idNameDict,self.maxFeatureId,self.maxNameId,self.nameIdDict,\
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
   223
                self.featureCountDict,self.triggerFeaturesDict,self.featureTriggeredFormulasDict,self.useSine),dictsStream)
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   224
            self.changed = False
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   225
            dictsStream.close()
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   226
    def load(self,fileName):
50388
a5b666e0c3c2 added weights to MaSh (by Daniel Kuehlwein)
blanchet
parents: 50222
diff changeset
   227
        dictsStream = open(fileName, 'rb')
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   228
        self.accessibleDict,self.dependenciesDict,self.expandedAccessibles,self.featureDict,\
50951
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
   229
              self.featureIdDict,self.idNameDict,self.maxFeatureId,self.maxNameId,self.nameIdDict,\
e1cbaa7d5536 updated MaSh
blanchet
parents: 50840
diff changeset
   230
              self.featureCountDict,self.triggerFeaturesDict,self.featureTriggeredFormulasDict,self.useSine = load(dictsStream)
50220
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   231
        self.changed = False
90280d85cd03 moved MaSh's Python code into Isabelle
blanchet
parents:
diff changeset
   232
        dictsStream.close()