view DepGraph.py @ 0:28b636105ed6

Working version of codeOptimizer. -Still needs to implement more finegrained control per file basis. -CXXFLAGS are hardcoded.
author Tom Fredrik Blenning Klaussen <bfg@blenning.no>
date Sat, 15 Sep 2012 20:34:39 +0200
parents
children a1224150b8f6
line wrap: on
line source

import numpy

from types import *

class DepGraph:
    def __init__(self):
        self.deps = []
        self.values = []

    def add(self, value):
        if value in self.values:
            raise ValueError
        self.values.append(value)


    def addDependency(self, src, dst):
        if not type(dst) is ListType:
            dst = [ dst ]

        vl = len(self.values)
        dl = len(self.deps)
        si = self.values.index(src)
        

        if dl != vl:
            full = []
            for i in range(0, vl):
                full.append(False)

            exp = []
            for i in range(dl, vl):
                exp.append(False)
                self.deps.append(full[:])

            for i in range(0, dl):
                self.deps[i].append(exp[:])
                
        for d in dst:
            if d in self.values:
                di = self.values.index(d)
                self.deps[si][di] = True


    @staticmethod
    def directedGraphInternal(deps):
        dl = len(deps)
        myVals = []
        for i in range(dl):
            if not max(deps[i]):
                myVals.append(i)

        for i in myVals:
            for j in range(dl):
                deps[j][i] = False

        retVal = myVals

        if len(deps) != len(myVals):
            subVals = self.directedGraphInternal(deps)
            for val in myVals:
                if val in subVals:
                    ind = subVals.index(val)
                    del subVals[ind]

            if subVals:
                retVal.extend(subVals)

        return retVal

    @staticmethod
    def printableDepgraph(deps):
        res=''
        for i in range(len(deps)):
            if res:
                res += '\n'
            s = ''
            for j in range(len(deps[i])):
                if deps[i][j]:
                    s += '1'
                else:
                    s += '0'
            res += s
        return res

    def directedGraph(self):
        deps = self.deps[:][:]
        vals = self.directedGraphInternal(deps)
        retVal = []
        for i in vals:
            retVal.append(self.values[i])
        return retVal


    def toplevelDependencies(self):
        dl = len(self.deps)
        retVal = []
        for i in range(dl):
            if not max(self.deps[i]):
                print max(self.deps[i])
                retVal.append(self.values[i])
        return retVal