2424#include " ift/encoder/glyph_segmentation.h"
2525#include " ift/encoder/merge_strategy.h"
2626#include " ift/encoder/merger.h"
27+ #include " ift/encoder/segment.h"
2728#include " ift/encoder/segmentation_context.h"
2829#include " ift/encoder/subset_definition.h"
2930#include " ift/encoder/types.h"
@@ -191,6 +192,67 @@ struct SegmentOrdering {
191192 }
192193};
193194
195+ static std::vector<Segment> PreGroupSegments (
196+ const btree_map<SegmentSet, MergeStrategy>& merge_groups,
197+ const std::vector<SegmentOrdering>& ordering,
198+ const std::vector<SubsetDefinition>& subset_definitions,
199+ std::vector<uint32_t >& segment_index_map
200+ ) {
201+ segment_index_map.resize (subset_definitions.size ());
202+ std::vector<Segment> segments;
203+
204+ unsigned i = 0 ;
205+ unsigned last_group_index = 0 ;
206+ auto merge_group_it = merge_groups.begin ();
207+ auto ordering_it = ordering.begin ();
208+
209+ while (ordering_it != ordering.end ()) {
210+ const auto & o = *ordering_it;
211+ if (o.group_index != last_group_index && merge_group_it != merge_groups.end ()) {
212+ merge_group_it++;
213+ }
214+
215+ const MergeStrategy* strategy = nullptr ;
216+ if (merge_group_it != merge_groups.end ()) {
217+ strategy = &(merge_group_it->second );
218+ }
219+
220+ Segment segment = Segment{subset_definitions[o.original_index ], o.probability };
221+ if (strategy == nullptr ||
222+ strategy->PreClosureGroupSize () <= 1 ||
223+ o.probability .Max () > strategy->PreClosureProbabilityThreshold ()) {
224+ segment_index_map[o.original_index ] = i;
225+ } else {
226+ uint32_t remaining = strategy->PreClosureGroupSize () - 1 ;
227+ while (remaining > 0 ) {
228+ ordering_it++;
229+ if (ordering_it == ordering.end () ||
230+ ordering_it->group_index != last_group_index) {
231+ // Not consuming this item.
232+ ordering_it--;
233+ break ;
234+ }
235+
236+ segment.Definition ().Union (subset_definitions[ordering_it->original_index ]);
237+ segment_index_map[ordering_it->original_index ] = i;
238+
239+ remaining--;
240+ }
241+
242+ if (strategy->UseCosts ()) {
243+ segment.SetProbability (strategy->ProbabilityCalculator ()->ComputeProbability (segment.Definition ()));
244+ }
245+ }
246+
247+ last_group_index = o.group_index ;
248+ segments.push_back (segment);
249+ ordering_it++;
250+ i++;
251+ }
252+
253+ return segments;
254+ }
255+
194256// Converts the input subset definitions to a sorted list of segments, remaps
195257// the merge_groups segment set keys to reflect the ordering changes.
196258static StatusOr<std::vector<Segment>> ToOrderedSegments (
@@ -266,16 +328,12 @@ static StatusOr<std::vector<Segment>> ToOrderedSegments(
266328 std::sort (ordering.begin (), ordering.end ());
267329
268330 // maps from index in subset_definitions to the new ordering.
269- std::vector<uint32_t > segment_index_map (subset_definitions.size ());
270- std::vector<Segment> segments;
271- unsigned i = 0 ;
272- for (const auto & ordering : ordering) {
273- segments.push_back (Segment{subset_definitions[ordering.original_index ],
274- ordering.probability });
275- segment_index_map[ordering.original_index ] = i++;
276- }
331+ std::vector<uint32_t > segment_index_map;
332+ std::vector<Segment> segments = PreGroupSegments (merge_groups, ordering, subset_definitions, segment_index_map);
333+ VLOG (0 ) << segments.size () << " segments after pregrouping." ;
277334
278335 btree_map<SegmentSet, MergeStrategy> new_merge_groups;
336+ group_index = 0 ;
279337 for (auto & [segments, strategy] : merge_groups) {
280338 SegmentSet remapped;
281339 SegmentSet remapped_full;
@@ -287,6 +345,10 @@ static StatusOr<std::vector<Segment>> ToOrderedSegments(
287345 remapped_full.insert (s_prime);
288346 }
289347
348+
349+ VLOG (0 ) << " Merge group " << group_index << " has " << remapped.size () << " segments." ;
350+ group_index++;
351+
290352 if (!new_merge_groups.insert (std::make_pair (remapped, std::move (strategy)))
291353 .second ) {
292354 return absl::InvalidArgumentError (
0 commit comments