use rlx_ir::Graph;
use rlx_runtime::backend::ExecutableGraph;
use rlx_runtime::{
Backend, BufferHandle, CompileOptions, Device, register_backend, registered_devices,
};
struct FakeCudaBackend;
struct FakeExecutable;
impl ExecutableGraph for FakeExecutable {
fn set_param(&mut self, _name: &str, _data: &[f32]) {}
fn run(&mut self, _inputs: &[(&str, &[f32])]) -> Vec<Vec<f32>> {
vec![vec![42.0_f32; 4]]
}
}
impl Backend for FakeCudaBackend {
fn compile(&self, _graph: Graph, _options: &CompileOptions) -> Box<dyn ExecutableGraph> {
Box::new(FakeExecutable)
}
}
fn main() {
println!("Builtins registered: {:?}", registered_devices());
register_backend(Device::Cuda, || {
Box::new(FakeCudaBackend) as Box<dyn Backend>
});
println!("After register Cuda: {:?}", registered_devices());
let _ = BufferHandle::new("dummy", &[1], rlx_ir::DType::F32);
let g = {
use rlx_ir::*;
let mut g = Graph::new("dummy");
let x = g.input("x", Shape::new(&[4], DType::F32));
g.set_outputs(vec![x]);
g
};
let mut exe = rlx_runtime::backend_for(Device::Cuda)
.expect("Cuda factory registered")
.compile(g, &CompileOptions::default());
let out = exe.run(&[]);
println!("FakeCudaBackend ran graph; output[0] = {:?}", out[0]);
assert_eq!(out[0], vec![42.0; 4]);
println!("\n✓ Backend registry works end-to-end:");
println!(" - builtins (cpu, metal) self-register from feature gates");
println!(" - external backends register via `register_backend(...)`");
println!(" - no edits to rlx-runtime needed for new backends");
}