public void UpdateComponent() { var thresholdSegmentMappings = new ThresholdSegmentMappings(_projectService.Project, _threshold, ComponentIdentifiers.PrimaryWordAligner); var listSegmentMappings = new ListSegmentMappings(_projectService.Project.Segmenter, _mappings.Mappings.Select(m => Tuple.Create(m.Segment1, m.Segment2)), _implicitComplexSegments); SegmentMappings = new UnionSegmentMappings(new ISegmentMappings[] { thresholdSegmentMappings, listSegmentMappings }); }
public void IsMapped_ImplicitComplexSegments() { var segmentPool = new SegmentPool(); var mappings = new ListSegmentMappings(_segmenter, new[] { UnorderedTuple.Create("m", "n"), UnorderedTuple.Create("t", "-"), UnorderedTuple.Create("h#", "-#"), UnorderedTuple.Create("c", "#g"), UnorderedTuple.Create("f", "@") }, true); Shape shape1 = _segmenter.Segment("s͡mat͡h"); Shape shape2 = _segmenter.Segment("k͡no"); Assert.That(mappings.IsMapped(shape1.First.Prev, segmentPool.Get(shape1.First), shape1.First.Next, shape2.First.Prev, segmentPool.Get(shape2.First), shape2.First.Next), Is.True); Assert.That(mappings.IsMapped(shape1.Last.Prev, segmentPool.Get(shape1.Last), shape1.Last.Next, shape2.Last, new Ngram <Segment>(), shape2.Last.Next), Is.True); Assert.That(mappings.IsMapped(shape1.First, segmentPool.Get(shape1.First.Next), shape1.Last, shape2.First, segmentPool.Get(shape2.Last), shape2.Last.Next), Is.False); shape1 = _segmenter.Segment("got͡h"); shape2 = _segmenter.Segment("c͡lo"); Assert.That(mappings.IsMapped(shape1.First.Prev, segmentPool.Get(shape1.First), shape1.First.Next, shape2.First.Prev, segmentPool.Get(shape2.First), shape2.First.Next), Is.True); Assert.That(mappings.IsMapped(shape1.Last.Prev, segmentPool.Get(shape1.Last), shape1.Last.Next, shape2.Last, new Ngram <Segment>(), shape2.Last.Next), Is.True); shape1 = _segmenter.Segment("s͡hog"); shape2 = _segmenter.Segment("oc͡t"); Assert.That(mappings.IsMapped(shape1.First.Prev, segmentPool.Get(shape1.First), shape1.First.Next, shape2.First.Prev, new Ngram <Segment>(), shape2.First), Is.False); Assert.That(mappings.IsMapped(shape1.Last.Prev, segmentPool.Get(shape1.Last), shape1.Last.Next, shape2.Last.Prev, segmentPool.Get(shape2.Last), shape2.Last.Next), Is.False); }
public SegmentMappingViewModel(IProjectService projectService, string segment1, string segment2) { _segment1 = segment1; _segment2 = segment2; _isSegment1Valid = ListSegmentMappings.IsValid(projectService.Project.Segmenter, _segment1); _isSegment2Valid = ListSegmentMappings.IsValid(projectService.Project.Segmenter, _segment2); }
public void NoMappings() { var segmentPool = new SegmentPool(); var mappings = new ListSegmentMappings(_segmenter, new UnorderedTuple <string, string> [0], false); Shape shape1 = _segmenter.Segment("mat"); Shape shape2 = _segmenter.Segment("no"); Assert.That(mappings.IsMapped(shape1.First.Prev, segmentPool.Get(shape1.First), shape1.First.Next, shape2.First.Prev, segmentPool.Get(shape2.First), shape2.First.Next), Is.False); Assert.That(mappings.IsMapped(shape1.Last.Prev, segmentPool.Get(shape1.Last), shape1.Last.Next, shape2.Last, new Ngram <Segment>(), shape2.Last.Next), Is.False); }
public void IsMapped() { var segmentPool = new SegmentPool(); var mappings = new ListSegmentMappings(_segmenter, new[] { UnorderedTuple.Create("m", "n"), UnorderedTuple.Create("t", "-"), UnorderedTuple.Create("h#", "-#"), UnorderedTuple.Create("c", "#g"), UnorderedTuple.Create("f", "@"), UnorderedTuple.Create("a", "o"), UnorderedTuple.Create("Cw", "-V") }, false); Shape shape1 = _segmenter.Segment("ma͡et"); Shape shape2 = _segmenter.Segment("no"); Assert.That(mappings.IsMapped(shape1.First.Prev, segmentPool.Get(shape1.First), shape1.First.Next, shape2.First.Prev, segmentPool.Get(shape2.First), shape2.First.Next), Is.True); Assert.That(mappings.IsMapped(shape1.Last.Prev, segmentPool.Get(shape1.Last), shape1.Last.Next, shape2.Last, new Ngram <Segment>(), shape2.Last.Next), Is.True); Assert.That(mappings.IsMapped(shape1.First, segmentPool.Get(shape1.First.Next), shape1.Last, shape2.First, segmentPool.Get(shape2.Last), shape2.Last.Next), Is.False); shape1 = _segmenter.Segment("goh"); shape2 = _segmenter.Segment("co"); Assert.That(mappings.IsMapped(shape1.First.Prev, segmentPool.Get(shape1.First), shape1.First.Next, shape2.First.Prev, segmentPool.Get(shape2.First), shape2.First.Next), Is.True); Assert.That(mappings.IsMapped(shape1.Last.Prev, segmentPool.Get(shape1.Last), shape1.Last.Next, shape2.Last, new Ngram <Segment>(), shape2.Last.Next), Is.True); shape1 = _segmenter.Segment("hog"); shape2 = _segmenter.Segment("oc"); Assert.That(mappings.IsMapped(shape1.First.Prev, segmentPool.Get(shape1.First), shape1.First.Next, shape2.First.Prev, new Ngram <Segment>(), shape2.First), Is.False); Assert.That(mappings.IsMapped(shape1.Last.Prev, segmentPool.Get(shape1.Last), shape1.Last.Next, shape2.Last.Prev, segmentPool.Get(shape2.Last), shape2.Last.Next), Is.False); shape1 = _segmenter.Segment("swat"); shape2 = _segmenter.Segment("sat"); Assert.That(mappings.IsMapped(shape1.ElementAt(0), segmentPool.Get(shape1.ElementAt(1)), shape1.ElementAt(2), shape2.ElementAt(0), new Ngram <Segment>(), shape2.ElementAt(1)), Is.True); shape1 = _segmenter.Segment("sawat"); shape2 = _segmenter.Segment("saat"); Assert.That(mappings.IsMapped(shape1.ElementAt(1), segmentPool.Get(shape1.ElementAt(2)), shape1.ElementAt(3), shape2.ElementAt(1), new Ngram <Segment>(), shape2.ElementAt(2)), Is.False); }
public SegmentMappingsTableViewModel(IProjectService projectService, SegmentMappingsTableSegmentPairViewModel.Factory segmentPairFactory, SegmentMappingViewModel.Factory mappingFactory, IEnumerable <SegmentMappingViewModel> mappings, SoundType soundType, int threshold) { _threshold = threshold; _soundType = soundType; FeatureSymbol segmentType; switch (_soundType) { case SoundType.Consonant: segmentType = CogFeatureSystem.ConsonantType; break; case SoundType.Vowel: segmentType = CogFeatureSystem.VowelType; break; default: throw new InvalidEnumArgumentException(); } var segmentComparer = new SegmentComparer(); var categoryComparer = new SegmentCategoryComparer(); _segments = new ReadOnlyList <SegmentMappingsTableSegmentViewModel>(projectService.Project.Varieties.SelectMany(v => v.SegmentFrequencyDistribution.ObservedSamples) .Where(s => s.Type == segmentType).Distinct().OrderBy(s => s.Category(), categoryComparer).ThenBy(s => s, segmentComparer) .Select(s => new SegmentMappingsTableSegmentViewModel(s, _soundType)).Concat(new SegmentMappingsTableSegmentViewModel(null, _soundType)).ToArray()); _categories = new ReadOnlyList <SegmentCategoryViewModel>(_segments.GroupBy(s => s.DomainSegment == null ? string.Empty : s.DomainSegment.Category()) .OrderBy(g => g.Key, categoryComparer).Select(g => new SegmentCategoryViewModel(g.Key, g)).ToArray()); var mappingLookup = new Dictionary <UnorderedTuple <string, string>, HashSet <UnorderedTuple <string, string> > >(); foreach (SegmentMappingViewModel mapping in mappings) { string seg1, seg2; FeatureSymbol leftEnv1, rightEnv1, leftEnv2, rightEnv2; if (ListSegmentMappings.Normalize(projectService.Project.Segmenter, mapping.Segment1, out seg1, out leftEnv1, out rightEnv1) && ListSegmentMappings.Normalize(projectService.Project.Segmenter, mapping.Segment2, out seg2, out leftEnv2, out rightEnv2)) { UnorderedTuple <string, string> key = UnorderedTuple.Create(seg1, seg2); HashSet <UnorderedTuple <string, string> > m = mappingLookup.GetOrCreate(key, () => new HashSet <UnorderedTuple <string, string> >()); m.Add(UnorderedTuple.Create(mapping.Segment1, mapping.Segment2)); } } IWordAligner aligner = projectService.Project.WordAligners[ComponentIdentifiers.PrimaryWordAligner]; foreach (SegmentMappingsTableSegmentViewModel segment1 in _segments) { bool isEnabled = true; foreach (SegmentMappingsTableSegmentViewModel segment2 in _segments) { if (EqualityComparer <Segment> .Default.Equals(segment1.DomainSegment, segment2.DomainSegment)) { isEnabled = false; } int delta = segment1.DomainSegment == null || segment2.DomainSegment == null ? -1 : aligner.Delta(segment1.DomainSegment.FeatureStruct, segment2.DomainSegment.FeatureStruct); SegmentMappingsTableSegmentPairViewModel segmentPair = segmentPairFactory(segment1, segment2, delta, isEnabled); segmentPair.MeetsThreshold = delta != -1 && delta <= _threshold; HashSet <UnorderedTuple <string, string> > pairMappings; if (mappingLookup.TryGetValue(UnorderedTuple.Create(segment1.StrRep, segment2.StrRep), out pairMappings)) { segmentPair.Mappings.Mappings.AddRange(pairMappings.Select(m => mappingFactory(m.Item1, m.Item2))); } segment1.SegmentPairs.Add(segmentPair); } } }