diff --git a/polyominomodel/_polyomino_animator.py b/polyominomodel/_polyomino_animator.py index 927ea46..95062cf 100755 --- a/polyominomodel/_polyomino_animator.py +++ b/polyominomodel/_polyomino_animator.py @@ -77,7 +77,7 @@ def SetTightBounds(ax,data): plt.axis([min([i[0][0][0] for i in data])-0.25,max([i[0][0][0] for i in data])+1.25,min([i[0][0][1] for i in data])-0.25,max([i[0][0][1] for i in data])+1.25]) -def GrowPoly(genotype,tile_labels=True,growing=False,write_it=False,fps_par=1.25): +def GrowPoly(genotype,tile_labels=True,growing=False,build_strategy='random',write_it=False,fps_par=1.25): assert(len(genotype)%4==0), "Genotype length is invalid, each tile must have 4 faces" assert(len(genotype)<=40), "Very long genotype, currently not allowed" @@ -101,7 +101,7 @@ def init(): pass temporary_tiles=[] - data=list(PolyominoBuilder(genotype)) + data=list(PolyominoBuilder(genotype,build_strategy)) def AnimateBuild(i): if i and growing: SetTightBounds(ax,data[:i]) diff --git a/polyominomodel/_polyomino_builder.py b/polyominomodel/_polyomino_builder.py index 3e7abc9..514064e 100644 --- a/polyominomodel/_polyomino_builder.py +++ b/polyominomodel/_polyomino_builder.py @@ -14,13 +14,16 @@ def InteractionMatrix(input_face): ## POLYOMINO BUILDER ## -def PolyominoBuilder(genotype): +def PolyominoBuilder(genotype,build_strategy='random'): SIZE_LIMIT=len(genotype)**2 POLYOMINO_GRID=defaultdict(tuple) POSSIBLE_GRID=defaultdict(list) IMPOSSIBLE_GRID=set() TILE_TYPES=[genotype[i:i+4] for i in xrange(0, len(genotype), 4)] + if build_strategy=='dfs' or build_strategy=='bfs': + possible_grid_order=[] + def placeTile(tType,position,orientation): POLYOMINO_GRID[position]=(tType,orientation) return position,(tType,orientation) @@ -41,12 +44,20 @@ def identifyValidNeighbour(position,centerType,centerOrientation,checkPosition,i for cycNum in xrange(4): if bindingEdge!=0 and cycleList(tile,cycNum)[oppositeBindingEdgeIndex]==InteractionMatrix(bindingEdge): POSSIBLE_GRID[checkPosition].append((i,cycNum)) + if build_strategy=='dfs' or build_strategy=='bfs': + possible_grid_order.append(checkPosition) placement=placeTile(0,(0,0),0) identifyValidNeighbours((0,0)) yield placement,copy(POSSIBLE_GRID) while len(POSSIBLE_GRID)>0: - newPolyominoPosition,newPolyominoDetails=choice([(position, tileDetail) for position, tileDetails in POSSIBLE_GRID.iteritems() for tileDetail in tileDetails]) + if build_strategy=='random': + newPolyominoPosition,newPolyominoDetails=choice([(position, tileDetail) for position, tileDetails in POSSIBLE_GRID.iteritems() for tileDetail in tileDetails]) + if build_strategy=='dfs': + newPolyominoPosition,newPolyominoDetails= (possible_grid_order[-1],POSSIBLE_GRID[possible_grid_order.pop()][-1]) + if build_strategy=='bfs': + newPolyominoPosition,newPolyominoDetails= (possible_grid_order[0],POSSIBLE_GRID[possible_grid_order.pop(0)][0]) + POSSIBLE_GRID.pop(newPolyominoPosition) placement= placeTile(newPolyominoDetails[0],newPolyominoPosition,newPolyominoDetails[1]) identifyValidNeighbours(newPolyominoPosition) diff --git a/setup.py b/setup.py index 317b2ef..9c85978 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ if platform.startswith('darwin'): from distutils import sysconfig vars = sysconfig.get_config_vars() - vars['LDSHARED'] = vars['LDSHARED'].replace('-bundle', '-dynamiclib') + vars['LDSHARED'] = vars['LDSHARED'].replace('-bundle', '-dynamiclib') #not sure if this is working here = os.path.abspath(os.path.dirname(__file__))