Skip to content

v4.7.2

Choose a tag to compare

@github-actions github-actions released this 07 Oct 11:34
· 333 commits to main since this release
215a850

CLI

  • Added: the Lumice raypath subcommand (#445) — the physics behind one raypath, without
    the UI. Lumice analyze lists a scene's raypaths; Lumice raypath --crystal <n> --path <p>
    takes one of them and reports what the light does through that one crystal: fiber components
    at a sky point (seed search, then the fiber walk — the level set on the sun-direction sphere),
    per-point detail (crystal pose, the sun as seen inside the crystal, segment directions,
    per-interface energy), a grid over the sun-direction sphere, and a reach field that splits
    an empty result three ways — a degenerate point-mass path, a geometrically unreachable
    target, and a target not excluded but not found (most often because no finite crystal admits
    the passage). --warm re-reads a previous run's JSON and densifies from its seeds. The result
    is serialized once in the engine (target schema 1, doc/raypath-cli-output.md; user-manual
    section in en/zh). This is the analysis half of the raypath feature: the GUI workspace it
    feeds is still being designed, and the JSON grows by appended fields only.
  • Added: Lumice raypath --report — target-free feature diagnostics (#464, #468). Instead
    of following one chosen path, --report asks which halo features the document's actual
    spectrum, crystal shape and orientation fold can support, and answers per candidate with a
    three-tier verdict — actual (confirmed by sampled evidence), candidate (plausible but
    under-evidenced), or unfinished with its reason — alongside per-wavelength finite-crystal
    A·T estimates, convergence evidence, positions and explicit coverage limits. A combined
    numerical budget bounds the work (--budget-ms, default 15 s, max 120 s;
    --max-evaluations; --max-field-evaluations); a run that exhausts it still emits its
    partial report marked partial, and a report that fails to parse leaves stdout empty.
    Serialization is report schema 2 (doc/raypath-cli-output.md §7); the target/fiber/--warm
    contracts above are unchanged.

GUI

  • Fixed: window geometry at fractional Windows display scales (#465). Match Background
    computed its window size from an unscaled minimum, so at a fractional scale the system
    imposed its own scaled minimum instead — changing the preview's aspect ratio and leaving
    blank bands above and below the image. Startup, aspect presets and scale changes now share
    one geometry model (current monitor work area, actual decoration sizes, scaled minimums);
    programmatic resizes settle as bounded transactions that expire unconfirmed results rather
    than act on them; and a preview area that cannot represent the requested aspect is clamped
    and reported from the actual area.
  • Changed: import diagnostics live in one Load Notice (#466). The warnings raised while
    loading a document are consolidated into a single load-time notice, and a preview restored
    from cache states what its texture mode can and cannot show (recommending Run then Save)
    instead of leaving the limitation implicit. Cached previews are kept; nothing reruns behind
    the user's back.

Rendered output (GUI + CLI)

  • Fixed: sporadic light-leak points on Parry-oriented scenes (#472). Single bright pixels
    near azimuth 160–162°, altitude ≈0° (beta-reported, no multi-scattering). CPU and Metal
    judged whether a spawned child ray had left the crystal implicitly: the face it was born on
    could win the min-t race at t ≈ 0⁺ and slip past a guard whose epsilon has the wrong
    dimension for grazing children (t = δ/denom, so denom → 0 blows a ~1 ulp plane residual past
    any fixed ε) — the child then re-hit its own birth face, TIR'd back inside and exited
    unphysically. Each event carries ~1e-5 of the ray's energy but is visible because
    grazing-incidence Fresnel reflection is near-total. Children are now classified at birth by
    the pure sign of the source denominator, in CPU and Metal (CUDA already had the semantics;
    the three backends now share one shape), which also removes the edge-birth phantom family.
  • Fixed: the channel_br display mode no longer subtracts the sky into the diagnostic
    (#466). The B−R difference used to include the configured sky background — an empty blue
    sky rendered white, which is background, not signal. Both the CLI's and the GUI's B−R output
    now diagnose halos only; the post-gamma formula, gain, exposure, masking and annotations are
    unchanged, so a scene whose sky contributes no channel difference renders as before.

Engine C API

  • Added: LUMICE_API_VERSION 449 → 452 (#445, #464, #468) — new functions only; nothing
    existing changed shape or meaning. v450 adds LUMICE_AnalyzeSinglePath /
    LUMICE_SinglePathResultToJson / LUMICE_SinglePathResultDestroy — the single-path result
    is serialized once in the engine, and the CLI and the future GUI read the same JSON — plus
    LUMICE_SetLogLevel(NULL) to set the engine-wide log level. v451 adds the
    path-feature-report entry points with their
    LUMICE_PATH_FEATURE_REPORT_MAX_SAMPLE_COUNT / ..._MAX_WAVELENGTH_COUNT bounds. v452 adds
    a report-request suffix carrying budgets, observation, layer and symmetry bits; requests in
    the old prefix form are accepted with the new defaults.
  • Changed: the single lumice.h is gone; the C API is six capability headers (#453) —
    lumice_{base,scene,render,editor,engine,raypath}.h, one bridge file per header, same
    functions and values: the split left the export tables byte-identical and moved neither API
    version. The engine and testapi shared libraries additionally export the analytic capability
    (lumice_analytic_core.h), and each packaged library's export surface is declared once in
    cmake/export_surfaces.cmake and checked in CI and at packaging time. The headers still do
    not ship in the download packages, so this reaches source-level consumers only.

liblumice_analytic

  • Added: LUMICE_ANALYTIC_API_VERSION 1 → 7 (#444, #446, #468) — the analytic library's
    surface grew to two modules plus diagnostic numerics: module A
    (LUMICE_ANALYTIC_EvaluatePath, TraceFiber / TraceFiberBatch with per-pose diagnostics,
    DiscoverComponents), module B (LUMICE_ANALYTIC_BandSum — bounded sums over sampled
    poses, rank-0 point-mass branch included), and the v7 diagnostics (batch diagnostic
    evaluation, source-event brackets, weighted-field values, fixed-observation colour bands).
    The kernels are pinned against Lumice Integral by replayed parity fixtures. Consumers build
    against the install tree with find_package(LumiceAnalytic 7); the library is not yet part
    of the download packages.

What's Changed

  • ci: add top-level permissions: contents: read to workflows by @LoveDaisy in #443
  • liblumice_analytic module A v0: EvaluatePath, TraceFiber, DiscoverComponents + LI parity by @LoveDaisy in #444
  • Lumice raypath: single-path analysis module, lumice.h v4.50 entry, D4 verification by @LoveDaisy in #445
  • liblumice_analytic wave 2: per-pose diagnostics (API 5), band sum module B (API 6), 93 LI parity fixtures by @LoveDaisy in #446
  • docs(analytic): three kinds of critical lines; LI 31c682e parity fixtures (94) by @LoveDaisy in #452
  • Organize the C API and engine by capability by @LoveDaisy in #453
  • Split c_api_scene.cpp into bridge, encoder and decoder by @LoveDaisy in #455
  • scrum ci-time-governance (WIP): build-time landing by @LoveDaisy in #451
  • ci: continue time-governance calibration by @LoveDaisy in #462
  • docs(ci): close time-governance acceptance by @LoveDaisy in #463
  • Add target-free raypath feature diagnostics and scientific acceptance by @LoveDaisy in #464
  • fix(gui): keep background aspect ratios consistent across UI scales by @LoveDaisy in #465
  • fix(render): exclude sky background from B-R diagnostic by @LoveDaisy in #466
  • fix(testing): isolate local slow pytest performance pool by @LoveDaisy in #467
  • feat(raypath): phase-1 raypath feature diagnostics (scrum-649) by @LoveDaisy in #468
  • refactor(raypath): module design cleanup — role-based naming, detail/ demote, JSON single-owner by @LoveDaisy in #469
  • fix(sky-direction): resolve convention-mismatch investigation — call sites proven correct, defense lines landed by @LoveDaisy in #470
  • docs(cases): add raypath analysis scenario-case corpus index by @LoveDaisy in #471
  • fix(core): classify outward children at birth in CPU/Metal slab traversal by @LoveDaisy in #472
  • docs(corpus): C12 tint multi-caliber + C06 LI closed-form anchor by @LoveDaisy in #473
  • chore(release): cut 4.7.2 by @LoveDaisy in #474

Full Changelog: v4.7.1...v4.7.2