Repository navigation
Publishing results
Josh Hiles edited this page Dec 22, 2023
·
1 revision
What good is science if you can't publish your results?
By default results are published in an in-memory publisher. To override this behavior, create your own implementation of IResultPublisher:
public class MyResultPublisher : IResultPublisher
{
public Task Publish<T, TClean>(Result<T, TClean> result)
{
Logger.Debug($"Publishing results for experiment '{result.ExperimentName}'");
Logger.Debug($"Result: {(result.Matched ? "MATCH" : "MISMATCH")}");
Logger.Debug($"Control value: {result.Control.Value}");
Logger.Debug($"Control duration: {result.Control.Duration}");
foreach (var observation in result.Candidates)
{
Logger.Debug($"Candidate name: {observation.Name}");
Logger.Debug($"Candidate value: {observation.Value}");
Logger.Debug($"Candidate duration: {observation.Duration}");
}
if (result.Mismatched)
{
// saved mismatched experiments to DB
DbHelpers.SaveExperimentResults(result);
}
return Task.FromResult(0);
}
}Then set Scientist to use it before running the experiments:
Scientist.ResultPublisher = new MyResultPublisher();As of v1.0.2, A IResultPublisher can also be wrapped in FireAndForgetResultPublisher so that result publishing avoids any delays in running experiments and is delegated to another thread:
Scientist.ResultPublisher = new FireAndForgetResultPublisher(new MyResultPublisher(onPublisherException));- Publishing results
- Controlling comparison
- Adding context
- Expensive setup
- Keeping it clean
- Ignoring mismatches
- Enabling or disabling experiments
- Ramping up experiments
- Running candidates in parallel (asynchronous)
- Testing
- Handling errors
- Designing an experiment
- Finishing an experiment
Sometimes scientists just gotta do weird stuff. We understand.