Skip to content

Commit

Permalink
Simplify -> Convert
Browse files Browse the repository at this point in the history
  • Loading branch information
gselzer committed Mar 13, 2024
1 parent 8800801 commit c7e8af1
Show file tree
Hide file tree
Showing 68 changed files with 2,000 additions and 2,427 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -75,12 +75,12 @@ public static void testOpHints() {
"Expected at least one math.pow Op");
Assertions.assertFalse(help.toLowerCase().contains("long"),
"Found a math.pow Op that deals with Longs - testing the hints won't work here!");
// Ensure an Op matches without simplification
// Ensure an Op matches without conversion
// NB this call must come first, or the cache will be hit based on the previous call.
Hints h = new Hints("simplification.FORBIDDEN");
Hints h = new Hints("conversion.FORBIDDEN");
Assertions.assertThrows(OpMatchingException.class, () -> ops.op("math.pow", h).arity2().input(in, exponent).outType(Long.class).apply());

// Ensure an Op matches with simplification
// Ensure an Op matches with conversion
var power = ops.op("math.pow").arity2().input(in, exponent).outType(Long.class).apply();
Assertions.assertEquals((long) Math.pow(in, exponent), power);
}
Expand Down
19 changes: 10 additions & 9 deletions scijava-ops-engine/src/main/java/module-info.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,7 @@
provides org.scijava.ops.engine.InfoTreeGenerator with
org.scijava.ops.engine.matcher.adapt.AdaptationInfoTreeGenerator,
org.scijava.ops.engine.impl.DefaultInfoTreeGenerator,
org.scijava.ops.engine.matcher.simplify.FocusedInfoTreeGenerator,
org.scijava.ops.engine.matcher.simplify.SimplifiedInfoTreeGenerator;
org.scijava.ops.engine.matcher.convert.ConvertedInfoTreeGenerator;

provides org.scijava.ops.api.OpEnvironment with
org.scijava.ops.engine.impl.DefaultOpEnvironment;
Expand All @@ -93,7 +92,7 @@
org.scijava.ops.engine.matcher.reduce.ReducedOpInfoGenerator;

provides org.scijava.ops.engine.OpDescriptionGenerator with
org.scijava.ops.engine.matcher.simplify.SimplifiedOpDescriptionGenerator;
org.scijava.ops.engine.impl.DefaultOpDescriptionGenerator;

provides org.scijava.ops.engine.OpWrapper with
org.scijava.ops.engine.matcher.impl.OpWrappers.ProducerOpWrapper,
Expand Down Expand Up @@ -271,26 +270,28 @@
provides org.scijava.ops.engine.matcher.MatchingRoutine with
org.scijava.ops.engine.matcher.impl.RuntimeSafeMatchingRoutine,
org.scijava.ops.engine.matcher.adapt.AdaptationMatchingRoutine,
org.scijava.ops.engine.matcher.simplify.SimplificationMatchingRoutine;
org.scijava.ops.engine.matcher.convert.ConversionMatchingRoutine;

provides org.scijava.ops.spi.OpCollection with
org.scijava.ops.engine.adapt.lift.ComputerToArrays,
org.scijava.ops.engine.adapt.lift.ComputerToIterables,
org.scijava.ops.engine.adapt.lift.FunctionToArrays,
org.scijava.ops.engine.adapt.lift.FunctionToIterables,
org.scijava.ops.engine.adapt.lift.InplaceToArrays,
org.scijava.ops.engine.matcher.simplify.IdentityCollection,
org.scijava.ops.engine.matcher.simplify.PrimitiveArrayLossReporters,
org.scijava.ops.engine.matcher.simplify.PrimitiveLossReporters,
org.scijava.ops.engine.describe.PrimitiveDescriptors,
org.scijava.ops.engine.matcher.convert.IdentityCollection,
org.scijava.ops.engine.conversionLoss.impl.PrimitiveArrayLossReporters,
org.scijava.ops.engine.conversionLoss.impl.PrimitiveLossReporters,
org.scijava.ops.engine.matcher.convert.UtilityConverters,
org.scijava.ops.engine.copy.CopyOpCollection,
org.scijava.ops.engine.create.CreateOpCollection,
org.scijava.ops.engine.math.Add,
org.scijava.ops.engine.math.MathOpCollection,
org.scijava.ops.engine.math.Power,
org.scijava.ops.engine.math.Sqrt,
org.scijava.ops.engine.math.Zero,
org.scijava.ops.engine.matcher.simplify.PrimitiveArraySimplifiers,
org.scijava.ops.engine.matcher.simplify.PrimitiveSimplifiers,
org.scijava.ops.engine.matcher.convert.PrimitiveArrayConverters,
org.scijava.ops.engine.matcher.convert.PrimitiveConverters,
org.scijava.ops.engine.stats.Mean,
org.scijava.ops.engine.stats.Size;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,13 @@ private Reduction() {
public static final String FORBIDDEN = PREFIX + ".FORBIDDEN";
}

