Skip to content

Commit ab18221

Browse files
gselzerctrueden
authored andcommitted
More SimplificationInfoChainGenerator work
1 parent 2d788ae commit ab18221

9 files changed

Lines changed: 257 additions & 55 deletions

File tree

scijava/scijava-ops-api/src/main/java/org/scijava/ops/api/InfoChainGenerator.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,43 @@ static Optional<InfoChainGenerator> findSuitableGenerator(String signature,
4747
return gen;
4848
}
4949

50+
static InfoChain generateDependencyChain(String subsignature,
51+
Map<String, OpInfo> idMap, Collection<InfoChainGenerator> generators)
52+
{
53+
Optional<InfoChainGenerator> genOpt = InfoChainGenerator
54+
.findSuitableGenerator(subsignature, generators);
55+
if (genOpt.isEmpty()) throw new IllegalArgumentException(
56+
"Could not find an InfoChainGenerator able to handle id" + subsignature);
57+
return genOpt.get().generate(subsignature, idMap, generators);
58+
}
59+
60+
/**
61+
* Finds the subsignature in {@link String} {@code signature}. The
62+
* subsignature is assumed to start at index {@code start}.
63+
*
64+
* @param signature
65+
* @param start
66+
* @return a signature contained withing {@code signature}
67+
*/
68+
static String subSignatureFrom(String signature, int start) {
69+
int depsStart = signature.indexOf(DEP_START_DELIM, start);
70+
int depth = 0;
71+
for (int i = depsStart; i < signature.length(); i++) {
72+
char ch = signature.charAt(i);
73+
if (ch == DEP_START_DELIM) depth++;
74+
else if (ch == DEP_END_DELIM) {
75+
depth--;
76+
if (depth == 0) {
77+
int depsEnd = i;
78+
return signature.substring(start, depsEnd + 1);
79+
}
80+
}
81+
}
82+
throw new IllegalArgumentException(
83+
"There is no complete signature starting from index " + start +
84+
" in signature " + signature);
85+
}
86+
5087
/**
5188
* Describes whether this {@link InfoChainGenerator} is designed to generate
5289
* the <b>outer layer</b> of the {@link InfoChain}

scijava/scijava-ops-engine/src/main/java/org/scijava/ops/engine/create/CreateOpCollection.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ public class CreateOpCollection {
2222

2323
@OpField(names = "create, src, source", priority = Priority.LOW, params = "array, arrayLike")
2424
public static final Function<Double[], Double[]> createDoubleArrayInputAware = from -> new Double[from.length];
25+
26+
@OpField(names = "create, src, source", priority = Priority.LOW, params = "array, arrayLike")
27+
public static final Function<int[], int[]> createintArrayInputAware = from -> new int[from.length];
28+
29+
@OpField(names = "create, src, source", priority = Priority.LOW, params = "array, arrayLike")
30+
public static final Function<Integer[], Integer[]> createIntegerArrayInputAware = from -> new Integer[from.length];
2531

2632
@OpField(names = "create, src, source", priority = Priority.LOW, params = "array1, array2, arrayLike")
2733
public static final BiFunction<double[], double[], double[]> createDoubleArrayBiInputAware = (i1, i2) -> {

scijava/scijava-ops-engine/src/main/java/org/scijava/ops/engine/impl/DefaultInfoChainGenerator.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,8 @@ public InfoChain generate(String signature, Map<String, OpInfo> idMap,
3030
List<String> dependencies = getDependencies(dependencySignature);
3131
List<InfoChain> dependencyChains = new ArrayList<>();
3232
for (String dep : dependencies) {
33-
Optional<InfoChainGenerator> genOpt = InfoChainGenerator
34-
.findSuitableGenerator(dep, generators);
35-
if (genOpt.isEmpty()) throw new IllegalArgumentException(
36-
"Could not find an InfoChainGenerator able to handle id" + dep);
37-
dependencyChains.add(genOpt.get().generate(dep, idMap, generators));
33+
dependencyChains.add(InfoChainGenerator.generateDependencyChain(dep,
34+
idMap, generators));
3835
}
3936
return new InfoChain(info, dependencyChains);
4037
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.scijava.ops.engine.simplify;
2+
3+
import org.scijava.ops.api.InfoChain;
4+
5+
public class CompleteMutatorChain extends MutatorChain {
6+
7+
private final InfoChain simpleChain;
8+
private final InfoChain focusChain;
9+
10+
public CompleteMutatorChain(InfoChain simplifier, InfoChain focuser,
11+
TypePair ioTypes)
12+
{
13+
super(simplifier.info(), focuser.info(), ioTypes, null);
14+
this.simpleChain = simplifier;
15+
this.focusChain = focuser;
16+
}
17+
18+
@Override
19+
public InfoChain simplifier() {
20+
return simpleChain;
21+
}
22+
23+
@Override
24+
public InfoChain focuser() {
25+
return focusChain;
26+
}
27+
28+
}

scijava/scijava-ops-engine/src/main/java/org/scijava/ops/engine/simplify/MutatorChain.java

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -47,30 +47,6 @@ public MutatorChain(OpInfo simplifier,
4747
output, focuserOutput, focuserInput);
4848
}
4949

50-
public MutatorChain(InfoChain simplifier,
51-
InfoChain focuser, TypePair ioTypes, OpEnvironment env)
52-
{
53-
this.simplifier = simplifier.info();
54-
this.simpleChain = simplifier;
55-
this.focuser = focuser.info();
56-
this.focusChain = focuser;
57-
this.input = ioTypes.getA();
58-
this.output = ioTypes.getB();
59-
this.env = env;
60-
61-
// determine simple and unfocused types.
62-
Type simplifierInput = this.simplifier.inputs().stream().filter(m -> !m
63-
.isOutput()).findFirst().get().getType();
64-
Type simplifierOutput = this.simplifier.output().getType();
65-
simple = SimplificationUtils.resolveMutatorTypeArgs(
66-
input, simplifierInput, simplifierOutput);
67-
Type focuserOutput = this.focuser.output().getType();
68-
Type focuserInput = this.focuser.inputs().stream().filter(m -> !m
69-
.isOutput()).findFirst().get().getType();
70-
unfocused = SimplificationUtils.resolveMutatorTypeArgs(
71-
output, focuserOutput, focuserInput);
72-
}
73-
7450
public boolean isValid() {
7551
return Types.isAssignable(simple, unfocused);
7652
}

scijava/scijava-ops-engine/src/main/java/org/scijava/ops/engine/simplify/SimplificationInfoChainGenerator.java

Lines changed: 107 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,133 @@
11
package org.scijava.ops.engine.simplify;
22

3+
import java.util.ArrayList;
34
import java.util.Collection;
5+
import java.util.List;
46
import java.util.Map;
7+
import java.util.Optional;
58

69
import org.scijava.ops.api.InfoChain;
710
import org.scijava.ops.api.InfoChainGenerator;
811
import org.scijava.ops.api.OpInfo;
12+
import org.scijava.plugin.Plugin;
913

10-
14+
@Plugin(type = InfoChainGenerator.class)
1115
public class SimplificationInfoChainGenerator implements InfoChainGenerator {
1216

1317
@Override
1418
public InfoChain generate(String signature, Map<String, OpInfo> idMap,
1519
Collection<InfoChainGenerator> generators)
1620
{
17-
// TODO Auto-generated method stub
18-
return null;
21+
// get the list of components
22+
List<String> components = parseComponents(signature.substring(SimplifiedOpInfo.IMPL_DECLARATION.length()));
23+
int compIndex = 0;
24+
25+
// Proceed to input simplifiers
26+
List<InfoChain> refSimplifiers = new ArrayList<>();
27+
String refSimpComp = components.get(compIndex);
28+
while (refSimpComp.startsWith(
29+
SimplifiedOpInfo.INPUT_SIMPLIFIER_DELIMITER))
30+
{
31+
String refSimpSignature = refSimpComp.substring(
32+
SimplifiedOpInfo.INPUT_SIMPLIFIER_DELIMITER.length());
33+
InfoChain refSimpChain = InfoChainGenerator.generateDependencyChain(
34+
refSimpSignature, idMap, generators);
35+
refSimplifiers.add(refSimpChain);
36+
refSimpComp = components.get(++compIndex);
37+
}
38+
39+
// Proceed to input simplifiers
40+
List<InfoChain> infoFocusers = new ArrayList<>();
41+
String infoFocuserComp = components.get(compIndex);
42+
while (infoFocuserComp.startsWith(
43+
SimplifiedOpInfo.INPUT_FOCUSER_DELIMITER))
44+
{
45+
String infoFocSignature = infoFocuserComp.substring(
46+
SimplifiedOpInfo.INPUT_FOCUSER_DELIMITER.length());
47+
InfoChain infoFocChain = InfoChainGenerator.generateDependencyChain(
48+
infoFocSignature, idMap, generators);
49+
infoFocusers.add(infoFocChain);
50+
infoFocuserComp = components.get(++compIndex);
51+
}
52+
53+
if (infoFocusers.size() != refSimplifiers.size())
54+
throw new IllegalArgumentException("Signature " + signature +
55+
" does not have the same number of input simplifiers and input focusers!");
56+
57+
// Proceed to output simplifier
58+
String outSimpComp = components.get(compIndex++);
59+
if (!outSimpComp.startsWith(SimplifiedOpInfo.OUTPUT_SIMPLIFIER_DELIMITER))
60+
throw new IllegalArgumentException("Signature " + signature +
61+
" does not contain an output simplifier signature (starting with " +
62+
SimplifiedOpInfo.OUTPUT_SIMPLIFIER_DELIMITER + ")");
63+
String outSimpSignature = outSimpComp.substring(
64+
SimplifiedOpInfo.OUTPUT_SIMPLIFIER_DELIMITER.length());
65+
InfoChain outputSimplifierChain = InfoChainGenerator
66+
.generateDependencyChain(outSimpSignature, idMap, generators);
67+
68+
// Proceed to output focuser
69+
String outFocComp = components.get(compIndex++);
70+
if (!outFocComp.startsWith(SimplifiedOpInfo.OUTPUT_FOCUSER_DELIMITER))
71+
throw new IllegalArgumentException("Signature " + signature +
72+
" does not contain an output simplifier signature (starting with " +
73+
SimplifiedOpInfo.OUTPUT_FOCUSER_DELIMITER + ")");
74+
String outFocSignature = outFocComp.substring(
75+
SimplifiedOpInfo.OUTPUT_FOCUSER_DELIMITER.length());
76+
InfoChain outputFocuserChain = InfoChainGenerator.generateDependencyChain(
77+
outFocSignature, idMap, generators);
78+
79+
// Proceed to output copier
80+
Optional<InfoChain> copierChain;
81+
String outCopyComp = components.get(compIndex++);
82+
if (!outCopyComp.startsWith(SimplifiedOpInfo.OUTPUT_COPIER_DELIMITER))
83+
throw new IllegalArgumentException("Signature " + signature +
84+
" does not contain an output simplifier signature (starting with " +
85+
SimplifiedOpInfo.OUTPUT_COPIER_DELIMITER + ")");
86+
String outCopySignature = outCopyComp.substring(
87+
SimplifiedOpInfo.OUTPUT_COPIER_DELIMITER.length());
88+
if (outCopySignature.isEmpty()) copierChain = Optional.empty();
89+
else {
90+
copierChain = Optional.of(InfoChainGenerator.generateDependencyChain(
91+
outCopySignature, idMap, generators));
92+
}
93+
94+
// Proceed to original info
95+
String originalComponent = components.get(compIndex++);
96+
if (!originalComponent.startsWith(SimplifiedOpInfo.ORIGINAL_INFO))
97+
throw new IllegalArgumentException("Signature " + signature +
98+
" does not contain an original Op signature (starting with " +
99+
SimplifiedOpInfo.ORIGINAL_INFO + ")");
100+
String originalSignature = originalComponent.substring(
101+
SimplifiedOpInfo.ORIGINAL_INFO.length());
102+
InfoChain originalChain = InfoChainGenerator.generateDependencyChain(
103+
originalSignature, idMap, generators);
104+
105+
106+
SimplificationMetadata metadata = new SimplificationMetadata(originalChain
107+
.info(), refSimplifiers, infoFocusers, outputSimplifierChain,
108+
outputFocuserChain, copierChain);
109+
OpInfo baseInfo = new SimplifiedOpInfo(originalChain.info(), metadata, Double.MIN_VALUE);
110+
return new InfoChain(baseInfo, originalChain.dependencies());
111+
}
112+
113+
List<String> parseComponents(String signature) {
114+
List<String> components = new ArrayList<>();
115+
String s = signature;
116+
while(s.length() > 0) {
117+
String subSignatureFrom = InfoChainGenerator.subSignatureFrom(s, 0);
118+
components.add(subSignatureFrom);
119+
s = s.substring(subSignatureFrom.length());
120+
}
121+
return components;
19122
}
20123

21124
@Override
22125
public boolean canGenerate(String signature) {
23-
// TODO Auto-generated method stub
24-
return false;
126+
return signature.startsWith(SimplifiedOpInfo.IMPL_DECLARATION);
25127
}
26128

27129
@Override
28130
public double priority() {
29-
// TODO Auto-generated method stub
30131
return 0;
31132
}
32133

scijava/scijava-ops-engine/src/main/java/org/scijava/ops/engine/simplify/SimplificationMetadata.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import org.scijava.function.Computers;
1414
import org.scijava.function.Computers.Arity1;
1515
import org.scijava.ops.api.InfoChain;
16-
import org.scijava.ops.api.OpEnvironment;
1716
import org.scijava.ops.api.OpInfo;
1817
import org.scijava.ops.api.OpUtils;
1918
import org.scijava.struct.Member;
@@ -72,7 +71,7 @@ public SimplificationMetadata(SimplifiedOpRef ref, OpInfo info, TypePair[] argPa
7271
numInputs = refSimplifiers.size();
7372
}
7473

75-
public SimplificationMetadata(OpInfo info, List<InfoChain> refSimplifiers, List<InfoChain> infoFocusers, InfoChain infoSimplifier, InfoChain refFocuser, Optional<InfoChain> outputCopier, OpEnvironment env) {
74+
public SimplificationMetadata(OpInfo info, List<InfoChain> refSimplifiers, List<InfoChain> infoFocusers, InfoChain infoSimplifier, InfoChain refFocuser, Optional<InfoChain> outputCopier) {
7675
this.info = info;
7776
this.opType = Types.raw(info.opType());
7877

@@ -101,13 +100,13 @@ public SimplificationMetadata(OpInfo info, List<InfoChain> refSimplifiers, List<
101100
InfoChain focuser = this.infoFocusers.get(i);
102101
Type inType = simplifier.info().inputs().get(0).getType();
103102
Type outType = focuser.info().output().getType();
104-
inputChains.add(new MutatorChain(simplifier, focuser, new TypePair(inType, outType), env));
103+
inputChains.add(new CompleteMutatorChain(simplifier, focuser, new TypePair(inType, outType)));
105104
}
106105
this.argChains = inputChains.toArray(MutatorChain[]::new);
107106

108107
Type inType = this.infoSimplifier.info().inputs().get(0).getType();
109108
Type outType = this.refFocuser.info().output().getType();
110-
this.outChain = new MutatorChain(this.infoSimplifier, this.refFocuser, new TypePair(inType, outType), env);
109+
this.outChain = new CompleteMutatorChain(this.infoSimplifier, this.refFocuser, new TypePair(inType, outType));
111110
}
112111

113112
private static List<Function<?, ?>> inputSimplifiers(List<InfoChain> refSimplifiers)
@@ -279,16 +278,32 @@ protected List<OpInfo> inputSimplifierInfos() {
279278
return refSimplifiers.stream().map(chain -> chain.info()).collect(Collectors.toList());
280279
}
281280

281+
protected List<InfoChain> inputSimplifierChains() {
282+
return refSimplifiers;
283+
}
284+
282285
protected List<OpInfo> inputFocuserInfos() {
283286
return infoFocusers.stream().map(chain -> chain.info()).collect(Collectors.toList());
284287
}
285288

289+
protected List<InfoChain> inputFocuserChains() {
290+
return infoFocusers;
291+
}
292+
286293
protected OpInfo outputSimplifierInfo() {
287294
return infoSimplifier.info();
288295
}
289296

297+
protected InfoChain outputSimplifierChain() {
298+
return infoSimplifier;
299+
}
300+
290301
protected OpInfo outputFocuserInfo() {
291302
return refFocuser.info();
292303
}
293304

305+
protected InfoChain outputFocuserChain() {
306+
return refFocuser;
307+
}
308+
294309
}

0 commit comments

Comments
 (0)