pub trait Move<S: PlanningSolution>:
Send
+ Sync
+ Debug {
type Undo: Send;
Show 16 methods
// Required methods
fn is_doable<D: Director<S>>(&self, score_director: &D) -> bool;
fn do_move<D: Director<S>>(&self, score_director: &mut D) -> Self::Undo;
fn undo_move<D: Director<S>>(
&self,
score_director: &mut D,
undo: Self::Undo,
);
fn descriptor_index(&self) -> usize;
fn entity_indices(&self) -> &[usize];
fn variable_name(&self) -> &str;
fn tabu_signature<D: Director<S>>(
&self,
score_director: &D,
) -> MoveTabuSignature;
// Provided methods
fn do_move_with_scratch<D: Director<S>>(
&self,
score_director: &mut D,
journal_pool: &mut Vec<Self::Undo>,
) -> Self::Undo { ... }
fn undo_move_with_scratch<D: Director<S>>(
&self,
score_director: &mut D,
undo: Self::Undo,
journal_pool: &mut Vec<Self::Undo>,
) { ... }
fn is_doable_with_working_preview<D: Director<S>>(
&self,
score_director: &mut D,
) -> bool { ... }
fn telemetry_label(&self) -> &'static str { ... }
fn requires_hard_improvement(&self) -> bool { ... }
fn requires_score_improvement(&self) -> bool { ... }
fn borrowed_tabu_signature(&self) -> Option<&MoveTabuSignature> { ... }
fn candidate_trace_identity(&self) -> Option<CandidateTraceIdentity> { ... }
fn for_each_affected_entity<V: FnMut(MoveAffectedEntity<'_>)>(
&self,
visitor: &mut V,
) { ... }
}Expand description
A move that modifies one or more planning variables.
Moves are fully monomorphized for maximum performance - no boxing, no virtual dispatch. Undo is handled by move-owned typed data, not boxed director callbacks.
§Type Parameters
S- The planning solution type
§Implementation Notes
- Moves should be lightweight
- Moves are NEVER cloned - ownership transfers via arena indices
- Methods are generic over D to allow use with concrete directors
Required Associated Types§
Required Methods§
fn is_doable<D: Director<S>>(&self, score_director: &D) -> bool
fn do_move<D: Director<S>>(&self, score_director: &mut D) -> Self::Undo
fn undo_move<D: Director<S>>(&self, score_director: &mut D, undo: Self::Undo)
fn descriptor_index(&self) -> usize
fn entity_indices(&self) -> &[usize]
fn variable_name(&self) -> &str
fn tabu_signature<D: Director<S>>( &self, score_director: &D, ) -> MoveTabuSignature
Provided Methods§
fn do_move_with_scratch<D: Director<S>>( &self, score_director: &mut D, journal_pool: &mut Vec<Self::Undo>, ) -> Self::Undo
fn undo_move_with_scratch<D: Director<S>>( &self, score_director: &mut D, undo: Self::Undo, journal_pool: &mut Vec<Self::Undo>, )
fn is_doable_with_working_preview<D: Director<S>>( &self, score_director: &mut D, ) -> bool
fn telemetry_label(&self) -> &'static str
fn requires_hard_improvement(&self) -> bool
fn requires_score_improvement(&self) -> bool
fn borrowed_tabu_signature(&self) -> Option<&MoveTabuSignature>
Sourcefn candidate_trace_identity(&self) -> Option<CandidateTraceIdentity>
fn candidate_trace_identity(&self) -> Option<CandidateTraceIdentity>
Returns the canonical identity used by opt-in candidate-pull tracing.
Returns an explicit logical-coordinate identity for candidate tracing.
This intentionally does not derive from tabu metadata: tabu keys may
contain representation-specific hashes. A move family that has not
supplied a cross-representation coordinate grammar returns None, and
the resulting trace is explicitly non-qualifying rather than faking a
comparable key.
Sourcefn for_each_affected_entity<V: FnMut(MoveAffectedEntity<'_>)>(
&self,
visitor: &mut V,
)
fn for_each_affected_entity<V: FnMut(MoveAffectedEntity<'_>)>( &self, visitor: &mut V, )
Visits every entity this move changes, passing a concrete visitor by
value. V stays monomorphized end to end: no dyn dispatch, no
intermediate collection, every affected entity reported exactly once
in the move’s own canonical order.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".