Vector* HeatMap_Flatten_Spans_IMP(HeatMap *self, Vector *spans) { const size_t num_spans = Vec_Get_Size(spans); UNUSED_VAR(self); if (!num_spans) { return Vec_new(0); } else { Vector *flattened = S_flattened_but_empty_spans(spans); const size_t num_raw_flattened = Vec_Get_Size(flattened); // Iterate over each of the source spans, contributing their scores to // any destination span that falls within range. size_t dest_tick = 0; for (size_t i = 0; i < num_spans; i++) { Span *source_span = (Span*)Vec_Fetch(spans, i); int32_t source_span_offset = Span_Get_Offset(source_span); int32_t source_span_len = Span_Get_Length(source_span); int32_t source_span_end = source_span_offset + source_span_len; // Get the location of the flattened span that shares the source // span's offset. for (; dest_tick < num_raw_flattened; dest_tick++) { Span *dest_span = (Span*)Vec_Fetch(flattened, dest_tick); if (Span_Get_Offset(dest_span) == source_span_offset) { break; } } // Fill in scores. for (size_t j = dest_tick; j < num_raw_flattened; j++) { Span *dest_span = (Span*)Vec_Fetch(flattened, j); if (Span_Get_Offset(dest_span) == source_span_end) { break; } else { float new_weight = Span_Get_Weight(dest_span) + Span_Get_Weight(source_span); Span_Set_Weight(dest_span, new_weight); } } } // Leave holes instead of spans that don't have any score. dest_tick = 0; for (size_t i = 0; i < num_raw_flattened; i++) { Span *span = (Span*)Vec_Fetch(flattened, i); if (Span_Get_Weight(span)) { Vec_Store(flattened, dest_tick++, INCREF(span)); } } Vec_Excise(flattened, dest_tick, num_raw_flattened - dest_tick); return flattened; } }
static int32_t S_hottest(HeatMap *heat_map) { float max_score = 0.0f; int32_t retval = 0; VArray *spans = HeatMap_Get_Spans(heat_map); for (uint32_t i = VA_Get_Size(spans); i--;) { Span *span = (Span*)VA_Fetch(spans, i); if (Span_Get_Weight(span) >= max_score) { retval = Span_Get_Offset(span); max_score = Span_Get_Weight(span); } } return retval; }
float HeatMap_Calc_Proximity_Boost_IMP(HeatMap *self, Span *span1, Span *span2) { HeatMapIVARS *const ivars = HeatMap_IVARS(self); int32_t comparison = Span_Compare_To(span1, (Obj*)span2); Span *lower = comparison <= 0 ? span1 : span2; Span *upper = comparison >= 0 ? span1 : span2; int32_t lower_end_offset = Span_Get_Offset(lower) + Span_Get_Length(lower); int32_t distance = Span_Get_Offset(upper) - lower_end_offset; // If spans overlap, set distance to 0. if (distance < 0) { distance = 0; } if (distance > (int32_t)ivars->window) { return 0.0f; } else { float factor = (ivars->window - distance) / (float)ivars->window; // Damp boost with greater distance. factor *= factor; return factor * (Span_Get_Weight(lower) + Span_Get_Weight(upper)); } }