Skip to content

multifat criteria comparison (FIG. R02.2) and automatic refresh of code-generated figures - #57

Merged
andreachiocca merged 4 commits into
masterfrom
claude/step-5b-multifat-comparison
Nov 6, 2026
Merged

andreachiocca merged 4 commits into
masterfrom
claude/step-5b-multifat-comparison

Conversation

@andreachiocca

@andreachiocca andreachiocca commented Nov 5, 2026 •

Copy link
Copy Markdown
Owner

Follows #56 (merged); the diff now contains only this step.

Preview (available once the preview check succeeds):

1. FIG. R02.2: criteria compared (step 5b)

A matrix of 38 multiaxial fatigue criteria × 6 materials with life data, produced by multifat-pipeline --all (multiaxial-fatigue 67f06ea). The caption presents it as the open benchmark of the multifat library, regenerated whenever the library changes.

Rows are the criteria, grouped by family: critical plane, invariant, integral, energy.

Columns are the materials, ordered by number of tests:

  • Al7075-T6
  • Ti6Al4V Berto
  • 42CrMo4 QT
  • AISI316L
  • 42CrMo4 Reis
  • Ti6Al4V

Metric. The load-equivalent error is $e_L=\ln(1/s^\ast)$, where $s^\ast$ scales the load history until the calibrated criterion predicts the observed life (multifat.eval.load_error).

Two views:

  • share of tests within ±10 % of the load;
  • mean $e_L$ on a diverging scale, where amber is non-conservative and teal is conservative.

Interaction. Hovering a cell, or moving with the arrow keys, shows the criterion (with its DOI), its complexity facets, n, the shares within ±10/±20 % and the mean $e_L$ ± SD.

What $e_L$ measures

The caption has a disclosure, in EN and IT, that explains:

  • the definition of $s^\ast$ and $e_L$;
  • the sign convention, with a worked example: $e_L=+0.10$ means a match only at about 0.90 × the load, i.e. conservative;
  • why the load scale is independent of the S–N slope and of the degree of the damage parameter;
  • the within-band shares, bias and scatter;
  • what is counted;
  • the open independence caveat from multifat issue Update academic profile, publications and FABER research outputs #14.

Complexity shown beside the score

Three facets are read from the multifat registry; none of them is a computed score:

  • the inputs: stress only, or stress and strain ($E,\nu$);
  • the life law: calibrated master curve $DP=A,N^b$, or the criterion's own law;
  • the declared material constants, with optional ones marked *.

The matrix shows the first two as dot columns ε and N; the readout lists all three. The composite ranking KPI is proposed in andreachiocca/multiaxial-fatigue#57 and belongs to multifat; the site will draw it once multifat computes it.

What is counted

Only assessment observations (Flag = 1, failures not used for calibration). Not counted:

  • design points;
  • run-outs;
  • the seven workbooks that contain only fatigue limits.

Cells marked not applicable are combinations the pipeline does not run. RFB, for example, falls outside its validity range $0.577<t_{-1}/s_{-1}<0.866$ on GGG60 and AISI316L.

Generator and tests

scripts/generate_multifat_comparison.py only collects the pipeline outputs:

  • Comparison/summary_error_stats_by_role.csv;
  • comparison_capabilities.csv;
  • the registry.

tests/test_multifat_comparison.py checks:

  • the pin;
  • that the metric is Error_load restricted to assessment observations;
  • the families;
  • that each share is k/n with within10 ≤ within20;
  • that $|\bar e_L|\le\ln(1/0.9)$ whenever every test is within ±10 %;
  • that the complexity facets are declared and no score is present;
  • the chapter binding and the i18n keys.

2. Figures always up to date

  • _data/figure_sources.yml: one pinned commit per figure (T01, R02.1, R02.2, R03.1). Includes read the commit from this file, and each test checks that it matches its JSON.
  • scripts/refresh_figures.py: compares each pin with the HEAD of the source repository. When the source has moved, it clones it, installs it, reruns that figure's generator and updates the pin.
  • .github/workflows/refresh-figures.yml:
    • runs every Monday, plus workflow_dispatch (with force) and repository_dispatch (research-code-updated);
    • regenerates the figures and runs the unit tests;
    • opens or updates the automation/refresh-figures PR;
    • dispatches build.yml and preview.yml itself, because PRs opened with GITHUB_TOKEN trigger no workflows.
  • Tested locally end to end on T01: 5cd5124 → 67f06ea. Only the provenance changes; the values are identical.

3. Other changes

  • Research chapters take a figures list in _data/research_areas.json, so chapter 01 holds R02.1 and R02.2.
  • CLAUDE.md and docs/site-roadmap.md are updated.

Verification (local)

  • unittest passes.
  • Ruby checks pass.
  • Production build and all page verifiers pass.
  • Browser checks match the master baseline (CDN errors from this environment).
  • Screenshots checked at 1280 and 375 px, EN and IT.

🤖 Generated with Claude Code

https://claude.ai/code/session_01KzHgFgeEYmpqcsxvvbphUy

seancp (pinned a3ade97) computes everything: evaluate_fs_ext on a 3 degree
hemisphere grid, the three seancp_fs_ext plane families with the restricted
maximum, and the full_plane_scan reference, for the four largest Phase 3
underpredictions plus two controls. The sphere shows where the restricted
search lies and where the true critical plane is; coinciding families are
flagged by the generator. Tests reproduce the Phase 3 reference table.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KzHgFgeEYmpqcsxvvbphUy
- SeAn-CP paths (FIG. R02.1) sit in chapter 01, critical plane methods;
  sharCP master curves (FIG. R03.1) in chapter 02, welded structures. Bound
  through a 'figure' key in research_areas.json, full width after the
  chapter's illustration, instead of loose at the end of the page.
- Repository cards for sharCP, its Zenodo dataset and SeAn-CP link their
  research context straight to the figure built from them.
- Numbering follows the chapter illustration (R02.1, R03.1) and the Thesis
  sphere becomes FIG. T01, ending the clash with the R02-R05 chapter labels.
- verify_research_atlas counts the chapter's own context disclosure, not the
  captions of embedded figures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KzHgFgeEYmpqcsxvvbphUy
…resh

FIG. R02.2 in Research chapter 01: 38 multiaxial fatigue criteria x 6
materials with life data, from multifat-pipeline --all. Colour is the
share of assessment tests within +/-10 % of the load, or the mean
load-equivalent error e_L = ln(1/s*); design points, run-outs and
fatigue-limit-only workbooks are excluded.

Source commits of every code-generated figure move to
_data/figure_sources.yml. scripts/refresh_figures.py regenerates the
figures whose source repository has new commits, and the weekly
refresh-figures workflow opens a PR and dispatches build and preview.
FIG. T01 is refreshed to multiaxial-fatigue 67f06ea (values unchanged).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KzHgFgeEYmpqcsxvvbphUy
…FIG. R02.2

The figure caption now explains, step by step, what s* and e_L = ln(1/s*)
mean, the sign convention, why the load scale is independent of the S-N
slope and of the DP degree, what is counted, and the open independence
caveat (multifat issue #14).

Complexity facets come from the multifat registry: stress-only or strain
inputs, master curve or native life law, and the declared material
constants. They are shown beside the score as two dot columns and in the
cell readout, not folded into a composite score.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KzHgFgeEYmpqcsxvvbphUy
@andreachiocca
andreachiocca merged commit a6f8cb2 into master Nov 6, 2026
4 checks passed

This branch was previously deployed

1 inactive deployment
website-preview-AC — ac34d9a9 Deployed Nov 5, 2026 by andreachiocca via preview #120
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants