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