Exemplo n.º 1
0
Arquivo: GEN.py Projeto: presleyp/gp2
 def make_new_mapping(self, old_mapping, locus, features):
     new_sr = copy.deepcopy(old_mapping.sr)
     new_sr[locus] -= features
     for feature in features:
         new_sr[locus].add(-feature)
     try:
         self.feature_dict.get_segment(new_sr[locus])
     except IndexError:
         return []
     new_mapping = Mapping(self.feature_dict, [
         False,
         copy.deepcopy(old_mapping.ur), new_sr,
         copy.deepcopy(old_mapping.changes)
     ])
     new_mapping.stem = copy.copy(old_mapping.stem)
     for feature in features:
         change = Change(self.feature_dict,
                         change_type='change',
                         mapping=new_mapping,
                         locus=locus,
                         feature=feature)
         change.make_set()
         new_mapping.changes.append(change)
     new_mapping.add_boundaries()
     new_mapping.set_ngrams()
     return new_mapping
Exemplo n.º 2
0
Arquivo: GEN.py Projeto: presleyp/gp2
 def change_feature_value(self, mapping):
     """Map a ur to an sr with one segment changed. Prefers fewer feature
     changes, but will only map to segments that are in the inventory. Each
     feature change is recorded in rule format: 'change
     feature-index new-feature-value
     major-features-of-original-segment'."""
     # decide what to change
     locus = numpy.random.randint(0, len(mapping.sr))
     segment = mapping.sr[locus]
     # decide how many features to change
     num_to_change = numpy.random.zipf(2)
     if num_to_change > len(segment):
         num_to_change = numpy.random.randint(1, len(segment) + 1)
     # pick a segment to change to with that many different features
     closest_num = None
     new_segment = None
     changed_features = None
     for phone in self.non_boundaries.values():
         difference = segment - phone
         num_different = len(difference)
         if num_different == num_to_change:
             new_segment = phone
             changed_features = difference
             break
         else:
             if num_different != 0 and (
                     closest_num == None
                     or numpy.absolute(num_different - num_to_change) <
                     numpy.absolute(closest_num - num_to_change)):
                 closest_num = num_different
                 new_segment = phone
                 changed_features = difference
     # change the segment
     mapping.sr[locus] = new_segment
     assert changed_features, 'no change made'
     for feature in changed_features:
         change = Change(self.feature_dict,
                         feature=feature,
                         mapping=mapping,
                         locus=locus)
         change.make_set()
         mapping.changes.append(change)
Exemplo n.º 3
0
Arquivo: GEN.py Projeto: presleyp/gp2
 def make_new_mapping(self, old_mapping, locus, features):
     new_sr = copy.deepcopy(old_mapping.sr)
     new_sr[locus] -= features
     for feature in features:
         new_sr[locus].add(-feature)
     try:
         self.feature_dict.get_segment(new_sr[locus])
     except IndexError:
         return []
     new_mapping = Mapping(
         self.feature_dict, [False, copy.deepcopy(old_mapping.ur), new_sr, copy.deepcopy(old_mapping.changes)]
     )
     new_mapping.stem = copy.copy(old_mapping.stem)
     for feature in features:
         change = Change(self.feature_dict, change_type="change", mapping=new_mapping, locus=locus, feature=feature)
         change.make_set()
         new_mapping.changes.append(change)
     new_mapping.add_boundaries()
     new_mapping.set_ngrams()
     return new_mapping
Exemplo n.º 4
0
Arquivo: GEN.py Projeto: presleyp/gp2
 def change_feature_value(self, mapping):
     """Map a ur to an sr with one segment changed. Prefers fewer feature
     changes, but will only map to segments that are in the inventory. Each
     feature change is recorded in rule format: 'change
     feature-index new-feature-value
     major-features-of-original-segment'."""
     # decide what to change
     locus = numpy.random.randint(0, len(mapping.sr))
     segment = mapping.sr[locus]
     # decide how many features to change
     num_to_change = numpy.random.zipf(2)
     if num_to_change > len(segment):
         num_to_change = numpy.random.randint(1, len(segment) + 1)
     # pick a segment to change to with that many different features
     closest_num = None
     new_segment = None
     changed_features = None
     for phone in self.non_boundaries.values():
         difference = segment - phone
         num_different = len(difference)
         if num_different == num_to_change:
             new_segment = phone
             changed_features = difference
             break
         else:
             if num_different != 0 and (
                 closest_num == None
                 or numpy.absolute(num_different - num_to_change) < numpy.absolute(closest_num - num_to_change)
             ):
                 closest_num = num_different
                 new_segment = phone
                 changed_features = difference
     # change the segment
     mapping.sr[locus] = new_segment
     assert changed_features, "no change made"
     for feature in changed_features:
         change = Change(self.feature_dict, feature=feature, mapping=mapping, locus=locus)
         change.make_set()
         mapping.changes.append(change)