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
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)
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
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)