static void test_calc_proximity_boost(TestBatchRunner *runner) { VArray *spans = VA_new(0); HeatMap *heat_map = HeatMap_new(spans, 133); Span *span1 = Span_new( 0, 10, 1.0f); Span *span2 = Span_new( 10, 10, 1.0f); Span *span3 = Span_new( 5, 4, 1.0f); Span *span4 = Span_new(100, 10, 1.0f); Span *span5 = Span_new(150, 10, 1.0f); float big_boost = HeatMap_Calc_Proximity_Boost(heat_map, span1, span2); float eq_big_boost = HeatMap_Calc_Proximity_Boost(heat_map, span1, span3); float smaller_boost = HeatMap_Calc_Proximity_Boost(heat_map, span1, span4); float zero_boost = HeatMap_Calc_Proximity_Boost(heat_map, span1, span5); TEST_TRUE(runner, big_boost == eq_big_boost, "overlapping and abutting produce the same proximity boost"); TEST_TRUE(runner, big_boost > smaller_boost, "closer is better"); TEST_TRUE(runner, zero_boost == 0.0, "distance outside of window yields no prox boost"); DECREF(span1); DECREF(span2); DECREF(span3); DECREF(span4); DECREF(span5); DECREF(heat_map); DECREF(spans); }
Vector* HeatMap_Generate_Proximity_Boosts_IMP(HeatMap *self, Vector *spans) { Vector *boosts = Vec_new(0); const size_t num_spans = Vec_Get_Size(spans); if (num_spans > 1) { for (size_t i = 0, max = num_spans - 1; i < max; i++) { Span *span1 = (Span*)Vec_Fetch(spans, i); for (size_t j = i + 1; j <= max; j++) { Span *span2 = (Span*)Vec_Fetch(spans, j); float prox_score = HeatMap_Calc_Proximity_Boost(self, span1, span2); if (prox_score == 0) { break; } else { int32_t length = Span_Get_Offset(span2) - Span_Get_Offset(span1) + Span_Get_Length(span2); Vec_Push(boosts, (Obj*)Span_new(Span_Get_Offset(span1), length, prox_score)); } } } } return boosts; }
VArray* HeatMap_generate_proximity_boosts(HeatMap *self, VArray *spans) { VArray *boosts = VA_new(0); const uint32_t num_spans = VA_Get_Size(spans); if (num_spans > 1) { for (uint32_t i = 0, max = num_spans - 1; i < max; i++ ) { Span *span1 = (Span*)VA_Fetch(spans, i); for (uint32_t j = i + 1; j <= max; j++) { Span *span2 = (Span*)VA_Fetch(spans, j); float prox_score = HeatMap_Calc_Proximity_Boost(self, span1, span2); if (prox_score == 0) { break; } else { int32_t length = (span2->offset - span1->offset) + span2->length; VA_Push(boosts, (Obj*)Span_new(span1->offset, length, prox_score)); } } } } return boosts; }