Repository navigation
v4.7.2
CLI
- Added: the
Lumice raypathsubcommand (#445) — the physics behind one raypath, without
the UI.Lumice analyzelists 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 areachfield 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).--warmre-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,--reportasks 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), orunfinishedwith 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 markedpartial, 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_brdisplay 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_VERSION449 → 452 (#445, #464, #468) — new functions only; nothing
existing changed shape or meaning. v450 addsLUMICE_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_COUNTbounds. 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.his 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.cmakeand 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_VERSION1 → 7 (#444, #446, #468) — the analytic library's
surface grew to two modules plus diagnostic numerics: module A
(LUMICE_ANALYTIC_EvaluatePath,TraceFiber/TraceFiberBatchwith 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 withfind_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