1use crate::anchor::{Anchor, AnchorGraph};
4use crate::error::FoldError;
5use crate::objective::{Objective, ObjectiveContext};
6use crate::selector::{Selector, SelectorInput, SelectorOutput, SelectorWeights};
7
8pub struct ComposePipeline<T> {
10 pub anchor: Box<dyn Anchor>,
12 pub objective: Box<dyn Objective<T>>,
14 pub selector: Box<dyn Selector<T>>,
16}
17
18impl<T: Clone + Send + Sync + 'static> ComposePipeline<T> {
19 pub fn execute(
21 &self,
22 _graph: &AnchorGraph,
23 candidates: Vec<SelectorInput<T>>,
24 budget: usize,
25 weights: &SelectorWeights,
26 context: &ObjectiveContext,
27 ) -> Result<SelectorOutput<T>, FoldError> {
28 let scored = candidates
29 .into_iter()
30 .map(|mut candidate| {
31 candidate.score = self.objective.score(&candidate.content, context) as f32;
32 candidate
33 })
34 .collect();
35 self.selector.select(scored, budget, weights)
36 }
37}