Skip to content

Commit 0718184

Browse files
Treiblesschorlegselzer
authored andcommitted
Add more transformers and ops
1 parent 38275e1 commit 0718184

5 files changed

Lines changed: 149 additions & 0 deletions

File tree

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.scijava.ops.copy;
2+
3+
import org.scijava.core.Priority;
4+
import org.scijava.ops.OpField;
5+
import org.scijava.ops.core.Computer;
6+
import org.scijava.ops.core.OpCollection;
7+
import org.scijava.param.Parameter;
8+
import org.scijava.plugin.Plugin;
9+
import org.scijava.struct.ItemIO;
10+
11+
@Plugin(type = OpCollection.class)
12+
public class CopyOpCollection {
13+
14+
@OpField(names = "cp, copy", priority = Priority.LOW)
15+
@Parameter(key = "array")
16+
@Parameter(key = "arrayCopy", type = ItemIO.OUTPUT)
17+
public static final Computer<double[], double[]> copyDoubleArray = (from, to) -> {
18+
for (int i = 0; i < to.length; i++) {
19+
to[i] = from[i];
20+
}
21+
};
22+
23+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.scijava.ops.create;
2+
3+
import java.util.function.Function;
4+
5+
import org.scijava.core.Priority;
6+
import org.scijava.ops.OpField;
7+
import org.scijava.ops.core.OpCollection;
8+
import org.scijava.param.Parameter;
9+
import org.scijava.plugin.Plugin;
10+
import org.scijava.struct.ItemIO;
11+
12+
@Plugin(type = OpCollection.class)
13+
public class CreateOpCollection {
14+
15+
@OpField(names = "create, src, source", priority = Priority.LOW)
16+
@Parameter(key = "array")
17+
@Parameter(key = "arrayLike", type = ItemIO.OUTPUT)
18+
public static final Function<double[], double[]> createDoubleArray = from -> new double[from.length];
19+
20+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.scijava.ops.transform.impl;
2+
3+
import java.lang.reflect.Type;
4+
import java.util.function.Function;
5+
6+
import org.scijava.ops.OpService;
7+
import org.scijava.ops.core.Computer;
8+
import org.scijava.ops.matcher.OpRef;
9+
import org.scijava.ops.transform.OpTransformer;
10+
import org.scijava.ops.transform.TypeModUtils;
11+
import org.scijava.ops.util.Adapt;
12+
import org.scijava.ops.util.Functions;
13+
import org.scijava.plugin.Plugin;
14+
import org.scijava.types.Nil;
15+
16+
@Plugin(type = OpTransformer.class)
17+
public class ComputerToFunctionTransformer implements OpTransformer {
18+
19+
@Override
20+
public Object transform(OpService opService, OpRef ref, Object src) {
21+
if (src instanceof Computer) {
22+
// TODO what happens if we actually have several?
23+
Type[] outTypes = ref.getOutTypes();
24+
Type[] argTypes = ref.getArgs();
25+
try {
26+
Function srcOp = Functions.unary(opService, "create", Nil.of(argTypes[0]), Nil.of(outTypes[0]));
27+
return Adapt.Computers.asFunction((Computer) src, srcOp);
28+
} catch (Exception e) {
29+
//TODO
30+
}
31+
}
32+
return null;
33+
}
34+
35+
@Override
36+
public OpRef getFromTransformTo(OpRef toRef) {
37+
Type[] refTypes = toRef.getTypes();
38+
boolean hit = TypeModUtils.replaceRawTypes(refTypes, Function.class, Computer.class);
39+
if (hit) {
40+
// The computer has a ItemIO.BOTH as second functional parameter of type functional output.
41+
// Hence, we need to add it after the first functional input.
42+
Type[] computerArgs = TypeModUtils.insert(toRef.getArgs(), toRef.getOutTypes()[0], 1);
43+
return OpRef.fromTypes(toRef.getName(), refTypes, toRef.getOutTypes(), computerArgs);
44+
}
45+
return null;
46+
}
47+
48+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package org.scijava.ops.transform.impl;
2+
3+
import java.lang.reflect.Type;
4+
import java.util.List;
5+
import java.util.function.Function;
6+
7+
import org.scijava.ops.OpService;
8+
import org.scijava.ops.matcher.OpRef;
9+
import org.scijava.ops.transform.OpTransformer;
10+
import org.scijava.ops.transform.TypeModUtils;
11+
import org.scijava.ops.util.Maps;
12+
import org.scijava.plugin.Plugin;
13+
14+
@Plugin(type = OpTransformer.class)
15+
public class LiftFunctionToListTransformer implements OpTransformer {
16+
17+
@Override
18+
public Object transform(OpService opService, OpRef fromRef, Object src) {
19+
if (src instanceof Function) {
20+
try {
21+
return Maps.Lift.Functions.list((Function) src);
22+
} catch (Exception e) {
23+
// TODO
24+
}
25+
}
26+
return null;
27+
}
28+
29+
@Override
30+
public OpRef getFromTransformTo(OpRef toRef) {
31+
// TODO put the code below into a utils method
32+
Type[] refTypes = toRef.getTypes();
33+
boolean typesChanged = TypeModUtils.unliftParameterizedTypes(refTypes, Function.class, List.class);
34+
// TODO We assume here that the functional input is the first Type in
35+
// this list and all others are secondary args if there are any (we do
36+
// not want to touch them as they are not part of op transformations).
37+
// Should always be the case as during structification of the ops,
38+
// the functional args are always checked first. Hence, they always
39+
// need to be requested first and are thus at the beginning of the list.
40+
// From the functional type we know how many there must be.
41+
Type[] args = toRef.getArgs();
42+
boolean argsChanged = TypeModUtils.unliftTypes(args, List.class);
43+
Type[] outs = toRef.getOutTypes();
44+
boolean outsChanged = TypeModUtils.unliftTypes(outs, List.class);
45+
46+
if (typesChanged && argsChanged && outsChanged) {
47+
return OpRef.fromTypes(toRef.getName(), refTypes, outs, args);
48+
}
49+
return null;
50+
}
51+
52+
}

src/main/java/org/scijava/ops/util/Maps.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package org.scijava.ops.util;
22

33
import java.util.Iterator;
4+
import java.util.List;
45
import java.util.function.Function;
6+
import java.util.stream.Collectors;
57

68
import org.scijava.ops.core.Computer;
79

@@ -21,6 +23,10 @@ public static class Functions {
2123
private Functions() {
2224
}
2325

26+
public static <I, O> Function<List<I>, List<O>> list(final Function<I, O> function) {
27+
return iter -> iter.stream().map(function).collect(Collectors.toList());
28+
}
29+
2430
public static <I, O> Function<Iterable<I>, Iterable<O>> iterable(final Function<I, O> function) {
2531
return iter -> () -> Streams.stream(iter).map(function).iterator();
2632
}

0 commit comments

Comments
 (0)