""" Passenger Car Unit (PCU) conversion using IRC:106-1990 guidelines. PCU normalizes heterogeneous Indian traffic into a single unit of measurement used by transport authorities for capacity analysis and road design. """ MODEL_CLASSES = { 0: "Hatchback", 1: "Sedan", 2: "SUV", 3: "MUV", 4: "Bus", 5: "Truck", 6: "Three-wheeler", 7: "Two-wheeler", 8: "LCV", 9: "Mini-bus", 10: "Tempo-traveller", 11: "Bicycle", 12: "Van", 13: "Others" } # IRC:106-1990 PCU equivalency factors _PCU_TABLE = { 0: 1.0, # Hatchback 1: 1.0, # Sedan 2: 1.0, # SUV 3: 1.0, # MUV 4: 3.0, # Bus 5: 3.0, # Truck 6: 1.2, # Three-wheeler (Auto-rickshaw) 7: 0.5, # Two-wheeler 8: 3.0, # LCV 9: 3.0, # Mini-bus 10: 3.0, # Tempo-traveller 11: 0.5, # Bicycle 12: 1.0, # Van 13: 1.0, # Others } def get_pcu_factor(class_id): return _PCU_TABLE.get(class_id, 1.0) def compute_pcu(class_in, class_out): """Convert raw vehicle counts to PCU values. Args: class_in: dict {class_id_str: count} class_out: dict {class_id_str: count} Returns: dict with total_pcu, pcu_in, pcu_out, per_class breakdown """ pcu_in = 0.0 pcu_out = 0.0 per_class = {} all_ids = set(list(class_in.keys()) + list(class_out.keys())) for cid_str in all_ids: cid = int(cid_str) factor = get_pcu_factor(cid) in_count = class_in.get(cid_str, 0) out_count = class_out.get(cid_str, 0) cls_pcu_in = round(in_count * factor, 1) cls_pcu_out = round(out_count * factor, 1) pcu_in += cls_pcu_in pcu_out += cls_pcu_out per_class[MODEL_CLASSES.get(cid, f"cls_{cid}")] = { "count": in_count + out_count, "factor": factor, "pcu": round(cls_pcu_in + cls_pcu_out, 1), } return { "total_pcu": round(pcu_in + pcu_out, 1), "pcu_in": round(pcu_in, 1), "pcu_out": round(pcu_out, 1), "per_class": per_class, }