| import gradio as gr |
| import re |
|
|
| |
| |
| |
|
|
| def extract_value(text, key): |
| pattern = rf"{key}\s*=\s*(-?\d+\.?\d*)" |
| match = re.search(pattern, text, re.IGNORECASE) |
|
|
| if match: |
| return float(match.group(1)) |
|
|
| return None |
|
|
| |
| |
| |
|
|
| def analyze_ul_interference(vendor, data): |
|
|
| findings = [] |
| causes = [] |
| actions = [] |
|
|
| severity = "LOW" |
| condition = "NORMAL" |
|
|
| ul_sinr = extract_value(data, "UL SINR") |
| rtwp = extract_value(data, "RTWP") |
| ul_prb = extract_value(data, "UL PRB") |
| dl_prb = extract_value(data, "DL PRB") |
| bler = extract_value(data, "PUSCH BLER") |
| cqi = extract_value(data, "CQI") |
|
|
| |
| |
| |
|
|
| if ul_sinr is not None: |
|
|
| if ul_sinr < -5: |
| findings.append(f"Critical UL SINR degradation ({ul_sinr} dB)") |
| severity = "HIGH" |
|
|
| elif ul_sinr < 0: |
| findings.append(f"Poor UL SINR detected ({ul_sinr} dB)") |
| severity = "MEDIUM" |
|
|
| |
| |
| |
|
|
| if rtwp is not None: |
|
|
| if rtwp > -95: |
| findings.append(f"Severe RTWP elevation ({rtwp} dBm)") |
| severity = "HIGH" |
|
|
| elif rtwp > -100: |
| findings.append(f"Elevated RTWP/noise floor ({rtwp} dBm)") |
| severity = "MEDIUM" |
|
|
| |
| |
| |
|
|
| if bler is not None: |
|
|
| if bler > 30: |
| findings.append(f"Critical PUSCH BLER ({bler}%)") |
| severity = "HIGH" |
|
|
| elif bler > 15: |
| findings.append(f"Elevated PUSCH BLER ({bler}%)") |
|
|
| |
| |
| |
|
|
| if cqi is not None: |
|
|
| if cqi < 5: |
| findings.append(f"Low CQI detected ({cqi})") |
|
|
| |
| |
| |
|
|
| congestion = False |
| interference = False |
|
|
| if ul_prb is not None: |
|
|
| if ul_prb > 85: |
| findings.append(f"High UL PRB utilization ({ul_prb}%)") |
| congestion = True |
|
|
| |
| |
| |
|
|
| if ( |
| ul_sinr is not None and ul_sinr < 0 and |
| rtwp is not None and rtwp > -100 and |
| bler is not None and bler > 15 |
| ): |
| interference = True |
|
|
| |
| |
| |
|
|
| if interference: |
|
|
| condition = "LIKELY UL INTERFERENCE" |
|
|
| causes = [ |
| "External uplink interference", |
| "Passive Intermodulation (PIM)", |
| "Overshooting sector", |
| "Feeder or jumper degradation", |
| "Radio hardware impairment" |
| ] |
|
|
| actions = [ |
| "Review RTWP trend history", |
| "Compare neighboring sector RTWP", |
| "Inspect feeder and jumper path", |
| "Validate antenna alignment", |
| "Perform spectrum sweep", |
| "Review recent maintenance activity" |
| ] |
|
|
| |
| |
| |
|
|
| elif congestion: |
|
|
| condition = "LIKELY CAPACITY CONGESTION" |
|
|
| causes = [ |
| "High uplink traffic demand", |
| "Sector loading imbalance", |
| "Subscriber concentration", |
| "Limited uplink scheduling capacity" |
| ] |
|
|
| actions = [ |
| "Review busy-hour utilization", |
| "Evaluate load balancing", |
| "Assess scheduler efficiency", |
| "Review carrier utilization" |
| ] |
|
|
| |
| |
| |
|
|
| else: |
|
|
| condition = "NO MAJOR UL IMPAIRMENT DETECTED" |
|
|
| actions = [ |
| "Continue KPI monitoring" |
| ] |
|
|
| |
| |
| |
|
|
| findings_md = "### Findings\n\n" + "\n".join( |
| [f"- {x}" for x in findings] |
| ) |
|
|
| causes_md = "### Likely Causes\n\n" + "\n".join( |
| [f"- {x}" for x in causes] |
| ) |
|
|
| actions_md = "### Recommended Actions\n\n" + "\n".join( |
| [f"- {x}" for x in actions] |
| ) |
|
|
| assessment_md = """ |
| ### Engineering Assessment |
| |
| Analysis completed using LTE/5G uplink KPI and PM counter thresholds. |
| """ |
|
|
| return ( |
| condition, |
| severity, |
| vendor, |
| findings_md, |
| causes_md, |
| actions_md, |
| assessment_md |
| ) |
|
|
| |
| |
| |
|
|
| examples = [ |
| [ |
| "Ericsson", |
| """UL SINR = -8 |
| PUSCH BLER = 41 |
| RTWP = -94 |
| UL PRB = 72 |
| DL PRB = 35 |
| CQI = 3""" |
| ], |
| [ |
| "Nokia", |
| """UL SINR = 4 |
| PUSCH BLER = 5 |
| RTWP = -108 |
| UL PRB = 96 |
| DL PRB = 92 |
| CQI = 11""" |
| ], |
| [ |
| "Samsung", |
| """UL SINR = -2 |
| PUSCH BLER = 18 |
| RTWP = -99 |
| UL PRB = 88 |
| DL PRB = 81 |
| CQI = 6""" |
| ] |
| ] |
|
|
| |
| |
| |
|
|
| with gr.Blocks(theme=gr.themes.Default()) as demo: |
|
|
| gr.Markdown(""" |
| # UL Interference Analyzer |
| |
| AI-assisted LTE and 5G uplink interference analysis using KPI and PM counter indicators. |
| """) |
|
|
| vendor = gr.Dropdown( |
| choices=["Ericsson", "Nokia", "Samsung"], |
| value="Ericsson", |
| label="RAN Vendor", |
| container=False |
| ) |
|
|
| data_input = gr.Textbox( |
| lines=10, |
| label="Paste KPI / PM Counter Data" |
| ) |
|
|
| analyze_btn = gr.Button( |
| "Analyze", |
| variant="primary" |
| ) |
|
|
| |
| |
| |
|
|
| with gr.Row(): |
|
|
| condition_box = gr.Textbox( |
| label="Condition", |
| interactive=False |
| ) |
|
|
| severity_box = gr.Textbox( |
| label="Severity", |
| interactive=False |
| ) |
|
|
| vendor_box = gr.Textbox( |
| label="Vendor", |
| interactive=False |
| ) |
|
|
| |
| |
| |
|
|
| with gr.Row(): |
|
|
| findings_box = gr.Markdown() |
|
|
| causes_box = gr.Markdown() |
|
|
| actions_box = gr.Markdown() |
|
|
| assessment_box = gr.Markdown() |
|
|
| |
| |
| |
|
|
| gr.Examples( |
| examples=examples, |
| inputs=[vendor, data_input] |
| ) |
|
|
| |
| |
| |
|
|
| analyze_btn.click( |
| fn=analyze_ul_interference, |
| inputs=[vendor, data_input], |
| outputs=[ |
| condition_box, |
| severity_box, |
| vendor_box, |
| findings_box, |
| causes_box, |
| actions_box, |
| assessment_box |
| ] |
| ) |
|
|
| demo.launch() |