Skip to content

Releases: rohanpandula/digital-fauxice

Digital FauxIce 0.3.1

Choose a tag to compare

@rohanpandula rohanpandula released this 23 Jul 06:42

Adds deterministic bounded tiling for large-frame Hybrid synthesis, receipt-visible routing policy, wheel-safe source/schema packaging, and full-size LS-5000 repair support. Hybrid remains fail-closed and enforces the caller-provided synthesized-pixel ceiling.

Digital Fauxice v0.3.0

Choose a tag to compare

@rohanpandula rohanpandula released this 18 Jul 12:26

A Metal backend and the hybrid repair tool

Two additions since v0.2.0.

The engine gains a Metal backend for Apple Silicon. It holds the same receipt-backed claim as the CUDA and compiled CPU backends: byte-identical output, counters, RNG accounting, and diagnostics planes against the CPU reference on both complete validation frames, 26 binding checks per frame. Apple GPUs have no double-precision hardware, so every binary64 operation runs through a software IEEE-754 implementation in integer arithmetic, which no compiler mode can contract or reassociate. About eight seconds per full 4000 dpi frame on an M4 Mac mini. A startup self-test proves byte parity in every process before a real frame is accepted, and the backend fails closed with a specific reason when the Metal binding, a device, or the compiled host writer is missing. The auto order is now cuda, metal, cpu-fast, cpu. Receipts: evidence/metal-frame-1-parity.json and metal-frame-2-parity.json.

The hybrid repair tool is now published in this repo under hybrid/ as the fauxce-hybrid package. It routes unusually broad defects, where the engine's defect score saturates at its floor, to a bounded LaMa inpainting fallback, and leaves the exact result everywhere else. Every synthesized pixel is disclosed in a mask, receipts bind every artifact by hash, outside-mask bytes are guaranteed identical to the pure output, and the routed area is capped at 2% of the frame. Both validation frames were reproduced byte-for-byte on this release's engine before publication. The IOPaint 1.6.0 runtime and the big-lama weights are supplied by the user and never redistributed; the docs cover the pinned setup and the weight checksum. Inpainting runs on cpu; mps is refused because IOPaint 1.6.0 blocklists LaMa on MPS and would otherwise silently run on cpu while reporting mps.

Backend Time per full 4000 dpi frame Requires
cpu (reference) roughly an hour numpy only
cpu-fast 9.2 to 9.5 s the fast extra (numba)
metal about 8 s (Apple M4) the metal extra (pyobjc, numba)
cuda 5.3 to 5.8 s (RTX A4000) the cuda extra (cupy, numba, NVIDIA driver)

Install

python -m pip install \
  "portable-digital-ice[metal] @ https://github.com/rohanpandula/digital-fauxice/releases/download/v0.3.0/portable_digital_ice-0.3.0-py3-none-any.whl"
python -m pip install \
  https://github.com/rohanpandula/digital-fauxice/releases/download/v0.3.0/fauxce_hybrid-0.3.0-py3-none-any.whl

The parity receipts binding this source tree are evidence/metal-frame-*-parity.json; the cuda and cpu-fast receipts bind the tree they were minted on and chain to the same pinned fixture hashes.

Digital Fauxice v0.2.0

Choose a tag to compare

@rohanpandula rohanpandula released this 18 Jul 08:33

What changed since v0.1.0

The v0.1.0 wheel was built before the compiled CPU backend and the host-side CUDA writer chain landed, so it shipped only the reference CPU path and the old device-writer CUDA design. This wheel carries all three current backends:

Backend Time per full 4000 dpi frame Requires
cpu (reference) roughly an hour numpy only
cpu-fast 9.2 to 9.5 s (Apple M4) the fast extra (numba)
cuda 5.3 to 5.8 s (RTX A4000) the cuda extra (cupy, NVIDIA driver)

Both compiled backends prove byte parity against the reference on a synthetic job at startup and refuse to run if that proof fails.

The fast and cuda extras now accept numba 0.65. The previous >=0.66 floor reflected the validation host rather than a requirement: the kernels use nothing that 0.66 added, and the byte-parity self-test, the full fast_cpu suite, and a complete process() run all pass identically under numba 0.65.1 with numpy 2.4.4. Applications already pinned to numba 0.65.x can use the compiled backend without moving their pin.

Install

python -m pip install \
  "portable-digital-ice[fast] @ https://github.com/rohanpandula/digital-fauxice/releases/download/v0.2.0/portable_digital_ice-0.2.0-py3-none-any.whl"

The parity receipts that bind this source tree are evidence/cpu-fast-frame-*-parity.json and evidence/cuda-frame-*-parity.json.

Digital Fauxice v0.1.0

Choose a tag to compare

@rohanpandula rohanpandula released this 17 Jul 16:27

First public proof-of-concept release of Digital Fauxice.

This release reproduces the Nikon LS-5000 selector-8 Digital ICE Normal path on two independent native 4000 dpi frames. Each complete frame compared 68,447,316 RGB16 samples with zero mismatches. The second frame used the frozen implementation without retuning.

Included in this release:

  • an exact Python and NumPy CPU reference;
  • an exact CUDA backend validated on both complete frames;
  • roughly 21-second full-frame processing on an NVIDIA RTX A4000;
  • deterministic RNG, startup, edge, and partial-final-block behavior;
  • fail-closed input and profile validation;
  • synthetic tests and sanitized parity receipts; and
  • documentation of the recovery and validation process.

The supported boundary is deliberately narrow: Nikon Super Coolscan 5000 ED, Digital ICE Normal, selector 8, and the validated metric-4000 dual-RGBI acquisition. Scanner acquisition, TIFF workflow, Apple Metal acceleration, and broader hardware support remain future work. Negative inversion and color rendering are a separate project and are not included here.