[docs]defoutput_mean_damage_ratio(items,items_start_end,row_used_indices,outloss_vals,period_weights,max_summary_id,):# Track number of entries per summary_idsummary_counts=np.zeros(max_summary_id,dtype=np.int32)# First pass to count how many times each summary_id appearsforidxinrow_used_indices:summary_id,period_no=get_mean_idx_data(idx,max_summary_id)summary_counts[summary_id-1]+=1# Compute cumulative start indicespos=0foridxinrange(max_summary_id):ifsummary_counts[idx]>0:items_start_end[idx][0]=pos# Start indexpos+=summary_counts[idx]items_start_end[idx][1]=pos# End index# Reset summary counts for inserting datasummary_counts[:]=0# Track which period_no are used if period_weights existsis_weighted=len(period_weights)>0used_period_no=np.zeros(len(period_weights),dtype=np.bool_)# Second pass to populate the data arrayforidxinrow_used_indices:summary_id,period_no=get_mean_idx_data(idx,max_summary_id)# Compute position in the flat arrayinsert_idx=items_start_end[summary_id-1][0]+summary_counts[summary_id-1]# Store valuesitems[insert_idx]["summary_id"]=summary_iditems[insert_idx]["value"]=outloss_vals[idx]ifis_weighted:# Fast lookup period_weights as they are numbered 1 to no_of_periodsitems[insert_idx]["period_weighting"]=period_weights[period_no-1]["weighting"]items[insert_idx]["period_no"]=period_noused_period_no[period_no-1]=Truesummary_counts[summary_id-1]+=1returnis_weighted,used_period_no