Skip to content
Snippets Groups Projects
Select Git revision
  • 69ddfadde90fb99d44e78fcd811a0f1fdf57b6ed
  • master default protected
  • 6.x protected
  • madysson
  • 5.x protected
  • asm
  • time-varying-information-set
  • 4.6 protected
  • dynare_minreal
  • dragonfly
  • various_fixes
  • 4.5 protected
  • clang+openmp
  • exo_steady_state
  • declare_vars_in_model_block
  • julia
  • error_msg_undeclared_model_vars
  • static_aux_vars
  • slice
  • aux_func
  • penalty
  • 6.4 protected
  • 6.3 protected
  • 6.2 protected
  • 6.1 protected
  • 6.0 protected
  • 6-beta2 protected
  • 6-beta1 protected
  • 5.5 protected
  • 5.4 protected
  • 5.3 protected
  • 5.2 protected
  • 5.1 protected
  • 5.0 protected
  • 5.0-rc1 protected
  • 4.7-beta3 protected
  • 4.7-beta2 protected
  • 4.7-beta1 protected
  • 4.6.4 protected
  • 4.6.3 protected
  • 4.6.2 protected
41 results

DynamicModel.cc

Blame
  • functionDifferences.py 6.12 KiB
    ##
    ## This script recursively goes through the matlab directory and its
    ## subdirectories in the unstable branch, comparing the calling structures of the
    ## functions to those in another branch/commit, in this case the 4.2.5 branch
    ## The output is compatible with a Dynare Wiki page
    ##
    ## NB: To err on the side of safety, this script won't clean your workspace so a
    ## git command to checkout a different branch will fail if your workspace is
    ## dirty.
    ##
    
    ##
    ## Copyright © 2012 Dynare Team
    ##
    ## This file is part of Dynare.
    ##
    ## Dynare is free software: you can redistribute it and/or modify
    ## it under the terms of the GNU General Public License as published by
    ## the Free Software Foundation, either version 3 of the License, or
    ## (at your option) any later version.
    ##
    ## Dynare is distributed in the hope that it will be useful,
    ## but WITHOUT ANY WARRANTY; without even the implied warranty of
    ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    ## GNU General Public License for more details.
    ##
    ## You should have received a copy of the GNU General Public License
    ## along with Dynare.  If not, see <https://www.gnu.org/licenses/>.
    ##
    
    import os
    import string
    import subprocess
    import sys
    
    def runCompare():
        unstable = getFuncDict()
        subprocess.call(['git','checkout','4.2'])
    
        stable = getFuncDict()
        subprocess.call(['git','checkout','master'])
    
        us = set(unstable.keys())
        ss = set(stable.keys())
    
        deletedFunctions = sorted(ss - us)
        makeOldFunctionsWikiTable(deletedFunctions, stable)
    
        newFunctions = sorted(us - ss)
        makeNewFunctionsWikiTable(newFunctions, unstable)
    
        outputChanged = set([])
        inputChanged = set([])
        commonFunctions = sorted(ss & us)
        for le in commonFunctions:
            sOut = set(stable[le]['output'])
            uOut = set(unstable[le]['output'])
            sIn = set(stable[le]['input'])
            uIn = set(unstable[le]['input'])
    
            if len(uOut - sOut):
                outputChanged.add(le)
    
            if len(uIn - sIn):
                inputChanged.add(le)
    
        unionChanged = sorted(outputChanged | inputChanged)
        makeUnionChangedWikiTable(unionChanged, stable, unstable)
    
    
    def makeUnionChangedWikiTable(keys, stable, unstable):
        write = sys.stdout.write
        print "= Functions Whose Arguments Have Changed between Dynare 4.2.5 and " \
            "Dynare 4.3 ="
        print "|| '''Location''' || '''Old Output''' || " \
            "'''New Output''' || '''Old Input''' || '''New Input''' ||"
        for k in keys:
            write('|| {{{' + unstable[k]['filename'][10:]  + '}}} || ')
            write(str(stable[k]['output']) + ' || ')
            write(str(unstable[k]['output']) + ' || ')
            write(str(stable[k]['input']) + ' || ')
            write(str(unstable[k]['input']) + ' ||')
            print
    
    
    def makeNewFunctionsWikiTable(keys, dictionary):
        print '= New Functions in Dynare 4.3 ='
        makeWikiTable(keys, dictionary)
    
    
    def makeOldFunctionsWikiTable(keys, dictionary):
        print '= Functions Removed in Dynare 4.3 ='
        makeWikiTable(keys, dictionary)
    
    
    def makeWikiTable(keys, dictionary):
        write = sys.stdout.write
        print "|| '''Location''' || '''Output''' || '''Input''' ||"
        for k in keys:
            write('|| {{{' + dictionary[k]['filename'][10:]  + '}}} || ')
            write(str(dictionary[k]['output']) + ' || ')
            write(str(dictionary[k]['input']) + ' ||')
            print
    
    
    def printDict(dictionary, title):
        print
        print '***********************************'
        print '** ' + title
        print '***********************************'
        for key in sorted(dictionary.iterkeys()):
            b = dictionary[key]
            print key + ':' + b['filename']
        print '***********************************'
        print '***********************************'
        print
    
    
    def getFuncDict():
        functions = {}
    
        for dirname, dirnames, filenames in os.walk('../matlab'):
            for filename in filenames:
                filename = string.strip(filename)
    
                if filename[-2:] != '.m' or filename == 'msstart2.m' or filename == 'msstart_setup.m' or filename == 'qmc_sequence.m':
                    continue
    
                fullfilename = os.path.join(dirname, filename)
                f = open(fullfilename, 'r')
                funcDef = ''
                inComment = False
                while True:
                    funcDef += f.read(1)
                    if inComment:
                        if funcDef[-1:] == '\n':
                            inComment = False
                    else:
                        if funcDef[-1:] == '%':
                            inComment = True
                        elif funcDef[-1:] == ')':
                            break
                funcDef = funcDef.strip()
                f.close()
    
                funcDict = {}
                funcDict['filename'] = fullfilename
    
                # OUTPUT
                spliteq = string.rsplit(funcDef, '=')
                if len(spliteq) == 1:
                    # no output
                    outputs = ['']
                    funcDict['output'] = outputs
                    rhs = string.split(funcDef, ' ', 1).pop(1).strip()
                else:
                    outputs = string.split(spliteq.pop(0), ' ', 1).pop(1)
                    outputs = [string.strip(outputs, '[] ')]
                    outputs = getputs(outputs)
                    funcDict['output'] = outputs
                    rhs = string.strip(spliteq.pop(0), ' .\n')
    
                # FUNCTION NAME
                splitfn = string.split(rhs, '(')
                fn = splitfn.pop(0)
    
                # INPUT
                inputs = [string.strip(le,')') for le in splitfn]
                inputs = getputs(inputs)
                funcDict['input'] = inputs
    
                functions[fn] = funcDict
    
        return functions
    
    
    def getputs(puts):
        ''' Can be of the forms
        a
        a
        a, b
        a, b   % aoeu
        a, ...
           b
        a, ... % aoeu
           b
    
        Return a list of (in/out puts)
        '''
        splitout = string.split(string.join(puts), '\n')
    
        for i,le in enumerate(splitout[:]):
            indx = string.find(le, '%')
            if indx != -1:
                splitout[i] = string.strip(le[:indx], '\t .')
            else:
                splitout[i] = string.strip(le, '\t .')
    
        splitcommas = string.split(string.join(splitout), ',')
        return [string.strip(le) for le in splitcommas]
    
    
    if __name__ == "__main__":
        runCompare()