package mil.nga.giat.geowave.analytic.mapreduce.operations.options; import com.beust.jcommander.IStringConverter; import com.beust.jcommander.Parameter; import com.beust.jcommander.ParameterException; import mil.nga.giat.geowave.analytic.param.JumpParameters; import mil.nga.giat.geowave.analytic.param.SampleParameters; import mil.nga.giat.geowave.analytic.param.annotations.JumpParameter; import mil.nga.giat.geowave.analytic.param.annotations.SampleParameter; import mil.nga.giat.geowave.core.index.sfc.data.NumericRange; public class KMeansJumpOptions { @JumpParameter(JumpParameters.Jump.KPLUSPLUS_MIN) @Parameter(names = { "-jkp", "--jumpKplusplusMin" }, required = true, description = "The minimum k when K means ++ takes over sampling.") private String jumpKplusplusMin; @JumpParameter(JumpParameters.Jump.RANGE_OF_CENTROIDS) @Parameter(names = { "-jrc", "--jumpRangeOfCentroids" }, required = true, description = "Comma-separated range of centroids (e.g. 2,100)", converter = NumericRangeConverter.class) private NumericRange jumpRangeOfCentroids; @SampleParameter(SampleParameters.Sample.SAMPLE_RANK_FUNCTION) @Parameter(names = { "-srf", "--sampleSampleRankFunction" }, hidden = true, description = "The rank function used when sampling the first N highest rank items.") private String sampleSampleRankFunction; @SampleParameter(SampleParameters.Sample.SAMPLE_SIZE) @Parameter(names = { "-sss", "--sampleSampleSize" }, hidden = true, description = "Sample Size") private String sampleSampleSize; public String getJumpKplusplusMin() { return jumpKplusplusMin; } public void setJumpKplusplusMin( String jumpKplusplusMin ) { this.jumpKplusplusMin = jumpKplusplusMin; } public NumericRange getJumpRangeOfCentroids() { return jumpRangeOfCentroids; } public void setJumpRangeOfCentroids( NumericRange jumpRangeOfCentroids ) { this.jumpRangeOfCentroids = jumpRangeOfCentroids; } public String getSampleSampleRankFunction() { return sampleSampleRankFunction; } public void setSampleSampleRankFunction( String sampleSampleRankFunction ) { this.sampleSampleRankFunction = sampleSampleRankFunction; } public String getSampleSampleSize() { return sampleSampleSize; } public void setSampleSampleSize( String sampleSampleSize ) { this.sampleSampleSize = sampleSampleSize; } public static class NumericRangeConverter implements IStringConverter<NumericRange> { @Override public NumericRange convert( String value ) { final String p = value.toString(); final String[] parts = p.split(","); try { if (parts.length == 2) { return new NumericRange( Double.parseDouble(parts[0].trim()), Double.parseDouble(parts[1].trim())); } else { return new NumericRange( 0, Double.parseDouble(p)); } } catch (final Exception ex) { throw new ParameterException( "Invalid range parameter " + value, ex); } } } }