| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
energy meters on real hardware / RAPL and NVML on jetson-hub (pull_request) Successful in 33s
jouleclaw public surface must stay documented / Public-surface audit (jouleclaw-rs) (pull_request) Successful in 58s
standards workspaces build + test / arl-rs (pull_request) Successful in 1m7s
standards workspaces build + test / eoc-rs (pull_request) Successful in 1m53s
standards workspaces build + test / jcp-rs (pull_request) Successful in 1m27s
standards workspaces build + test / joule-ui-rs (pull_request) Successful in 1m8s
standards workspaces build + test / joulehook-rs (pull_request) Successful in 1m9s
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 1m52s
standards workspaces build + test / aac-rs (pull_request) Successful in 1m2s
standards workspaces build + test / proof-rs (pull_request) Successful in 1m14s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 50s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 33s
standards workspaces build + test / map-rs (pull_request) Successful in 32s
standards workspaces build + test / sandbox-rs (pull_request) Successful in 2m10s
standards workspaces build + test / mesh-rs (pull_request) Successful in 28s
standards workspaces build + test / sense-rs (pull_request) Successful in 1m5s
standards workspaces build + test / openpay (pull_request) Successful in 1m34s
standards workspaces build + test / smart-byte-rs (pull_request) Successful in 3m37s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 3m55s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 9m18s
Two tests failed on the dev Mac, which is also the macOS CI runner, at
load averages of 101-179. Neither failure was in the meters:
- eoc-meter `the_probe_burns_its_tick_of_thread_cpu_between_samples`.
A tick burned only 9.6 ms of the thread's CPU, under the 12.5 ms
floor, because its 500 ms wall cap cut it short. The test's own
message names that cap as the one thing allowed to shorten a tick,
but the test could not tell it apart: ProbeRun recorded no tick's
wall time. It now records each tick's wall time (`tick_walls`;
recorded, never decided on). A tick that ran its whole wall cap is
accepted as cut short, but only if it still spun, burning at least
1 ms of CPU. Any other tick must burn at least half its 25 ms, as
before.
- jouleclaw-energy `process_cpu`. The `/bin/sh` child, run for a fixed
300 ms, got 0.076 J of CPU against a 0.2 J sanity floor (load average
170). It failed 3 of 3 runs. The child now runs until its own counter
reads 0.2 J (at least 300 ms, at most 5 s), as eoc-meter's equivalent
test already does. The parent's window still spans the child's whole
run.
Both pass at a load average of 333. Both tick mutations are caught: a
tick that sleeps through its wall cap ("ran its whole 504.6ms wall cap
and burned only 87.375µs ... it waited, not spun"), and one that sleeps
25 ms.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
||
| .. | ||
| crates | ||
| Cargo.lock | ||
| Cargo.toml | ||
| README.md | ||
| rust-toolchain.toml | ||
eoc-rs — EOC reference implementation in Rust
Apache-2.0 reference implementation of the Energy-Optimized Compute specification (CC-BY-4.0 spec lives in ../spec/).
EOC is a four-stage memoizing cascade. Every query is tried at each stage in turn and the first that can answer wins. The four stages, cheapest to most expensive, are:
- Cache (
eoc-cache) — content-addressed LRU. Cache hits are nearly free. - Key-value (
eoc-kv) — exact key match plus cosine-similarity embedding match. - Graph (
eoc-graph) — triple-store retrieval. Reference impl is a small in-memory matcher; production deployments swap in a real graph backend driven by DCY (EOC-4). - Neural (
eoc-neural) — last-resort inference. Reference impl ships anEchoBackend; production deployments wire in llama.cpp / Ollama / Anthropic API / etc.
Joule cost is the unit of accounting. The eoc-meter crate reads cumulative micro-joules from whatever whole-work hardware counter is available and live (Linux RAPL, Apple Silicon IOReport; NVIDIA NVML behind the cuda feature is GPU telemetry, never the cascade's counter) and falls back to a StubCounter everywhere else — including WASM.
Workspace layout
| Crate | Purpose |
|---|---|
eoc-core |
Types: Query, Response, Stage, JouleCost, Receipt. |
eoc-cache |
Stage 1 — LRU cache + the Stage trait. |
eoc-kv |
Stage 2 — KV + embedding-similarity lookup. |
eoc-graph |
Stage 3 — in-memory triple store. |
eoc-neural |
Stage 4 — neural inference trait + EchoBackend. |
eoc-meter |
Hardware energy counters with stub fallback. |
eoc-cascade |
Glue: walks the four stages, attributes joule cost. |
eoc |
Reference CLI. |
eoc-wasm |
wasm-bindgen wrapper — browser-runnable cascade. |
Running
cargo test --workspace
cargo clippy --workspace --all-targets
cargo run --bin eoc -- query "what is 2+2"
cargo run --bin eoc -- meter
Example output:
$ cargo run --bin eoc -- query "what is 2+2"
stage : kv
payload: 4
cost : 50 µJ (estimated)
receipt: <64-char hex>
CUDA / NVML
NVIDIA NVML support is feature-gated and off by default so the workspace builds without libnvidia-ml. NVML's total-energy counter reads the GPU alone, so detect() never hands it to the cascade, whose costs carry no field to say a figure covers part of the work: NvmlCounter is GPU telemetry, read beside the whole-work counter, and it is constructed only while its counter is live and counts no faster than the board can draw. To enable:
cargo build -p eoc-meter --features cuda
WASM
The cascade compiles to wasm32-unknown-unknown. The meter does not — RAPL, NVML, and powermetrics are all absent in the browser, so WASM builds use StubCounter and report estimated joule cost.
rustup target add wasm32-unknown-unknown
cargo build -p eoc-wasm --target wasm32-unknown-unknown --release
wasm-bindgen target/wasm32-unknown-unknown/release/eoc_wasm.wasm \
--out-dir ./pkg --target web
Then from JavaScript:
import init, { WasmCascade } from "./pkg/eoc_wasm.js";
await init();
const cascade = new WasmCascade();
const r = await cascade.resolve("ping");
console.log(r); // { stage: "kv", payload: "pong", microjoules: 50, ... }
License
Apache-2.0 for the Rust source in this workspace. The EOC specification text in ../spec/ is CC-BY-4.0. See ../LICENSE.