Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions scijava-ops-engine/src/main/java/module-info.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,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.reduce.ReducedInfoTreeGenerator,
org.scijava.ops.engine.matcher.convert.ConvertedInfoTreeGenerator;

provides org.scijava.ops.api.OpEnvironment with
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@

package org.scijava.ops.engine.matcher.reduce;

import org.scijava.ops.api.InfoTree;
import org.scijava.ops.api.OpEnvironment;
import org.scijava.ops.api.OpInfo;
import org.scijava.ops.engine.InfoTreeGenerator;

import java.util.Collection;
import java.util.Map;

/**
* An {@link org.scijava.ops.engine.InfoTreeGenerator} that is used to generate
* {@link org.scijava.ops.api.InfoTree}s for {@link ReducedOpInfo}s.
*
* @author Gabriel Selzer
*/
public class ReducedInfoTreeGenerator implements InfoTreeGenerator {

@Override
public InfoTree generate(OpEnvironment env, String signature,
Map<String, OpInfo> idMap, Collection<InfoTreeGenerator> generators)
{
// Chop off the prefix on all ReducedOpInfos
var reductionPrefix = ReducedOpInfo.IMPL_DECLARATION //
+ ReducedOpInfo.PARAMS_REDUCED;
var prefixless = signature.substring(reductionPrefix.length());
// Find the number of parameters reduced
var numString = prefixless.substring(0, //
prefixless.indexOf(ReducedOpInfo.ORIGINAL_INFO));
var idx = Integer.parseInt(numString) - 1;

// Create an InfoTree from the original Info
var substring = signature.substring( //
signature.indexOf(ReducedOpInfo.ORIGINAL_INFO) //
+ ReducedOpInfo.ORIGINAL_INFO.length());
var original = InfoTreeGenerator.generateDependencyTree(env, substring,
idMap, generators);
// Reduce the original info, and build a new InfoTree from the proper
// ReducedInfo
var reductions = new ReducedOpInfoGenerator().generateInfosFrom(
original.info());
return new InfoTree(reductions.get(idx), original.dependencies());
}

@Override
public boolean canGenerate(String signature) {
return signature.startsWith(ReducedOpInfo.IMPL_DECLARATION);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
# Instead, modify and re-run <basedir>/bin/generate-meta-inf.sh from the top-level
org.scijava.ops.engine.matcher.adapt.AdaptationInfoTreeGenerator
org.scijava.ops.engine.impl.DefaultInfoTreeGenerator
org.scijava.ops.engine.matcher.reduce.ReducedInfoTreeGenerator
org.scijava.ops.engine.matcher.convert.ConvertedInfoTreeGenerator
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;

public class ProvenanceTest extends AbstractTestEnvironment implements
Expand Down Expand Up @@ -117,6 +118,11 @@ public Thing apply(Double[] doubles) {
}
}

@OpMethod(names = "test.create.thing", type = BiFunction.class)
public static Thing createThingWithNullable(Double d1, @Nullable Double d2) {
return new Thing(d2 == null ? d1 : d1 + d2);
}

static class Thing {

private Double d;
Expand Down Expand Up @@ -518,6 +524,34 @@ public void testAdaptationWithDependencies() {
Assertions.assertEquals(1, ops.history().executionsUpon(actual).size());
}

@Test
public void testReducedOpRecovery() {
// Get the Op
Function<Double, Thing> f = ops //
.op("test.create.thing") //
.inType(Double.class) //
.outType(Thing.class) //
.function();
// Assert only one execution
Thing actual = f.apply(4.0);
Thing expected = new Thing(4.0);
Assertions.assertEquals(expected.d, actual.d);
Assertions.assertEquals(1, ops.history().executionsUpon(actual).size());
// Get the signature from the Op
String signature = Ops.signature(f);
// Generate the Op from the signature and the Op type
Nil<Function<Thing, Thing>> special = new Nil<>() {};
Function<Thing, Thing> fromString = ops //
.opFromSignature(signature, special);
// Assert Op similarity
Assertions.assertTrue(wrappedOpEquality(f, fromString));
// Assert only one execution
actual = f.apply(4.0);
Assertions.assertEquals(expected.d, actual.d);
Assertions.assertEquals(1, ops.history().executionsUpon(actual).size());

}

// -- Helper Methods -- //

/**
Expand Down
1 change: 1 addition & 0 deletions scijava-ops-engine/templates/main/java/module-info.vm
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ module org.scijava.ops.engine {
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.reduce.ReducedInfoTreeGenerator,
org.scijava.ops.engine.matcher.convert.ConvertedInfoTreeGenerator;

provides org.scijava.ops.api.OpEnvironment with
Expand Down