""" Utility functions for matrix parsing and formatting in Gradio applications. """ import gradio as gr import numpy as np import json from typing import Union def parse_matrix(matrix_str: str, allow_empty_rows_cols=False) -> np.ndarray: try: m = json.loads(matrix_str) arr = np.array(m, dtype=float) if not allow_empty_rows_cols and (arr.shape[0] == 0 or (arr.ndim > 1 and arr.shape[1] == 0)): raise ValueError("Matrix cannot have zero rows or columns.") if arr.ndim == 1 and arr.shape[0] > 0: arr = arr.reshape(1, -1) elif arr.ndim == 0 and not allow_empty_rows_cols: raise ValueError("Input is a scalar, not a matrix.") return arr except (json.JSONDecodeError, TypeError, ValueError) as e_json: try: rows = [list(map(float, row.split(','))) for row in matrix_str.split(';') if row.strip()] if not rows and not allow_empty_rows_cols: raise ValueError("Matrix input is empty.") if not rows and allow_empty_rows_cols: return np.array([]) if len(rows) > 1: first_row_len = len(rows[0]) if not all(len(r) == first_row_len for r in rows): raise ValueError("All rows must have the same number of columns.") arr = np.array(rows, dtype=float) if not allow_empty_rows_cols and (arr.shape[0] == 0 or (arr.ndim > 1 and arr.shape[1] == 0)): raise ValueError("Matrix cannot have zero rows or columns after parsing.") return arr except ValueError as e_csv: raise gr.Error(f"Invalid matrix format. Use JSON (e.g., [[1,2],[3,4]]) or comma/semicolon (e.g., 1,2;3,4). Error: {e_csv} (Original JSON error: {e_json})") except Exception as e_gen: raise gr.Error(f"General error parsing matrix: {e_gen}") def format_output(data: Union[np.ndarray, float, str]) -> str: if isinstance(data, np.ndarray): return str(data.tolist()) elif isinstance(data, (float, int, str)): return str(data) return "Output type not recognized."