Luigi's picture
intial commit
01e3654
---
title: Power & ER Calibration App
emoji: 🌍
colorFrom: red
colorTo: purple
sdk: gradio
sdk_version: 5.25.2
app_file: app.py
pinned: false
license: apache-2.0
short_description: Power and ER Calibration with Hierarchical-Quadratic-RSM
---
# RSM Model Trainer
This Gradio-based web app lets you:
1. **Load & preview** your Excel (.xlsx) device data (hex settings + measurements).
2. **Train** a quadratic response-surface model (RSM) mapping hex settings to measured Power and ER.
3. **Predict** optimal hex settings for a new device given target Power & ER values.
---
## Files
- `app.py` – The Gradio application.
- `requirements.txt` – Python dependencies.
- `README.md` – This file.
---
## Setup & Run Locally
1. Create a virtual environment and install dependencies:
```bash
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```
2. Launch the app:
```bash
python app.py
```
3. Open the provided local URL in your browser.
---
# Power & ER Calibration App
A Gradio-based web application for calibrating “Power” and “ER” settings on RF devices using response-surface methodology (RSM) with hierarchical (mixed-effects) quadratic models. Designed to run as a self-contained Hugging Face Space, it streamlines the entire workflow from raw Excel data to per-device calibration recommendations.
---
## 🚀 Features
1. **Data Ingestion & Preview**
- Upload one or more `.xlsx` files containing sheets named `Tx 自動測試_<DeviceID>`.
- Extract hex-encoded “Setting Power” and “Setting ER” values, convert to integers, and pair with measured outputs from an EA-4000 instrument.
- Preview the first *N* rows in an interactive table.
2. **Model Training**
- Automatically build second-degree polynomial features from your two inputs (`power_dec`, `er_dec`).
- Fit two separate **hierarchical quadratic RSM** models—one for Power and one for ER—using `statsmodels.MixedLM`.
- Display goodness-of-fit metrics (R², RMSE) for each response.
3. **Calibration & Prediction**
- Enter up to 5 new calibration samples (hex settings + measured outputs) and your desired target values (decimal).
- Compute sample-based offsets to correct for device-specific systematic error.
- Use a bounded optimizer (`scipy.optimize.minimize`) to find the hex settings that best achieve the target Power & ER.
4. **Hex & Decimal Transparency**
- All user‐facing inputs for settings remain in hex (with or without `0x`).
- Measured values and targets are always decimal numbers.
- Predictions are returned in hex.
---
## 📖 Theory
### Response Surface Methodology (RSM)
RSM is a collection of statistical techniques for:
- **Modeling** the relationship between one or more continuous input variables (factors) and one or more output responses.
- **Optimizing** those inputs to achieve desired response targets.
A **quadratic model** augments a linear regression with squared and cross-term features:
\[
\begin{aligned}
y &= \beta_0 + \beta_1 x_1 + \beta_2 x_2 \\
&\quad + \beta_{11} x_1^2 + \beta_{22} x_2^2 \\
&\quad + \beta_{12} x_1 x_2 + \varepsilon
\end{aligned}
\]
where \(x_1\) = Power setting (decimal), \(x_2\) = ER setting (decimal), and \(y\) = measured output.
### Hierarchical (Mixed-Effects) Modeling
When calibrating **multiple devices**, each device may exhibit its own baseline offset or variability. A **mixed-effects** model decomposes:
- **Fixed effects** (\(\beta\)) shared across all devices.
- **Random effects** (\(b_i\)) that capture device-specific shifts:
\[
y_{i,j} = (X_{i,j}\beta) + (Z_{i,j} b_i) + \varepsilon_{i,j}
\]
- \(i\): device index, \(j\): sample index
- \(X\): design matrix for fixed effects (our polynomial features)
- \(Z\): often a subset of \(X\) (here, typically an intercept term per device)
- \(b_i \sim N(0, \Psi)\), \(\varepsilon_{i,j} \sim N(0, \sigma^2)\)
This “hierarchical quadratic RSM” lets us borrow statistical strength across devices while accounting for per-device differences.
### Calibration via Optimization
Given a trained model \(\hat{y}(x_1, x_2)\), we solve:
\[
\begin{aligned}
\min_{x_1, x_2}\quad
&\bigl(\hat{y}_{\mathrm{Power}}(x_1,x_2) - \mathrm{TargetPower}\bigr)^2 \\[6pt]
&\!+\;\bigl(\hat{y}_{\mathrm{ER}}(x_1,x_2) - \mathrm{TargetER}\bigr)^2
\end{aligned}
\]
subject to \(x_k \in [\min_k, \max_k]\) observed in training. We use SciPy’s `optimize.minimize` under these bounds and then round & re-encode the solution back to hex.
---
## ⚙️ Installation & Setup
1. **Clone the repo**
```bash
git clone https://github.com/your-org/power-er-calibration.git
cd power-er-calibration
```
2. **Install dependencies**
Create a virtual environment and install:
```bash
python -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
```
3. **Run locally**
```bash
python app.py
```
Then open the local URL (e.g. `http://localhost:7860`) in your browser.
4. **Deploy on Hugging Face Spaces**
- Push your `app.py`, `requirements.txt`, and `README.md` to a public or private Space.
- HF will automatically build and launch the Gradio UI.
---
## 🔧 Usage
1. **Tab 1 – Load Data**
- Click **Upload `.xlsx`**, select your calibration file.
- Adjust **Rows to preview** and inspect the first *N* rows.
- Ensure “power_hex” and “er_hex” columns look correct.
2. **Tab 2 – Train Model**
- Click **Train RSM**.
- Wait for “✅ Trained…” message showing R² & RMSE for both Power & ER.
3. **Tab 3 – Calibrate & Predict**
- Enter up to five new samples in hex & their measured decimal outputs.
- Set **Target Power (dec)** and **Target ER (dec)**.
- Click **Predict Settings** to receive the recommended hex settings.
---
## 📂 File Structure
```
├── app.py
├── requirements.txt
├── README.md
└── examples/
└── sample_data.xlsx
```
- **app.py**: Main Gradio application.
- **requirements.txt**: Python dependencies.
- **README.md**: This documentation.
- **examples/**: (optional) sample calibration files.
---
## 📋 Dependencies
```text
gradio>=3.20
pandas>=2.0
numpy>=1.24
scikit-learn>=1.2
statsmodels>=0.14
scipy>=1.10
openpyxl>=3.1
```
---
## 🤝 Contributing
1. Fork the repo
2. Create a feature branch (`git checkout -b feat/your-feature`)
3. Commit your changes (`git commit -m "Add …"`)
4. Push to your branch (`git push origin feat/your-feature`)
5. Open a Pull Request
---
## 📄 License
This project is licensed under the [Apache-2.0 License](LICENSE).
---