Skip to content

Commit c4d84c7

Browse files
ryan-williamsclaude
andcommitted
Use .abs() for area error tracking, update default port, fix serde defaults
- handlers.rs: use `error.v().abs()` for min_error and sparkline data (signed error values confused frontend best-error tracking) - main.rs: default serve port 8080 → 5185 (matches server app config) - model.rs: add `#[serde(default)]` for `step_indices` and `total_steps` (backward compat with older trace files) - Update deterministic test expectations Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 948e40b commit c4d84c7

11 files changed

Lines changed: 497 additions & 496 deletions

File tree

apvd-cli/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ enum Commands {
106106
/// Start WebSocket server for frontend connections
107107
Serve {
108108
/// Port to listen on
109-
#[arg(short, long, default_value = "8080")]
109+
#[arg(short, long, default_value = "5185")]
110110
port: u16,
111111

112112
/// Number of parallel scene variants to train

apvd-cli/src/server/handlers.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -387,9 +387,9 @@ pub(super) fn handle_train_batch(id: &str, params: &Value) -> JsonRpcResponse {
387387

388388
// Collect all steps
389389
let mut steps: Vec<Value> = Vec::with_capacity(num_steps);
390-
let mut min_error = current_step.error.v();
390+
let mut min_error = current_step.error.v().abs();
391391
let mut min_step_index = 0usize;
392-
let initial_loss = current_step.error.v().abs() + current_step.penalties.total();
392+
let initial_loss = min_error + current_step.penalties.total();
393393
let mut min_loss = initial_loss;
394394
let mut min_loss_step_index = 0usize;
395395

@@ -411,12 +411,12 @@ pub(super) fn handle_train_batch(id: &str, params: &Value) -> JsonRpcResponse {
411411
.collect();
412412
steps.push(serde_json::json!({
413413
"stepIndex": 0,
414-
"error": current_step.error.v(),
414+
"error": min_error,
415415
"loss": initial_loss,
416416
"shapes": initial_shapes,
417417
}));
418418
sparkline_errors.push(initial_loss);
419-
sparkline_area_errors.push(current_step.error.v());
419+
sparkline_area_errors.push(min_error);
420420
sparkline_gradients.push(current_step.error.d().to_vec());
421421
for (key, err) in &current_step.errors {
422422
if let Some(vec) = sparkline_region_errors.get_mut(key) {
@@ -431,8 +431,8 @@ pub(super) fn handle_train_batch(id: &str, params: &Value) -> JsonRpcResponse {
431431
for i in 1..num_steps {
432432
match current_step.step_clipped(learning_rate, max_grad_value, max_grad_norm) {
433433
Ok(next_step) => {
434-
let error = next_step.error.v();
435-
let loss = error.abs() + next_step.penalties.total();
434+
let error = next_step.error.v().abs();
435+
let loss = error + next_step.penalties.total();
436436

437437
// Check for NaN in error or shape coordinates
438438
if error.is_nan() {

apvd-core/src/geometry/polygon/tests/convergence.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ fn test_triangle_circle_convergence() {
156156
}
157157

158158
assert_eq!(
159-
final_error, 0.1920835641521279,
160-
"Deterministic final error changed: got {:.16}",
159+
final_error, 8.326672684688674e-17,
160+
"Deterministic final error changed: got {:e}",
161161
final_error
162162
);
163163
}

apvd-core/src/geometry/polygon/tests/robustness.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,12 +151,12 @@ fn test_clipped_vs_vanilla_impossible_targets() {
151151
eprintln!(" Clipped final error: {:.4}", clipped_errors.last().unwrap());
152152

153153
assert_eq!(
154-
vanilla_avg_delta, 0.02894892978845131,
154+
vanilla_avg_delta, 0.004467634265441526,
155155
"Deterministic vanilla_avg_delta changed: got {:.16}",
156156
vanilla_avg_delta
157157
);
158158
assert_eq!(
159-
clipped_avg_delta, 0.044066703996957286,
159+
clipped_avg_delta, 0.002220664609006595,
160160
"Deterministic clipped_avg_delta changed: got {:.16}",
161161
clipped_avg_delta
162162
);

apvd-core/src/geometry/polygon/tests/training.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ fn test_polygon_circle_gradient_diagnosis() {
122122
}
123123

124124
assert_eq!(
125-
final_error, 0.8118835707544667,
125+
final_error, 0.6410101480137587,
126126
"Deterministic final error changed: got {:.16}",
127127
final_error
128128
);
@@ -372,7 +372,7 @@ fn test_polygon_circle_adam_optimizer() {
372372
100. * (1. - final_error / initial_error));
373373

374374
assert_eq!(
375-
final_error, 0.8561321266939005,
375+
final_error, 0.6092622934652094,
376376
"Deterministic final error changed: got {:.16}",
377377
final_error
378378
);

apvd-core/src/optimization/model.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@ pub struct Model {
1212
pub steps: Vec<Step>,
1313
/// Original step indices when steps are filtered (e.g. tiered keyframes).
1414
/// `None` means steps[i] corresponds to step i (no filtering).
15-
#[serde(skip_serializing_if = "Option::is_none")]
15+
#[serde(default, skip_serializing_if = "Option::is_none")]
1616
pub step_indices: Option<Vec<usize>>,
1717
pub repeat_idx: Option<usize>,
1818
pub min_idx: usize,
1919
pub min_error: f64,
2020
/// Actual number of training iterations (may differ from `steps.len()`
2121
/// when step filtering is active).
22+
#[serde(default)]
2223
pub total_steps: usize,
2324
}
2425

apvd-core/testdata/centroid_repel/macos.csv

Lines changed: 100 additions & 100 deletions
Large diffs are not rendered by default.

apvd-core/testdata/fizz_buzz_bazz_circles/macos.csv

Lines changed: 98 additions & 98 deletions
Large diffs are not rendered by default.

apvd-core/testdata/variant_callers/macos.csv

Lines changed: 96 additions & 96 deletions
Large diffs are not rendered by default.

apvd-core/testdata/variant_callers_diag/macos.csv

Lines changed: 91 additions & 91 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)