diff --git a/ift/encoder/activation_condition.cc b/ift/encoder/activation_condition.cc index 245f930..258c5dc 100644 --- a/ift/encoder/activation_condition.cc +++ b/ift/encoder/activation_condition.cc @@ -371,10 +371,10 @@ StatusOr ActivationCondition::Probability( } // TODO(garretrieger): The full probability bound should be utilized here. - return calculator.ComputeMergedProbability(union_segments).Min(); + return calculator.ComputeMergedProbability(union_segments).Average(); } - return calculator.ComputeConjunctiveProbability(conjunctive_segments).Min(); + return calculator.ComputeConjunctiveProbability(conjunctive_segments).Average(); } StatusOr ActivationCondition::MergedProbability( @@ -431,10 +431,10 @@ StatusOr ActivationCondition::MergedProbability( union_segments.push_back(&merged_segment); } - return calculator.ComputeMergedProbability(union_segments).Min(); + return calculator.ComputeMergedProbability(union_segments).Average(); } - return calculator.ComputeConjunctiveProbability(conjunctive_segments).Min(); + return calculator.ComputeConjunctiveProbability(conjunctive_segments).Average(); } } // namespace ift::encoder \ No newline at end of file diff --git a/ift/encoder/closure_glyph_segmenter.cc b/ift/encoder/closure_glyph_segmenter.cc index 09239dc..37991a6 100644 --- a/ift/encoder/closure_glyph_segmenter.cc +++ b/ift/encoder/closure_glyph_segmenter.cc @@ -176,19 +176,16 @@ struct SegmentOrdering { bool operator<(const SegmentOrdering& other) const { if (group_index != other.group_index) { + // Group index ascending. return group_index < other.group_index; } - if (probability.Min() != other.probability.Min()) { - // Probability descending. - return probability.Min() > other.probability.Min(); - } - - if (probability.Max() != other.probability.Max()) { - // Probability descending. - return probability.Max() > other.probability.Max(); + if (probability.Average() != other.probability.Average()) { + // Segment probability descending. + return probability.Average() > other.probability.Average(); } + // Break ties with original segment index ascending. return original_index < other.original_index; } }; @@ -595,7 +592,7 @@ StatusOr ClosureGlyphSegmenter::TotalCost( double incremental_size = non_ift_font_size / (double)non_ift.codepoints.size(); for (unsigned cp : non_ift.codepoints) { - double Pcp = probability_calculator.ComputeProbability({cp}).Min(); + double Pcp = probability_calculator.ComputeProbability({cp}).Average(); ideal_cost += Pcp * incremental_size; } diff --git a/ift/encoder/segment.h b/ift/encoder/segment.h index 3351a53..9a8cb7a 100644 --- a/ift/encoder/segment.h +++ b/ift/encoder/segment.h @@ -10,7 +10,7 @@ struct Segment { Segment(SubsetDefinition definition, freq::ProbabilityBound probability) : definition(std::move(definition)), probability(probability) {} - double Probability() const { return probability.Min(); } + double Probability() const { return probability.Average(); } const freq::ProbabilityBound& ProbabilityBound() const { return probability; } const SubsetDefinition& Definition() const { return definition; } diff --git a/ift/freq/probability_bound.h b/ift/freq/probability_bound.h index 53abc7e..669d86f 100644 --- a/ift/freq/probability_bound.h +++ b/ift/freq/probability_bound.h @@ -17,6 +17,7 @@ struct ProbabilityBound { double Min() const { return min_; } double Max() const { return max_; } + double Average() const { return (min_ + max_) / 2.0; } bool operator==(const ProbabilityBound& other) const { return min_ == other.min_ && max_ == other.max_;