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