/***************************************************************************** * Limpet - the Lightweight InforMation ProcEssing Toolkit * http://limpet.info * * (C) 2015-2016, Deep Blue C Technologies Ltd * * This library is free software; you can redistribute it and/or * modify it under the terms of the Eclipse Public License v1.0 * (http://www.eclipse.org/legal/epl-v10.html) * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *****************************************************************************/ package info.limpet.data.operations.admin; import static javax.measure.unit.NonSI.MINUTE; import static javax.measure.unit.NonSI.NAUTICAL_MILE; import static javax.measure.unit.SI.CELSIUS; import static javax.measure.unit.SI.METRE; import static javax.measure.unit.SI.METRES_PER_SECOND; import static javax.measure.unit.SI.METRES_PER_SQUARE_SECOND; import static javax.measure.unit.SI.RADIAN; import static javax.measure.unit.SI.SECOND; import info.limpet.ICommand; import info.limpet.IOperation; import info.limpet.IQuantityCollection; import info.limpet.data.impl.QuantityCollection; import info.limpet.data.impl.samples.StockTypes; import info.limpet.data.operations.AddLayerOperation; import info.limpet.data.operations.GenerateDummyDataOperation; import info.limpet.data.operations.UnitConversionOperation; import info.limpet.data.operations.arithmetic.AddQuantityOperation; import info.limpet.data.operations.arithmetic.DeleteCollectionOperation; import info.limpet.data.operations.arithmetic.DivideQuantityOperation; import info.limpet.data.operations.arithmetic.MultiplyQuantityOperation; import info.limpet.data.operations.arithmetic.SimpleMovingAverageOperation; import info.limpet.data.operations.arithmetic.SubtractQuantityOperation; import info.limpet.data.operations.arithmetic.UnitaryAngleOperation; import info.limpet.data.operations.arithmetic.UnitaryMathOperation; import info.limpet.data.operations.spatial.BearingBetweenTracksOperation; import info.limpet.data.operations.spatial.DistanceBetweenTracksOperation; import info.limpet.data.operations.spatial.DopplerShiftBetweenTracksOperation; import info.limpet.data.operations.spatial.GenerateCourseAndSpeedOperation; import info.limpet.data.operations.spatial.ProplossBetweenTwoTracksOperation; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.measure.quantity.Dimensionless; import javax.measure.quantity.Velocity; import javax.measure.unit.Unit; public class OperationsLibrary { /** use protected constructor to prevent accidental declaration * */ protected OperationsLibrary() { } public static final String SPATIAL = "Spatial"; public static final String ADMINISTRATION = "Administration"; public static final String CONVERSIONS = "Conversions"; public static final String ARITHMETIC = "Arithmetic"; public static final String CREATE = "Create"; public static HashMap<String, List<IOperation<?>>> getOperations() { HashMap<String, List<IOperation<?>>> res = new HashMap<String, List<IOperation<?>>>(); res.put(ARITHMETIC, getArithmetic()); res.put(CONVERSIONS, getConversions()); res.put(ADMINISTRATION, getAdmin()); res.put(SPATIAL, getSpatial()); res.put(CREATE, getCreate()); return res; } public static List<IOperation<?>> getTopLevel() { List<IOperation<?>> topLevel = new ArrayList<IOperation<?>>(); topLevel.add(new DeleteCollectionOperation()); return topLevel; } private static List<IOperation<?>> getAdmin() { List<IOperation<?>> admin = new ArrayList<IOperation<?>>(); admin.add(new GenerateDummyDataOperation("small", 20)); admin.add(new GenerateDummyDataOperation("large", 1000)); admin.add(new GenerateDummyDataOperation("monster", 1000000)); admin.add(new UnitaryMathOperation("Clear units") { public double calcFor(double val) { return val; } protected Unit<?> getUnits(IQuantityCollection<?> input) { return Dimensionless.UNIT; } }); // and the export operations admin.add(new ExportCsvToFileAction()); admin.add(new CopyCsvToClipboardAction()); return admin; } private static List<IOperation<?>> getArithmetic() { List<IOperation<?>> arithmetic = new ArrayList<IOperation<?>>(); arithmetic.add(new MultiplyQuantityOperation()); arithmetic.add(new AddQuantityOperation<>()); arithmetic.add(new SubtractQuantityOperation<>()); arithmetic.add(new DivideQuantityOperation()); arithmetic.add(new SimpleMovingAverageOperation(3)); // also our generic maths operators arithmetic.add(new UnitaryMathOperation("Abs") { public double calcFor(double val) { return Math.abs(val); } }); arithmetic.add(new UnitaryAngleOperation("Sin") { public double calcFor(double val) { return Math.sin(val); } }); arithmetic.add(new UnitaryAngleOperation("Cos") { public double calcFor(double val) { return Math.sin(val); } }); arithmetic.add(new UnitaryAngleOperation("Tan") { public double calcFor(double val) { return Math.tan(val); } }); arithmetic.add(new UnitaryMathOperation("Inv") { public double calcFor(double val) { return -val; } }); arithmetic.add(new UnitaryMathOperation("Sqrt") { public double calcFor(double val) { return Math.sqrt(val); } }); arithmetic.add(new UnitaryMathOperation("Sqr") { public double calcFor(double val) { return val * val; } }); arithmetic.add(new UnitaryMathOperation("Log") { public double calcFor(double val) { return Math.log(val); } }); return arithmetic; } private static List<IOperation<?>> getSpatial() { List<IOperation<?>> spatial = new ArrayList<IOperation<?>>(); spatial.add(new DistanceBetweenTracksOperation()); spatial.add(new BearingBetweenTracksOperation()); spatial.add(new GenerateCourseAndSpeedOperation()); spatial.add(new DopplerShiftBetweenTracksOperation()); spatial.add(new ProplossBetweenTwoTracksOperation()); return spatial; } private static List<IOperation<?>> getConversions() { List<IOperation<?>> conversions = new ArrayList<IOperation<?>>(); // Length conversions.add(new UnitConversionOperation(METRE)); // Time conversions.add(new UnitConversionOperation(SECOND)); conversions.add(new UnitConversionOperation(MINUTE)); // Speed conversions.add(new UnitConversionOperation(METRES_PER_SECOND)); conversions.add(new UnitConversionOperation(NAUTICAL_MILE.divide( SECOND.times(3600)).asType(Velocity.class))); // Acceleration conversions.add(new UnitConversionOperation(METRES_PER_SQUARE_SECOND)); // Temperature conversions.add(new UnitConversionOperation(CELSIUS)); // Angle conversions.add(new UnitConversionOperation(RADIAN)); conversions.add(new UnitConversionOperation(StockTypes.DEGREE_ANGLE)); return conversions; } private static List<IOperation<?>> getCreate() { List<IOperation<?>> create = new ArrayList<IOperation<?>>(); create.add(new AddLayerOperation()); create.add(new CreateSingletonGenerator("dimensionless") { @Override protected QuantityCollection<?> generate(String name, ICommand<?> precedent) { return new StockTypes.NonTemporal.DimensionlessDouble(name, precedent); } }); create.add(new CreateSingletonGenerator("frequency") { @Override protected QuantityCollection<?> generate(String name, ICommand<?> precedent) { return new StockTypes.NonTemporal.FrequencyHz(name, precedent); } }); create.add(new CreateSingletonGenerator("decibels") { @Override protected QuantityCollection<?> generate(String name, ICommand<?> precedent) { return new StockTypes.NonTemporal.AcousticStrength(name, precedent); } }); create.add(new CreateSingletonGenerator("speed (m/s)") { @Override protected QuantityCollection<?> generate(String name, ICommand<?> precedent) { return new StockTypes.NonTemporal.SpeedMSec(name, precedent); } }); create.add(new CreateSingletonGenerator("course (degs)") { @Override protected QuantityCollection<?> generate(String name, ICommand<?> precedent) { return new StockTypes.NonTemporal.AngleDegrees(name, precedent); } }); create.add(new CreateLocationAction()); return create; } }