package hitimes;
import org.jruby.Ruby; import org.jruby.RubyClass; import org.jruby.RubyObject;
import org.jruby.RubyNumeric; import org.jruby.runtime.builtin.IRubyObject; import org.jruby.runtime.ObjectAllocator;
import org.jruby.anno.JRubyMethod; import org.jruby.anno.JRubyClass;
@JRubyClass( name = “Hitimes::Stats” ) public class HitimesStats extends RubyObject {
private double min = 0.0;
private double max = 0.0;
private double sum = 0.0;
private double sumsq = 0.0;
private long count = 0;
public static final ObjectAllocator ALLOCATOR = new ObjectAllocator() {
public IRubyObject allocate(Ruby runtime, RubyClass klass) {
return new HitimesStats( runtime, klass );
}
};
public HitimesStats( Ruby runtime, RubyClass klass ) {
super( runtime, klass );
}
@JRubyMethod( name = "update", required = 1, argTypes = RubyNumeric.class )
public IRubyObject update( IRubyObject val ) {
double v = RubyNumeric.num2dbl( val );
if ( 0 == this.count ) {
this.min = this.max = v;
} else {
this.min = ( v < this.min ) ? v : this.min;
this.max = ( v > this.max ) ? v : this.max;
}
this.count += 1;
this.sum += v;
this.sumsq += (v * v);
return val;
}
@JRubyMethod( name = "mean" )
public IRubyObject mean() {
double mean = 0.0;
if ( this.count > 0 ) {
mean = this.sum / this.count;
}
return getRuntime().newFloat( mean );
}
@JRubyMethod( name = "rate" )
public IRubyObject rate() {
double rate = 0.0;
if ( this.sum > 0.0 ) {
rate = this.count / this.sum ;
}
return getRuntime().newFloat( rate );
}
@JRubyMethod( name = "stddev" )
public IRubyObject stddev() {
double stddev = 0.0;
if ( this.count > 1 ) {
double sq_sum = this.sum * this.sum;
stddev = Math.sqrt( ( this.sumsq - ( sq_sum / this.count ) ) / ( this.count - 1 ) );
}
return getRuntime().newFloat( stddev );
}
@JRubyMethod( name = "min" )
public IRubyObject min() {
return getRuntime().newFloat( this.min );
}
@JRubyMethod( name = "max" )
public IRubyObject max() {
return getRuntime().newFloat( this.max );
}
@JRubyMethod( name = "sum" )
public IRubyObject sum() {
return getRuntime().newFloat( this.sum );
}
@JRubyMethod( name = "sumsq" )
public IRubyObject sumsq() {
return getRuntime().newFloat( this.sumsq );
}
@JRubyMethod( name = "count" )
public IRubyObject count() {
return getRuntime().newFixnum( this.count );
}
}