HeatMap* HeatMap_init(HeatMap *self, Vector *spans, uint32_t window) { HeatMapIVARS *const ivars = HeatMap_IVARS(self); Vector *spans_copy = Vec_Clone(spans); Vector *spans_plus_boosts; ivars->spans = NULL; ivars->window = window; Vec_Sort(spans_copy); spans_plus_boosts = HeatMap_Generate_Proximity_Boosts(self, spans_copy); Vec_Push_All(spans_plus_boosts, spans_copy); Vec_Sort(spans_plus_boosts); ivars->spans = HeatMap_Flatten_Spans(self, spans_plus_boosts); DECREF(spans_plus_boosts); DECREF(spans_copy); return self; }
HeatMap* HeatMap_init(HeatMap *self, VArray *spans, uint32_t window) { HeatMapIVARS *const ivars = HeatMap_IVARS(self); VArray *spans_copy = VA_Shallow_Copy(spans); VArray *spans_plus_boosts; ivars->spans = NULL; ivars->window = window; VA_Sort(spans_copy, NULL, NULL); spans_plus_boosts = HeatMap_Generate_Proximity_Boosts(self, spans_copy); VA_Push_VArray(spans_plus_boosts, spans_copy); VA_Sort(spans_plus_boosts, NULL, NULL); ivars->spans = HeatMap_Flatten_Spans(self, spans_plus_boosts); DECREF(spans_plus_boosts); DECREF(spans_copy); return self; }
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)); } }
void HeatMap_Destroy_IMP(HeatMap *self) { HeatMapIVARS *const ivars = HeatMap_IVARS(self); DECREF(ivars->spans); SUPER_DESTROY(self, HEATMAP); }
Vector* HeatMap_Get_Spans_IMP(HeatMap *self) { return HeatMap_IVARS(self)->spans; }