Skip to main content

zer_compute/backend/cpu/
device.rs

1use std::sync::Arc;
2
3use zer_compare::{FellegiSunterScorer, FieldComparator};
4use zer_core::{
5    comparison::{ComparisonBatch, ComparisonVector},
6    record::Record,
7    record_pool::RecordPool,
8    schema::Schema,
9    scoring::{ModelParams, ScoredPair},
10    traits::{Comparator, Result as ZerResult, Scorer},
11};
12
13// ── CpuDevice ─────────────────────────────────────────────────────────────────
14
15pub struct CpuDevice;
16
17// ── CpuFallbackComparator ─────────────────────────────────────────────────────
18
19/// CPU-side comparator wrapping `zer_compare::FieldComparator`.
20#[derive(Clone)]
21pub struct CpuFallbackComparator {
22    inner: Arc<FieldComparator>,
23}
24
25impl CpuFallbackComparator {
26    pub fn from_schema(schema: &Schema) -> Self {
27        Self {
28            inner: Arc::new(FieldComparator::from_schema(schema)),
29        }
30    }
31}
32
33impl Comparator for CpuFallbackComparator {
34    fn compare(&self, a: &Record, b: &Record, schema: &Schema) -> ComparisonVector {
35        self.inner.compare(a, b, schema)
36    }
37
38    fn compare_batch_from_pool(
39        &self,
40        pool: &RecordPool,
41        indices: &[(usize, usize)],
42        schema: &Schema,
43    ) -> ComparisonBatch {
44        self.inner.compare_batch_from_pool(pool, indices, schema)
45    }
46}
47
48// ── CpuFallbackScorer ─────────────────────────────────────────────────────────
49
50/// CPU-side Fellegi-Sunter scorer wrapping `zer_compare::FellegiSunterScorer`.
51#[derive(Clone)]
52pub struct CpuFallbackScorer;
53
54impl Scorer for CpuFallbackScorer {
55    fn score(&self, vector: &ComparisonVector, params: &ModelParams) -> ScoredPair {
56        FellegiSunterScorer.score(vector, params)
57    }
58
59    fn score_batch(&self, batch: &ComparisonBatch, params: &ModelParams) -> Vec<ScoredPair> {
60        FellegiSunterScorer.score_batch(batch, params)
61    }
62
63    fn estimate_params(
64        &self,
65        batch: &ComparisonBatch,
66        init: Option<ModelParams>,
67        max_iter: usize,
68    ) -> ZerResult<ModelParams> {
69        FellegiSunterScorer.estimate_params(batch, init, max_iter)
70    }
71}
72
73/// Convenience wrapper for `DeviceScorer::estimate_params` CPU fallback.
74pub fn cpu_estimate_params(
75    batch: &ComparisonBatch,
76    init: Option<ModelParams>,
77    max_iter: usize,
78) -> ZerResult<ModelParams> {
79    zer_compare::run_em(batch, init, max_iter)
80}