Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.fbb.msu.ru/hg/allpy/rev/9665a6acdd53
Дата изменения: Unknown
Дата индексирования: Tue Oct 2 01:01:50 2012
Кодировка:
allpy: 9665a6acdd53

allpy

changeset 500:9665a6acdd53

allpy/structure: fix bugs * no not use yields * monomer has not .sequence and .column (!) attributes * set can not be treated with += * continuous_blocks() should return the last batch * continuous_blocks() has now min_width=1 parameter * set cannot be sorted with .sort()
author boris (netbook) <bnagaev@gmail.com>
date Tue, 22 Feb 2011 19:18:03 +0300
parents 4ecf6476a1c9
children 527b713affaa
files allpy/structure.py
diffstat 1 files changed, 37 insertions(+), 23 deletions(-) [+]
line diff
     1.1 --- a/allpy/structure.py	Tue Feb 22 19:12:36 2011 +0300
     1.2 +++ b/allpy/structure.py	Tue Feb 22 19:18:03 2011 +0300
     1.3 @@ -248,12 +248,19 @@
     1.4          * timeout_2 -- Bron-Kerbosh timeout (blocks)
     1.5          * min_width -- min width of each core
     1.6          """
     1.7 +        result = []
     1.8          Block = self.__class__
     1.9          # for sorting
    1.10 -        key_column = lambda c: return self.columns.index(c)
    1.11 -        key_sequence = lambda s: return self.sequences.index(c)
    1.12 +        key_column = lambda c: self.columns.index(c)
    1.13 +        key_sequence = lambda s: self.sequences.index(s)
    1.14          vertices = sum([seq for seq in self.sequences], [])
    1.15          edges = {}
    1.16 +        monomer2column = {}
    1.17 +        monomer2sequence = {}
    1.18 +        for column in self.columns:
    1.19 +            for sequence, monomer in column.items():
    1.20 +                monomer2column[monomer] = column
    1.21 +                monomer2sequence[monomer] = sequence
    1.22          for i, seq1 in enumerate(self.sequences):
    1.23              for j, seq2 in enumerate(self.sequences):
    1.24                  if i < j:
    1.25 @@ -264,24 +271,23 @@
    1.26                      for core in cores:
    1.27                          core_block = copy(block)
    1.28                          core_block.columns = sorted(core, key=key_column)
    1.29 -                        for part_block in core_block.continuous_blocks():
    1.30 -                            if len(part.columns) >= min_width:
    1.31 -                                monomers = part.monomers()
    1.32 -                                for m1 in monomers:
    1.33 -                                    for m2 in monomers:
    1.34 -                                        edges
    1.35 -                                        edge = Graph.edge(m1, m2)
    1.36 -                                        edges[edge] = 1.0
    1.37 +                        for part in core_block.continuous_blocks(min_width):
    1.38 +                            monomers = part.monomers()
    1.39 +                            for m1 in monomers:
    1.40 +                                for m2 in monomers:
    1.41 +                                    edges
    1.42 +                                    edge = Graph.edge(m1, m2)
    1.43 +                                    edges[edge] = 1.0
    1.44          graph = Graph(vertices, edges)
    1.45          cliques = graph.cliques(minsize=min_width*2, timeout=timeout_2)
    1.46          used_monomers = set()
    1.47          for clique in cliques:
    1.48              clique -= used_monomers
    1.49              while clique:
    1.50 -                sequences = set(m.sequence for m in clique)
    1.51 -                sequences.sort(key=key_sequence)
    1.52 -                columns = set(m.column for m in clique)
    1.53 -                columns.sort(key=key_column)
    1.54 +                sequences = set(monomer2sequence[m] for m in clique)
    1.55 +                sequences = sorted(sequences, key=key_sequence)
    1.56 +                columns = set(monomer2column[m] for m in clique)
    1.57 +                columns = sorted(columns, key=key_column)
    1.58                  height = len(sequences)
    1.59                  if height <= 1:
    1.60                      break
    1.61 @@ -290,31 +296,39 @@
    1.62                  block = copy(self)
    1.63                  block.columns = filled_columns
    1.64                  block.sequences = sequences
    1.65 -                for part in block.continuous_blocks():
    1.66 -                    if len(part.columns) >= min_width:
    1.67 -                        clique -= part.monomers()
    1.68 -                        used_monomers += part.monomers()
    1.69 -                        yield part
    1.70 +                for part in block.continuous_blocks(min_width):
    1.71 +                    clique -= set(part.monomers())
    1.72 +                    used_monomers |= set(part.monomers())
    1.73 +                    result.append(part)
    1.74 +        return result
    1.75  
    1.76 -    def continuous_blocks(self):
    1.77 +    def continuous_blocks(self, min_width=1):
    1.78          """ Return list of continued blocks """
    1.79 +        result = []
    1.80          self_columns = set(self.columns)
    1.81          columns_batch = []
    1.82          for column in self.alignment.columns:
    1.83              if column in self_columns:
    1.84                  columns_batch.append(column)
    1.85 -            elif columns_batch:
    1.86 +            elif len(columns_batch) >= min_width:
    1.87                  block = copy(self)
    1.88                  block.columns = columns_batch
    1.89                  columns_batch = []
    1.90 -                yield block
    1.91 +                result.append(block)
    1.92 +        if len(columns_batch) >= min_width:
    1.93 +            block = copy(self)
    1.94 +            block.columns = columns_batch
    1.95 +            result.append(block)
    1.96 +        return result
    1.97  
    1.98      def monomers(self):
    1.99          """ Return list of all monomers in this block """
   1.100 +        result = []
   1.101          for column in self.columns:
   1.102              for sequence in self.sequences:
   1.103                  if sequence in column:
   1.104 -                    yield column[sequence]
   1.105 +                    result.append(column[sequence])
   1.106 +        return result
   1.107  
   1.108      def superimpose(self, gc):
   1.109          """ Superimpose monomers from this block at gc positions """