Add UsesObserver to allow more generic MapFeedback (#1104)

* UsesObserver

* a

* more

* don't need these
This commit is contained in:
Dongjia "toka" Zhang 2023-02-26 16:35:45 +09:00 committed by GitHub
parent cf02553ea7
commit c0f229ec23
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 16 deletions

View File

@ -23,7 +23,7 @@ use crate::{
feedbacks::{Feedback, HasObserverName}, feedbacks::{Feedback, HasObserverName},
inputs::UsesInput, inputs::UsesInput,
monitors::UserStats, monitors::UserStats,
observers::{MapObserver, ObserversTuple}, observers::{MapObserver, Observer, ObserversTuple, UsesObserver},
state::{HasClientPerfMonitor, HasMetadata, HasNamedMetadata}, state::{HasClientPerfMonitor, HasMetadata, HasNamedMetadata},
Error, Error,
}; };
@ -370,6 +370,14 @@ pub struct MapFeedback<N, O, R, S, T> {
phantom: PhantomData<(N, O, R, S, T)>, phantom: PhantomData<(N, O, R, S, T)>,
} }
impl<N, O, R, S, T> UsesObserver<S> for MapFeedback<N, O, R, S, T>
where
S: UsesInput,
O: Observer<S>,
{
type Observer = O;
}
impl<N, O, R, S, T> Feedback<S> for MapFeedback<N, O, R, S, T> impl<N, O, R, S, T> Feedback<S> for MapFeedback<N, O, R, S, T>
where where
N: IsNovel<T> + Debug, N: IsNovel<T> + Debug,

View File

@ -48,6 +48,15 @@ use crate::{
Error, Error,
}; };
/// Something that uses observer like mapfeedbacks
pub trait UsesObserver<S>
where
S: UsesInput,
{
/// The observer type used
type Observer: Observer<S>;
}
/// Observers observe different information about the target. /// Observers observe different information about the target.
/// They can then be used by various sorts of feedback. /// They can then be used by various sorts of feedback.
pub trait Observer<S>: Named + Debug pub trait Observer<S>: Named + Debug

View File

@ -15,14 +15,11 @@ use crate::{
corpus::{Corpus, CorpusId, SchedulerTestcaseMetaData}, corpus::{Corpus, CorpusId, SchedulerTestcaseMetaData},
events::{Event, EventFirer, LogSeverity}, events::{Event, EventFirer, LogSeverity},
executors::{Executor, ExitKind, HasObservers}, executors::{Executor, ExitKind, HasObservers},
feedbacks::{ feedbacks::{map::MapFeedbackMetadata, HasObserverName},
map::{IsNovel, MapFeedback, MapFeedbackMetadata, Reducer},
HasObserverName,
},
fuzzer::Evaluator, fuzzer::Evaluator,
inputs::UsesInput, inputs::UsesInput,
monitors::UserStats, monitors::UserStats,
observers::{MapObserver, ObserversTuple}, observers::{MapObserver, ObserversTuple, UsesObserver},
schedulers::powersched::SchedulerMetadata, schedulers::powersched::SchedulerMetadata,
stages::Stage, stages::Stage,
state::{HasClientPerfMonitor, HasCorpus, HasMetadata, HasNamedMetadata, UsesState}, state::{HasClientPerfMonitor, HasCorpus, HasMetadata, HasNamedMetadata, UsesState},
@ -321,13 +318,10 @@ where
{ {
/// Create a new [`CalibrationStage`]. /// Create a new [`CalibrationStage`].
#[must_use] #[must_use]
pub fn new<N, R>(map_feedback: &MapFeedback<N, O, R, S, O::Entry>) -> Self pub fn new<F>(map_feedback: &F) -> Self
where where
O::Entry: F: HasObserverName + Named + UsesObserver<S, Observer = O>,
PartialEq + Default + Copy + 'static + Serialize + serde::de::DeserializeOwned + Debug,
R: Reducer<O::Entry>,
for<'it> O: AsIter<'it, Item = O::Entry>, for<'it> O: AsIter<'it, Item = O::Entry>,
N: IsNovel<O::Entry>,
{ {
Self { Self {
map_observer_name: map_feedback.observer_name().to_string(), map_observer_name: map_feedback.observer_name().to_string(),
@ -340,13 +334,10 @@ where
/// Create a new [`CalibrationStage`], but without checking stability. /// Create a new [`CalibrationStage`], but without checking stability.
#[must_use] #[must_use]
pub fn ignore_stability<N, R>(map_feedback: &MapFeedback<N, O, R, S, O::Entry>) -> Self pub fn ignore_stability<F>(map_feedback: &F) -> Self
where where
O::Entry: F: HasObserverName + Named + UsesObserver<S, Observer = O>,
PartialEq + Default + Copy + 'static + Serialize + serde::de::DeserializeOwned + Debug,
R: Reducer<O::Entry>,
for<'it> O: AsIter<'it, Item = O::Entry>, for<'it> O: AsIter<'it, Item = O::Entry>,
N: IsNovel<O::Entry>,
{ {
Self { Self {
map_observer_name: map_feedback.observer_name().to_string(), map_observer_name: map_feedback.observer_name().to_string(),