from typing import Dict # -------------------------------------------------------------------------------------------- # QS FALLBACK RULES (HEURISTICS) # These are regex-based rules that map certain keywords or patterns in the description # to specific categories. They are applied in a top-to-bottom manner, meaning that # more specific rules (e.g., for specialist ICT, AV & race track systems) are evaluated # before more generic rules (e.g., for preliminaries, schedules & dayworks). # This allows for a more accurate categorization of descriptions that may not have # been correctly classified by the QSSelecticCaliberatedModel, especially for those # that contain specific terms related to certain systems or components. # Evaluated Top-to-Bottom. Specific systems > Sub-components > Generic Schedules. # -------------------------------------------------------------------------------------------- QS_FALLBACK_RULES: Dict[str, str] = { # ========================================== # 1. SPECIALIST ICT, AV & RACE TRACK SYSTEMS # ========================================== r"(?i)\bvideo\s*walls?\b|\bgiant\s*screens?\b": "AV Equipment", r"(?i)\bstartlight\s*system\b|\bpublic\s*address\b": "AV Equipment", r"(?i)\bdigital\s*light\s*flag\b|\bsmart\s*marshalling\b": "AV Equipment", r"(?i)\bpit\s*warning\s*system\b|\btime\s*keeping\b": "AV Equipment", r"(?i)\bmarshal\s*communication\b|\bbroadband\s*antenna\b": "AV Equipment", r"(?i)\bdmx(\s*control)?\s*system\b": "Lighting control panel", r"(?i)\btechnical\s*furniture'?s?\b": "Furniture and furnishings", # ========================================== # 2. FIRE, SECURITY & AUTOMATION (ELV) # ========================================== r"(?i)\bfire\s*alarm\s*control\s*panel\b": "Fire alarm control panel", r"(?i)\bfire\s*alarm\s*system.*equipment\b": "Fire alarm control panel", r"(?i)\bfire\s*alarm\s*system\b": "Addressable fire alarm accessories", r"(?i)\baccess\s*control\s*system\b": "Access control panel", r"(?i)\bsecurity\s*system\b|\bfault\s*indication\s*system\b": "Alarm panel", r"(?i)\bpublic\s*cctv\b|\bvideo\s*surveillance\b": "CCTV Camera", r"(?i)\bbms\b|\bbuilding\s*management\s*system\b": "BMS", # ========================================== # 3. SAFETY BARRIERS, FENCES & GUARDRAILS # ========================================== r"(?i)\bfia\s*concrete\s*block\s*wall\b": "Concrete - precast", r"(?i)\btecpro\s*barrier\b|\bsafer\s*barrier\b": "Hoarding and site fence", r"(?i)\bguardrails?\b|\bfia\s*fence\b|\bspectator\s*fence\b": "Hoarding and site fence", r"(?i)\btemporary\s*fence\b|\bheras\s*fence\b|\bgap\s*fence\b": "Hoarding and site fence", r"(?i)\bboundary\s*fence\b|\bpipwall\s*gate\b|\bfence\s*wall\s*gate\b": "Hoarding and site fence", r"(?i)\bdouble\s*swing\s*gate\b|\bwalls,\s*fences,\s*gates\b": "Hoarding and site fence", r"(?i)\bwindows\s*on\s*fences\b": "Hoarding and site fence", # ========================================== # 4. MEP - ELECTRICAL & POWER # ========================================== r"(?i)\bmedium\s*voltage\s*distribution\b": "Transformer", r"(?i)\buninterruptible\s*power\s*supply\b|\bups\b": "UPS", r"(?i)\bdiesel\s*generator\b|\bemergency\s*power\s*generators?\b": "Generator", r"(?i)\bactive\s*harmonic\s*filter\b": "Power factor correction equipment", r"(?i)\bmotor\s*control\s*centers?\b": "Motor control center", r"(?i)\bdistribution\s*boards?\b": "Distribution boards", r"(?i)\bswitchgears?\b|\bswitchboards?\b|\bpanelboards?\b": "Distribution boards", r"(?i)\bearthing\s*and\s*bonding\b|\bearthing\s*supply\b": "Earthing system", r"(?i)\bdata\s*network\b|\bnetwork\s*racks?\b": "Network cabling infrastructure", # ========================================== # 5. MEP - CABLING & PIPING # ========================================== r"(?i)\bfp200\b|fire\s*rated\s*cables?": "Cabling - Copper Cable", r"(?i)\bgi\s*conduits?\b": "Cabling - Copper Conduit", r"(?i)\bmulticore.*cables?\b|\bcontrol\s*cables?\b": "Cabling - Copper Cable", r"(?i)\bcables?\s*from\s*.*to\b": "Cabling - Copper Cable", r"(?i)\bxlpe/pvc/cu\b|\bcu/xlpe/swa/pvc\b|\bcables?\b": "Cabling - Copper Cable", r"(?i)\bfiber\s*optic\b|\bfibre\s*backbone\b": "Cabling - Fibre Optic", r"(?i)upvc\s*pipes?": "Pipework - uPVC", r"(?i)pvc\s*pipes?": "Pipework - PVC", r"(?i)hdpe\s*pipes?": "Pipework - HDPE", r"(?i)pre-insulated\s*chilled\s*water\s*pipes?": "Pipework - Thermal", r"(?i)\bflexible\s*ducts?\b": "Duct - Flexible duct", # ========================================== # 6. EXTERNAL WORKS, IRRIGATION & LANDSCAPING # ========================================== r"(?i)\bsoil\s*clik\s*moisture\s*sensor\b": "Irrigation sundries", r"(?i)\birrigation\s*field\s*controller\b": "Irrigation system", r"(?i)\bpoly\s*subsurface\s*drip\s*line\b|\btree\s*irrigation\b": "Irrigation system", r"(?i)\bsecondary\s*irrigation.*valves\b|\bsecondary\s*irrigation.*others\b": "Irrigation sundries", r"(?i)\bsecondary\s*irrigation\b": "Irrigation system", r"(?i)\bsubbase\b|\bcrushed\s*aggregate\b": "Crushed aggregate , granular subbase", r"(?i)\bsubgrade\b": "Excavation", r"(?i)\bpvc\s*pondliner\b|\bpolyethylene\s*sheets?\b": "Waterproofing", r"(?i)\bgeotextile\b": "Geotextile", r"(?i)\bgravel\s*filter\b": "Gravel", r"(?i)\bplanting\s*soil\b|\bto\s*planting\s*areas\b": "Plant mix , sweet soil", r"(?i)\btrees\b": "Trees", r"(?i)\bshrubs\b|\bherbaceous\b|\bgroundcovers?\b": "Shrubs and ground covers", r"(?i)\bsite\s*furnishings?\b|\bseat\s*benches\b|\bplanter\s*benches\b": "Furniture and furnishings", # ========================================== # 7. STRUCTURAL, CIVIL & FINISHES # ========================================== r"(?i)\btrack\s*lighting\b|\blighting\s*poles?\b|\bfloodlight\b": "Light fixtures", r"(?i)\bmilos\s*m760\b|\btruss\s*structure\b": "Structural steel", r"(?i)column\s*foundations?|mass\s*concrete.*bases?": "Concrete - In situ", r"(?i)\bbase\s*plate.*holding\s*down\b": "Concrete - In situ", r"(?i)\bin-situ\s*concrete\s*paving\b|\bin-situ\s*concrete\b": "Concrete - In situ", r"(?i)\bconcrete\s*ancillaries.*formworks?\b": "Formwork", r"(?i)\bwire\s*mesh\b": "Reinforcement - mesh", r"(?i)\banti-carbonation\b|\bcladding\s*finishes\b|\btextured\s*paint\b": "Wall finishes", r"(?i)\bwhite\s*acrylic\s*paint\b": "Road marking", r"(?i)\bskirting\b": "Skirting", r"(?i)\bacoustic.*ceiling\b": "Acoustic ceiling tile", r"(?i)\binterior\s*concrete\s*ceilings\b": "Ceilings and bulkheads - paint finish only", r"(?i)\bsignage\b|\bwayfinding\b|\btraffic\s*sign\s*boards?\b|\bdistance\s*sign\s*board\b": "Signage and wayfinding", # ========================================== # 8. PRELIMINARIES, SCHEDULES & DAYWORKS (Catch-Alls) # ========================================== r"(?i)^\s*labour": "Dayworks - Labour", r"(?i)^\s*plant": "Dayworks - Plant & Equipment", r"(?i)^\s*materials?": "Dayworks - Material", r"(?i)\bsundry\s*items\b": "Dayworks", r"(?i)\bbuilder'?s\s*work\b": "Dayworks", r"(?i)\bsoft\s*landscaping.*\bmaintenance\b": "Dayworks", r"(?i)\bsubcontractor'?s\s*adjustments\b|\bvalue\s*adding\b|\badditional\s*items\b": "Dayworks", }