Welcome, guest | Sign In | My Account | Store | Cart
"""
    @author  Thomas Lehmann
    @file    sequenceBuilder.py
    @brief   generates sequences throughout different combinations of functions
"""
import sys
import itertools
import inspect
import re

class Sequence(object):
    """ represents a sequence and the used formula """
    def __init__(self, sequence, formula):
        """ storing one sequence and the relating formula """
        self.sequence = sequence
        self.formula  = formula
        self.hashCode = hash(tuple(self.sequence))

    def __eq__(self, other):
        """ required for unique elements in set container """
        return self.hashCode == other.hashCode

    def __lt__(self, other):
        """ required for sorting only """
        for a,b in zip(self.sequence, other.sequence):
            if a < b: return True
            if a > b: return False
        return False

    def __hash__(self):
        """ required for unique elements in set container """
        return self.hashCode

    def __repr__(self):
        return "%s - %s" % (self.sequence, self.formula)

class SequenceBuilder(object):
    def __init__(self):
        """ initializes for empty containers only """
        self.registeredFunctions = []
        self.sequences = set()

    def add(self, function):
        """ adds a function to the list of functions
            @param function is expected to be a lambda expression
        """
        self.registeredFunctions.append(function)

    def createSequences(self, fromPosition, toPosition):
        """ using the permutation of all functions to generate sequences
            @param fromPosition start position/index/value
            @param toPosition end position/index/value
        """
        self.sequences = set()
        for r in range(1,len(self.registeredFunctions)):
            for functions in itertools.permutations(self.registeredFunctions, r):
                position = fromPosition
                sequence = []
                while position <= toPosition:
                    value = position
                    for function in functions:
                        value = function(value)
                    sequence.append(value)
                    position += 1
                self.sequences.add(Sequence(sequence[0:], self.combineFunctions(functions)))

    def combineFunctions(self, functions):
        """ generates a combined formula as used for the calculation
            @param functions the list of individual functions (lambda code)
            @return the combined formula
            @note out of scope is the simplification (like: (x+1)+1 => x+2)
        """
        expression = ""
        for function in reversed(functions):
            match = re.match(".*\((?P<expression>lambda.*)\).*", inspect.getsource(function))
            if match:
                functionCode = match.group("expression")
                functionCode = functionCode[functionCode.find(":")+1:].strip()
                if not len(expression):
                    expression = functionCode
                else:
                    expression = expression.replace("x", "("+functionCode+")")
        return expression

def main():
    """ application entry point """
    print("Sequence builder v0.1")
    print("...Using Python %s" % sys.version.replace("\n", " - "))
    builder = SequenceBuilder()
    builder.add(lambda x: x-1)
    builder.add(lambda x: x-2)
    builder.add(lambda x: x+1)
    builder.add(lambda x: x+2)
    builder.add(lambda x: 2*x)
    builder.add(lambda x: x**2)
    builder.add(lambda x: (-1)**x)
    # takes a while...
    builder.createSequences(1, 20)
    print("...%d sequences found:" % len(builder.sequences))
    for sequence in sorted(builder.sequences):
        print(sequence)

if __name__ == "__main__":
    main()

Diff to Previous Revision

--- revision 1 2012-03-03 14:41:19
+++ revision 2 2012-03-03 17:50:03
@@ -1,26 +1,36 @@
+"""
+    @author  Thomas Lehmann
+    @file    sequenceBuilder.py
+    @brief   generates sequences throughout different combinations of functions
+"""
+import sys
 import itertools
 import inspect
 import re
 
 class Sequence(object):
-    """ represent a sequence and the used formula """
+    """ represents a sequence and the used formula """
     def __init__(self, sequence, formula):
-        """ storing sequence and formula """
+        """ storing one sequence and the relating formula """
         self.sequence = sequence
         self.formula  = formula
         self.hashCode = hash(tuple(self.sequence))
+
     def __eq__(self, other):
         """ required for unique elements in set container """
         return self.hashCode == other.hashCode
+
     def __lt__(self, other):
         """ required for sorting only """
         for a,b in zip(self.sequence, other.sequence):
             if a < b: return True
             if a > b: return False
         return False
+
     def __hash__(self):
         """ required for unique elements in set container """
         return self.hashCode
+
     def __repr__(self):
         return "%s - %s" % (self.sequence, self.formula)
 
@@ -29,11 +39,13 @@
         """ initializes for empty containers only """
         self.registeredFunctions = []
         self.sequences = set()
+
     def add(self, function):
         """ adds a function to the list of functions
             @param function is expected to be a lambda expression
         """
         self.registeredFunctions.append(function)
+
     def createSequences(self, fromPosition, toPosition):
         """ using the permutation of all functions to generate sequences
             @param fromPosition start position/index/value
@@ -71,7 +83,9 @@
         return expression
 
 def main():
+    """ application entry point """
     print("Sequence builder v0.1")
+    print("...Using Python %s" % sys.version.replace("\n", " - "))
     builder = SequenceBuilder()
     builder.add(lambda x: x-1)
     builder.add(lambda x: x-2)

History