use crate::decision::Policy;
pub struct ArchX;
impl ArchX {
pub fn run<F, R>(task: F) -> R
where
F: FnOnce() -> R
{
Self::compute().run(task)
}
pub fn adaptive() -> ArchXBuilder {
ArchXBuilder::new()
}
pub fn new() -> ArchXBuilder {
ArchXBuilder::new()
}
pub fn compute() -> crate::public_api::sovereign::SovereignBuilder {
crate::public_api::sovereign::SovereignBuilder::new()
}
pub fn math() -> crate::public_api::math_api::MathBuilder {
crate::public_api::math_api::MathBuilder::new()
}
}
pub struct ArchXBuilder {
policy: Policy,
profiling_enabled: bool,
gpu_enabled: bool,
}
impl ArchXBuilder {
pub fn new() -> Self {
Self {
policy: Policy::Balanced,
profiling_enabled: false,
gpu_enabled: true,
}
}
pub fn with_policy(mut self, policy: Policy) -> Self {
self.policy = policy;
self
}
pub fn policy(self, policy: Policy) -> Self {
self.with_policy(policy)
}
pub fn with_profile(mut self, enabled: bool) -> Self {
self.profiling_enabled = enabled;
self
}
pub fn profile(self, enabled: bool) -> Self {
self.with_profile(enabled)
}
pub fn enable_gpu(mut self, enabled: bool) -> Self {
self.gpu_enabled = enabled;
self
}
pub fn task<F, R>(self, task: F) -> TaskBuilder<F>
where F: FnOnce() -> R
{
TaskBuilder {
builder: self,
task,
}
}
pub fn execute(self, a: &[f32], b: &[f32], out: &mut [f32]) {
let _ = self.to_sovereign().add(a, b, out);
}
pub fn add(self, a: &[f32], b: &[f32], out: &mut [f32]) {
self.execute(a, b, out);
}
pub fn run_task<F, R>(self, task: F) -> R
where F: FnOnce() -> R
{
self.to_sovereign().run(task)
}
fn to_sovereign(self) -> crate::public_api::sovereign::SovereignBuilder {
crate::public_api::ArchX::compute()
.with_policy(self.policy)
.profile(self.profiling_enabled)
.enable_gpu(self.gpu_enabled)
}
}
pub struct TaskBuilder<F> {
builder: ArchXBuilder,
task: F,
}
impl<F, R> TaskBuilder<F>
where F: FnOnce() -> R
{
pub fn execute(self) -> R {
self.builder.to_sovereign().run(self.task)
}
}
pub fn engine() -> ArchXBuilder {
ArchXBuilder::new()
}
pub fn archx() -> crate::public_api::sovereign::SovereignBuilder {
crate::public_api::sovereign::SovereignBuilder::new()
}