public static final class Simplification {
public static final class Conversion {

private Simplification() {
private Conversion() {
// Prevent instantiation of static utility class
}

public static final String PREFIX = "simplification";
public static final String PREFIX = "conversion";
public static final String FORBIDDEN = PREFIX + ".FORBIDDEN";
public static final String IN_PROGRESS = PREFIX + ".IN_PROGRESS";
}
Expand All @@ -82,7 +82,11 @@ private DependencyMatching() {
}

public static final String PREFIX = "dependencyMatching";
// Used by an OpEnvironment to hint that dependency matching is underway
public static final String IN_PROGRESS = PREFIX + ".IN_PROGRESS";
// Used by an Op to hint that it does not wish to be a dependency of another
// Op.
public static final String FORBIDDEN = PREFIX + ".FORBIDDEN";

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,23 +27,24 @@
* #L%
*/

package org.scijava.ops.engine.matcher.simplify;
package org.scijava.ops.engine.conversionLoss.impl;

import org.scijava.ops.spi.OpHints;
import org.scijava.ops.engine.BaseOpHints.Simplification;
import org.scijava.ops.engine.BaseOpHints.Conversion;
import org.scijava.ops.engine.conversionLoss.LossReporter;
import org.scijava.ops.spi.Op;
import org.scijava.ops.spi.OpClass;
import org.scijava.priority.Priority;
import org.scijava.types.Nil;

/**
* A {@link LossReporter} used when a type is not simplified.
* A {@link LossReporter} used when a type is not converted.
*
* @author Gabriel Selzer
* @param <T> - the type that is not being simplified.
* @param <T> - the type that is not being converted.
* @see org.scijava.ops.engine.matcher.convert.IdentityCollection
*/
@OpHints(hints = { Simplification.FORBIDDEN })
@OpHints(hints = { Conversion.FORBIDDEN })
@OpClass(names = "engine.lossReporter", priority = Priority.VERY_HIGH)
public class IdentityLossReporter<U, T extends U> implements LossReporter<T, U>,
Op
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,21 +27,21 @@
* #L%
*/

package org.scijava.ops.engine.matcher.simplify;
package org.scijava.ops.engine.conversionLoss.impl;

import org.scijava.ops.spi.OpHints;
import org.scijava.ops.engine.BaseOpHints.Simplification;
import org.scijava.ops.engine.BaseOpHints.Conversion;
import org.scijava.ops.engine.conversionLoss.LossReporter;
import org.scijava.ops.spi.OpCollection;
import org.scijava.ops.spi.OpField;

public class PrimitiveArrayLossReporters implements OpCollection {

@OpHints(hints = { Simplification.FORBIDDEN })
@OpHints(hints = { Conversion.FORBIDDEN })
@OpField(names = "engine.lossReporter")
public final LossReporter<Byte[], Integer[]> bArrIArr = (from, to) -> 0.;

@OpHints(hints = { Simplification.FORBIDDEN })
@OpHints(hints = { Conversion.FORBIDDEN })
@OpField(names = "engine.lossReporter")
public final LossReporter<Double[], Integer[]> dArrIArr = (from, to) -> 0.;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@
* #L%
*/

package org.scijava.ops.engine.matcher.simplify;
package org.scijava.ops.engine.conversionLoss.impl;

import org.scijava.ops.spi.OpHints;
import org.scijava.ops.engine.BaseOpHints.Simplification;
import org.scijava.ops.engine.BaseOpHints.Conversion;
import org.scijava.ops.engine.conversionLoss.LossReporter;
import org.scijava.ops.spi.OpCollection;
import org.scijava.ops.spi.OpField;
Expand All @@ -45,7 +45,7 @@
public class PrimitiveLossReporters implements OpCollection {

@FunctionalInterface
static interface IntToDecimalReporter<T, R> extends LossReporter<T, R> {
interface IntToDecimalReporter<T, R> extends LossReporter<T, R> {

Double intToDecimalLoss(Nil<T> from, Nil<R> to);

Expand All @@ -56,7 +56,7 @@ default Double apply(Nil<T> from, Nil<R> to) {

}

@OpHints(hints = { Simplification.FORBIDDEN })
@OpHints(hints = { Conversion.FORBIDDEN })
@OpField(names = "engine.lossReporter")
public final IntToDecimalReporter<Long, Double> LongDoubleReporter = (from,
to) -> {
Expand All @@ -65,29 +65,29 @@ default Double apply(Nil<T> from, Nil<R> to) {
return (double) Math.abs(maxValue - (long) converted);
};

@OpHints(hints = { Simplification.FORBIDDEN })
@OpHints(hints = { Conversion.FORBIDDEN })
@OpField(names = "engine.lossReporter")
public final LossReporter<Double, Long> DoubleLongReporter = (from, to) -> {
double maxValue = Double.MAX_VALUE;
long converted = (long) maxValue;
return maxValue - converted;
};

@OpHints(hints = { Simplification.FORBIDDEN })
@OpHints(hints = { Conversion.FORBIDDEN })
@OpField(names = "engine.lossReporter")
public final LossReporter<Long, Integer> LongIntegerReporter = (from, to) -> {
long maxValue = Long.MAX_VALUE;
int converted = (int) maxValue;
return (double) Math.abs(maxValue - converted);
};

@OpHints(hints = { Simplification.FORBIDDEN })
@OpHints(hints = { Conversion.FORBIDDEN })
@OpField(names = "engine.lossReporter")
public final LossReporter<Integer, Long> IntegerLongReporter = (from, to) -> {
return 0.;
};

@OpHints(hints = { Simplification.FORBIDDEN })
@OpHints(hints = { Conversion.FORBIDDEN })
@OpField(names = "engine.lossReporter")
public final IntToDecimalReporter<Integer, Double> IntegerDoubleReporter = (
from, to) -> {
Expand All @@ -96,7 +96,7 @@ default Double apply(Nil<T> from, Nil<R> to) {
return (double) Math.abs(maxValue - (long) converted);
};

@OpHints(hints = { Simplification.FORBIDDEN })
@OpHints(hints = { Conversion.FORBIDDEN })
@OpField(names = "engine.lossReporter")
public final LossReporter<Double, Integer> DoubleIntegerReporter = (from,
to) -> {
Expand All @@ -105,12 +105,12 @@ default Double apply(Nil<T> from, Nil<R> to) {
return maxValue - converted;
};

@OpHints(hints = { Simplification.FORBIDDEN })
@OpHints(hints = { Conversion.FORBIDDEN })
@OpField(names = "engine.lossReporter")
public final LossReporter<Number, Double> NumberDoubleReporter = (from,
to) -> LongDoubleReporter.apply(Nil.of(Long.class), Nil.of(Double.class));

@OpHints(hints = { Simplification.FORBIDDEN })
@OpHints(hints = { Conversion.FORBIDDEN })
@OpField(names = "engine.lossReporter")
public final LossReporter<Number, Long> NumberLongReporter = (from,
to) -> DoubleLongReporter.apply(Nil.of(Double.class), Nil.of(Long.class));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,19 @@
*/
/**
* This package is intended to house classes dealing with the calculation of
* loss with respect to type conversion and Op simplification.
* loss with respect to parameter conversion
* <p>
* <b>This package is {@code exported}, and should be reserved for
* interfaces</b>; implementations belong within
* {@link org.scijava.ops.engine.conversionLoss.impl}
* <p>
* NB: These interfaces <b>do not</b> belong in SciJava Ops API as they are an
* implementation detail of simplification, which is an aspect of SciJava Ops
* Engine.
* implementation detail of parameter conversion, which is an aspect of SciJava
* Ops Engine.
*
* @author Gabriel Selzer
* @see org.scijava.ops.engine.conversionLoss.impl
* @see org.scijava.ops.engine.simplify
* @see org.scijava.ops.engine.matcher.convert
*/

package org.scijava.ops.engine.conversionLoss;
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@

package org.scijava.ops.engine.describe;

import org.scijava.ops.spi.OpCollection;
import org.scijava.ops.spi.OpField;
import org.scijava.priority.Priority;
import org.scijava.types.Types;

import java.util.List;

public class PrimitiveDescriptors<T, N extends Number> implements OpCollection {

@OpField(names = "engine.describe")
public final TypeDescriptor<N> boxedPrimitiveDescriptor = in -> "number";

@OpField(names = "engine.describe")
public final TypeDescriptor<N[]> boxedPrimitiveArrayDescriptor =
in -> "number[]";

@OpField(names = "engine.describe")
public final TypeDescriptor<byte[]> byteArrayDescriptor = in -> "number[]";

@OpField(names = "engine.describe")
public final TypeDescriptor<short[]> shortArrayDescriptor = in -> "number[]";

@OpField(names = "engine.describe")
public final TypeDescriptor<int[]> intArrayDescriptor = in -> "number[]";

@OpField(names = "engine.describe")
public final TypeDescriptor<long[]> longArrayDescriptor = in -> "number[]";

@OpField(names = "engine.describe")
public final TypeDescriptor<float[]> floatArrayDescriptor = in -> "number[]";

@OpField(names = "engine.describe")
public final TypeDescriptor<double[]> doubleArrayDescriptor =
in -> "number[]";

@OpField(names = "engine.describe")
public final TypeDescriptor<List<N>> boxedPrimitiveListDescriptor =
in -> "list<number>";

@OpField(names = "engine.describe", priority = Priority.LAST)
public final TypeDescriptor<T> identityDescriptor = in -> Types.raw(in
.getType()).getSimpleName();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@

package org.scijava.ops.engine.describe;

import org.scijava.types.Nil;

import java.util.function.Function;

/**
* Convenience interface for describing an Op that turns a type into a
* {@link String}
*
* @param <T> the type that this {@code TypeDescriptor} describes
* @author Gabriel Selzer
*/
public interface TypeDescriptor<T> extends Function<Nil<T>, String> {}
Loading

0 comments on commit c7e8af1

Please sign in to comment.