#import #import "DecayingSampleEstimator.h" #import "TestUtil.h" @interface DecayingSampleEstimatorTest : XCTestCase @end @implementation DecayingSampleEstimatorTest -(void) testDecayingSampleEstimator { DecayingSampleEstimator* e = [DecayingSampleEstimator decayingSampleEstimatorWithInitialEstimate:1.0 andDecayPerUnitSample:0.5]; test([e currentEstimate] == 1.0); test([e decayRatePerUnitSample] == 0.5); [e updateWithNextSample:2.0]; test([e currentEstimate] == 1.5); test([e decayRatePerUnitSample] == 0.5); [e updateWithNextSample:2.0]; test([e currentEstimate] == 1.75); test([e decayRatePerUnitSample] == 0.5); [e updateWithNextSample:1.75]; test([e currentEstimate] == 1.75); [e updateWithNextSample:1.75]; test([e currentEstimate] == 1.75); } -(void) testDecayingSampleEstimatorForce { DecayingSampleEstimator* e = [DecayingSampleEstimator decayingSampleEstimatorWithInitialEstimate:1.0 andDecayPerUnitSample:0.5]; test([e currentEstimate] == 1.0); [e forceEstimateTo:5]; test([e currentEstimate] == 5); test([e decayRatePerUnitSample] == 0.5); } -(void) testDecayingSampleEstimatorQuarter { DecayingSampleEstimator* e = [DecayingSampleEstimator decayingSampleEstimatorWithInitialEstimate:1.0 andDecayPerUnitSample:0.75]; test([e currentEstimate] == 1.0); test([e decayRatePerUnitSample] == 0.75); [e updateWithNextSample:2.0]; test([e currentEstimate] == 1.75); } -(void) testDecayingSampleEstimatorCustomDecayPeriod { DecayingSampleEstimator* e = [DecayingSampleEstimator decayingSampleEstimatorWithInitialEstimate:0 andDecayFactor:0.75 perNSamples:2]; test([e decayRatePerUnitSample] == 0.5); [e updateWithNextSample:4]; [e updateWithNextSample:4]; test([e currentEstimate] == 3); } -(void) testDecayingSampleEstimatorWeighted { DecayingSampleEstimator* e1 = [DecayingSampleEstimator decayingSampleEstimatorWithInitialEstimate:0.0 andDecayPerUnitSample:0.25]; DecayingSampleEstimator* e2 = [DecayingSampleEstimator decayingSampleEstimatorWithInitialEstimate:0.0 andDecayPerUnitSample:0.25]; [e1 updateWithNextSample:2.0 withSampleWeight:0.5]; [e1 updateWithNextSample:2.0 withSampleWeight:0.5]; [e2 updateWithNextSample:2.0]; test(ABS([e1 currentEstimate] - [e2 currentEstimate]) < 0.00001); [e1 updateWithNextSample:-1.0 withSampleWeight:2.0]; [e2 updateWithNextSample:-1.0]; [e2 updateWithNextSample:-1.0]; test(ABS([e1 currentEstimate] - [e2 currentEstimate]) < 0.00001); } -(void) testDecayingSampleEstimatorCornerCase0 { DecayingSampleEstimator* e = [DecayingSampleEstimator decayingSampleEstimatorWithInitialEstimate:1.0 andDecayPerUnitSample:0]; test([e decayRatePerUnitSample] == 0); test([e currentEstimate] == 1.0); [e updateWithNextSample:5.0]; test([e currentEstimate] == 1.0); [e updateWithNextSample:535325.0]; test([e currentEstimate] == 1.0); [e updateWithNextSample:-535325.0]; test([e currentEstimate] == 1.0); [e updateWithNextSample:100.0 withSampleWeight:0]; test([e currentEstimate] == 1.0); [e updateWithNextSample:200.0 withSampleWeight:100]; test([e currentEstimate] == 1.0); [e updateWithNextSample:300.0 withSampleWeight:1]; test([e currentEstimate] == 1.0); } -(void) testDecayingSampleEstimatorCornerCase1 { DecayingSampleEstimator* e = [DecayingSampleEstimator decayingSampleEstimatorWithInitialEstimate:1.0 andDecayPerUnitSample:1]; test([e decayRatePerUnitSample] == 1); test([e currentEstimate] == 1.0); [e updateWithNextSample:5.0]; test([e currentEstimate] == 5.0); [e updateWithNextSample:535325.0]; test([e currentEstimate] == 535325.0); [e updateWithNextSample:-535325.0]; test([e currentEstimate] == -535325.0); [e updateWithNextSample:100.0 withSampleWeight:0.0001]; test([e currentEstimate] == 100.0); [e updateWithNextSample:200.0 withSampleWeight:100]; test([e currentEstimate] == 200.0); [e updateWithNextSample:300.0 withSampleWeight:1]; test([e currentEstimate] == 300.0); [e updateWithNextSample:400.0 withSampleWeight:0]; test([e currentEstimate] == 300.0); } @end