defmodule Dsxir do
@moduledoc """
Top-level facade for the dsxir framework. Re-exports the user-facing entry
points; predictors, adapters, optimizers, and LM impls are reached for under
their own module names.
"""
defdelegate configure(opts), to: Dsxir.Settings
defdelegate context(frame, fun), to: Dsxir.Settings
@doc """
Run `fun.()` with a per-process trace accumulator open. The block must return
`{program, prediction}` (the standard `forward/2` shape). The helper returns
`{program, prediction, trace}` where `trace` is the list of recorded entries
in invocation order.
The accumulator is process-local. Inside the block, any `Dsxir.Module.call/3`
running in the calling process records an entry; calls inside spawned tasks
(`Dsxir.Predictor.Parallel`, user-supplied `Task`s) do not — Trace does not
cross process boundaries in v0.
When `fun.()` raises, throws, or exits, the prior accumulator is restored in
the matching `rescue` / `catch` clause and the original condition is
reraised. Partial traces on failure are not surfaced.
"""
@spec with_trace((-> {Dsxir.Program.t(), Dsxir.Prediction.t()})) ::
{Dsxir.Program.t(), Dsxir.Prediction.t(), [Dsxir.Trace.entry()]}
def with_trace(fun) when is_function(fun, 0) do
prior = Dsxir.Trace.start()
try do
{program, prediction} = fun.()
{program, prediction, Dsxir.Trace.stop(prior)}
rescue
e ->
_ = Dsxir.Trace.stop(prior)
reraise e, __STACKTRACE__
catch
kind, reason ->
_ = Dsxir.Trace.stop(prior)
:erlang.raise(kind, reason, __STACKTRACE__)
end
end
defdelegate evaluate(ev, program), to: Dsxir.Evaluate, as: :run
defdelegate evaluate!(ev, program), to: Dsxir.Evaluate, as: :run!
defdelegate compile(impl, student, trainset, metric, opts), to: Dsxir.Optimizer
defdelegate save(program, path), to: Dsxir.Artifact
defdelegate save!(program, path), to: Dsxir.Artifact
defdelegate load(target_module, path, opts \\ []), to: Dsxir.Artifact
defdelegate load!(target_module, path, opts \\ []), to: Dsxir.Artifact
end