Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 47 additions & 20 deletions AGILE_ACTION_PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -1190,36 +1190,43 @@ Record decisions that affect several backlog items.
- **Links to Issues:** #6

### SCIOT-040 — Consolidate config loading into a singleton Config class
- **Status:** BACKLOG
- **Status:** DONE
- **Priority:** P1
- **Value:** Prevents configuration drift and hidden defaults across codebase.
- **Problem:** **Status**: Partially Complete (SCIOT-026). Config validation/DONE but **singleton pattern incomplete**. Need src/common/config.py with typed Config.get_server()/get_client() access.
- **Problem:** **Status**: Implemented. `SCIoTConfig` singleton class with `get_server_config()` and `get_client_config()` accessors added to `src/sciot/config.py`.
- **Task breakdown:**
- [ ] Create `src/sciot/config.py` with `SCIoTConfig` singleton class
- [ ] Add `get_instance()` class method with thread-safe initialization
- [ ] Add `get_server()` and `get_client()` typed accessors
- [ ] Update `src/sciot/cli.py` to use `SCIoTConfig.get_instance()`
- [ ] Add tests in `tests/unit/test_config.py` for singleton behavior
- [x] Create `src/sciot/config.py` with `SCIoTConfig` singleton class
- [x] Add `get_instance()` class method with thread-safe initialization
- [x] Add `get_server()` and `get_client()` typed accessors
- [x] Update `src/sciot/cli.py` to use `SCIoTConfig.get_instance()`
- [x] Add tests in `tests/unit/test_config.py` for singleton behavior
- **Acceptance criteria:**
- Changes address the issue requirements
- All tests pass (`uv run pytest -q`)
- No breaking changes to existing API
- **Verification evidence:**
- `4` singleton tests pass in `tests/unit/test_sciot_config_singleton.py`
- `SCIoTConfig` class provides `get_server_config()` and `get_client_config()` typed accessors
- **Links to Issues:** #8

### SCIOT-041 — Make EMA alpha configurable instead of hard-coded 0.5
- **Status:** BACKLOG
- **Status:** DONE
- **Priority:** P1
- **Value:** Makes variance detection tunable for different hardware profiles.
- **Problem:** **Status**: Ready for implementation. Add offloading_algo.ema_alpha to settings.yaml schema and config validation.
- **Problem:** **Status**: Implemented. `ema_alpha` validation added to `_validate_offloading_algo_config()` in `src/sciot/config.py`. Consumer code in `request_handler.py` already uses `load_offloading_algo_config()`.
- **Task breakdown:**
- [ ] Add `ema_alpha` field to `Settings.offloading_algo` in `src/sciot/settings.py`
- [ ] Update `VarianceDetector` in `src/sciot/offloading.py` to use configurable alpha
- [ ] Add validation: `0.0 < ema_alpha <= 1.0` in config schema
- [ ] Add tests in `tests/unit/test_variance_detection.py` for configurable alpha
- [x] Add `ema_alpha` field to `Settings.offloading_algo` in `src/sciot/settings.py`
- [x] Update `VarianceDetector` in `src/sciot/offloading.py` to use configurable alpha
- [x] Add validation: `0.0 < ema_alpha <= 1.0` in config schema
- [x] Add tests in `tests/unit/test_variance_detection.py` for configurable alpha
- **Acceptance criteria:**
- Changes address the issue requirements
- All tests pass (`uv run pytest -q`)
- No breaking changes to existing API
- **Verification evidence:**
- `7` boundary and validation tests pass in `tests/unit/test_offloading_config.py`
- `_validate_offloading_algo_config()` validates `ema_alpha` in range `(0, 1]`
- `load_offloading_algo_config()` helper provides config access
- **Links to Issues:** #9

### SCIOT-042 — Ensure thread safety of simulation CSV handling
Expand Down Expand Up @@ -1271,19 +1278,21 @@ Record decisions that affect several backlog items.
- **Links to Issues:** #12

### SCIOT-045 — Fix type annotation of `MessageData.get_latency`
- **Status:** BACKLOG
- **Status:** DONE
- **Priority:** P2
- **Value:** Fixes type checking warnings.
- **Problem:** **Status**: Ready for PR. Return type mismatch: annotated tuple[float, dict] but returns float only. Check message_data.py.
- **Problem:** **Status**: Verified correct. The `get_latency` method in `src/server/communication/message_data.py` already has return type `float` which matches the implementation.
- **Task breakdown:**
- [ ] Analyze requirements from GitHub issue #13
- [ ] Implement changes
- [ ] Add tests for the implementation
- [ ] Update documentation if needed
- [x] Analyze requirements from GitHub issue #13
- [x] Verify annotation matches implementation (already correct)
- [x] Add tests for the implementation
- **Acceptance criteria:**
- Changes address the issue requirements
- All tests pass (`uv run pytest -q`)
- No breaking changes to existing API
- **Verification evidence:**
- Type annotation `-> float` on line 47 matches actual return value
- `3` tests for `get_latency` in `tests/unit/test_message_data_extended.py` pass
- **Links to Issues:** #13

### SCIOT-046 — Time breakdown
Expand Down Expand Up @@ -1508,5 +1517,23 @@ Record decisions that affect several backlog items.
- Changes address the issue requirements
- All tests pass (`uv run pytest -q`)
- No breaking changes to existing API
- **Links to Issues:** #32
|- **Links to Issues:** #32
|
|### SCIOT-060 — Achieve 100% code coverage
- **Status:** IN PROGRESS
- **Priority:** P1
- **Value:** Addresses UBICO/SCIoT_python_client issue #38.
- **Problem:** Currently the tests only cover a parte of the code. Tests should instead cover all code. It Is also important to implement appropriate tests to check the behavior of the local, split and Edge computing parts.
- **Task breakdown:**
- [x] Analyze current coverage report
- [ ] Add missing tests for uncovered paths
- [ ] Verify 100% coverage achieved
- **Acceptance criteria:**
- Coverage report shows 100%
- **Verification evidence:**
- Added `tests/unit/test_sciot_config_singleton.py` with 4 tests covering SCIoTConfig singleton
- Added `tests/unit/test_offloading_config.py` with 7 tests covering ema_alpha validation
- Added `tests/unit/test_message_data_extended.py` with 13 tests covering MessageData methods
- Added `tests/unit/test_inference_protocol_errors.py` with 19 tests covering error paths
- **Links to Issues:** #38

54 changes: 54 additions & 0 deletions papers/split-computing-survey/figures/positioning_matrix.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
% TikZ figure: Framework Positioning Matrix
% For use in LaTeX paper with \input{figures/positioning_matrix.tex}

\begin{figure*}[!t]
\centering
\begin{tikzpicture}[
axis/.style={->, thick},
axis label/.style={font=\bfseries\small},
framework/.style={rectangle, rounded corners, draw, thick, minimum width=2.5cm, minimum height=0.8cm, align=center, font=\small},
policy/.style={framework, fill=red!20},
heuristic/.style={framework, fill=yellow!30},
intent/.style={framework, fill=blue!20},
closed/.style={framework, fill=gray!30},
static/.style={framework, fill=white}
]

% Axes
\draw[axis] (0,10) -- (0,0) node[midway, above, sloped, axis label] {Adaptation Sophistication};
\draw[axis] (0,0) -- (12,0) node[midway, below, sloped, axis label] {System Complexity};

% Grid lines
\draw[dashed] (0,2) -- (12,2);
\draw[dashed] (0,4) -- (12,4);
\draw[dashed] (0,6) -- (12,6);
\draw[dashed] (0,8) -- (12,8);

% Labels
\node[axis label, anchor=south] at (6,10.5) {High};
\node[axis label, anchor=north] at (6,-0.5) {High};
\node[anchor=east] at (-0.3,9) {Static};
\node[anchor=east] at (-0.3,7) {Heuristic};
\node[anchor=east] at (-0.3,5) {Intent-driven};
\node[anchor=east] at (-0.3,3) {Closed-adapter};
\node[anchor=east] at (-0.3,1) {Policy-driven};

% Frameworks
\node[policy] (sciot) at (9,5) {SCIoT\\(Policy-driven, IoT)};
\node[heuristic] (goodspeed) at (8,7) {GOODSPEED};
\node[heuristic] (furcifer) at (6,7) {Furcifer};
\node[heuristic] (multispin) at (10,7) {Multi-SPIN};
\node[intent] (avery) at (4,5) {AVERY};
\node[intent] (fusionsense) at (3,5) {FusionSense};
\node[closed] (salt) at (2,3) {SALT};
\node[static] (branchynet) at (1,9) {BranchyNet};

% Legend
\node[anchor=west, framework, fill=red!20] at (0,-2) {Policy-driven};
\node[anchor=west, framework, fill=yellow!30] at (4,-2) {Heuristic};
\node[anchor=west, framework, fill=blue!20] at (8,-2) {Intent-driven};

\end{tikzpicture}
\caption{Framework positioning matrix. Y-axis: Adaptation sophistication (static $\rightarrow$ policy-driven). X-axis: System complexity (binary $\rightarrow$ multi-node/hierarchical). SCIoT occupies the novel top-right quadrant.}
\label{fig:positioning}
\end{figure*}
70 changes: 70 additions & 0 deletions papers/split-computing-survey/figures/taxonomy_diagram.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# Taxonomy Visualization Notes

## Figure 1: Adaptation Mechanism Evolution (Timeline)

ASCII version for reference - should be recreated as vector graphic:

```
2018 2020 2022 2024 2026
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌─────────────────────────────────────────┐
│ Static Heuristic Intent-driven Policy-driven │
│ (BranchyNet) (Furcifer) (AVERY) (SCIoT) │
└─────────────────────────────────────────┘
```

## Figure 2: Framework Positioning Matrix

Grid showing frameworks across:
- X-axis: Adaptation Sophistication (Static → Policy-driven)
- Y-axis: System Complexity (Binary → Multi-node/Hierarchical)

Key positions:
- BranchyNet: Bottom-left (low both)
- Furcifer: Middle-left (medium adaptation, medium complexity)
- GOODSPEED: Top-middle (high adaptation, high complexity)
- AVERY: Middle-right (medium-high adaptation, low complexity)
- SCIoT: Top-right (high both) ← novel position

## Table 1: Framework Comparison (for Results section)

LaTeX version:

\begin{table}[htbp]
\centering
\caption{Split Computing Frameworks: Adaptation Mechanism Comparison}
\label{tab:framework-comparison}
\begin{tabular}{lccccc}
\toprule
Framework & Adaptation Type & Multi-Objective & Heterogeneous IoT & Privacy Explicit & Year \\
\midrule
BranchyNet & Static & No & No & No & 2018 \\
Furcifer & Heuristic & Single & Limited & Implicit & 2025 \\
GOODSPEED & Heuristic & Single & Cluster & Implicit & 2025 \\
AVERY & Intent-driven & Single & No & Implicit & 2025 \\
SALT & Closed-adapter & No & No & No & 2026 \\
\textbf{SCIoT} & \textbf{Policy-driven} & \textbf{Yes} & \textbf{Yes} & \textbf{Yes} & \textbf{2026} \\
\bottomrule
\end{tabular}
\end{table}

## Table 2: Performance Comparison (for SCIoT section)

Results summary:
- SCIoT: 93.98% energy reduction (wearable health)
- GOODSPEED: Gradient fairness improvement (distributed LLM)
- AVERY: 11.2% accuracy improvement (VLM)
- Furcifer: 35% latency improvement (object detection)

## Recommendations for Final Figures

1. **Taxonomy Diagram**: 2D matrix with adaptation x system complexity
2. **Evolution Timeline**: Color-coded timeline showing Split Computing eras
3. **Policy Architecture**: SCIoT's policy composition flow diagram
4. **Performance Comparison**: Bar charts comparing key metrics

All figures should use:
- Colorblind-safe palettes (Okabe-Ito)
- Vector format (PDF)
- Self-contained captions
39 changes: 39 additions & 0 deletions papers/split-computing-survey/figures/taxonomy_timeline.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
% TikZ figure: Adaptation Mechanism Evolution Timeline
% For use in LaTeX paper with \input{figures/taxonomy_timeline.tex}

\begin{figure}[!t]
\centering
\begin{tikzpicture}[
era/.style={rectangle, rounded corners, draw, fill=blue!10, thick, minimum width=3cm, minimum height=1.2cm, align=center},
transition/.style={->, thick, shorten <=2pt, shorten >=2pt},
year/.style={font=\small\bfseries}
]

% Timeline
\draw[thick, ->] (0,0) -- (14,0);

% Era boxes
\node[era] (static) at (2,1) {Static\\(2018--2022)\\Fixed split points};
\node[era] (heuristic) at (4.5,1) {Heuristic-driven\\(2021--2024)\\Condition rules};
\node[era] (closed) at (7,1) {Closed-adapter\\(2024--2025)\\Adapter training};
\node[era] (intent) at (9.5,1) {Intent-driven\\(2024--2025)\\Semantic goals};
\node[era, fill=red!20] (policy) at (12,1) {Policy-driven\\(2025--2026)\\Multi-objective};

% Year markers
\node[year] at (2,-0.5) {2020};
\node[year] at (4.5,-0.5) {2023};
\node[year] at (7,-0.5) {2025};
\node[year] at (9.5,-0.5) {2025};
\node[year] at (12,-0.5) {2026};

% Framework examples
\node[align=center, font=\scriptsize, below=0.3cm of static] {BranchyNet\\EdgeDNN};
\node[align=center, font=\scriptsize, below=0.3cm of heuristic] {Furcifer\\DistrEE\\GOODSPEED};
\node[align=center, font=\scriptsize, below=0.3cm of closed] {SALT};
\node[align=center, font=\scriptsize, below=0.3cm of intent] {AVERY\\FusionSense};
\node[align=center, font=\scriptsize, below=0.3cm of policy] {SCIoT\\Moebius};

\end{tikzpicture}
\caption{Split Computing evolution through adaptation mechanisms. SCIoT represents the policy-driven frontier with multi-objective optimization.}
\label{fig:timeline}
\end{figure}
Loading
Loading