Skip to content

Commit 1ff40fa

Browse files
Work on FlattenedType
1 parent 4b5f6dd commit 1ff40fa

File tree

13 files changed

+103
-57
lines changed

13 files changed

+103
-57
lines changed

core/src/main/java/network/aika/typedefs/ActivationDefinition.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@
3636
public class ActivationDefinition extends Type<ActivationDefinition, Activation> {
3737

3838

39-
public static RelationTypeMany<ActivationDefinition, Activation, LinkDefinition, Link> INPUT = new RelationTypeMany<>(Activation::getInputLinks, ActivationDefinition.class, LinkDefinition.class, "ACT-INPUT");
40-
public static RelationTypeMany<ActivationDefinition, Activation, LinkDefinition, Link> OUTPUT = new RelationTypeMany<>(Activation::getOutputLinks, ActivationDefinition.class, LinkDefinition.class, "ACT-OUTPUT");
41-
public static RelationTypeOne<ActivationDefinition, Activation, NeuronDefinition, Neuron> NEURON = new RelationTypeOne<>(Activation::getNeuron, ActivationDefinition.class, NeuronDefinition.class, "ACT-NEURON");
39+
public static RelationTypeMany<ActivationDefinition, Activation, LinkDefinition, Link> INPUT = new RelationTypeMany<>(Activation::getInputLinks, "ACT-INPUT");
40+
public static RelationTypeMany<ActivationDefinition, Activation, LinkDefinition, Link> OUTPUT = new RelationTypeMany<>(Activation::getOutputLinks, "ACT-OUTPUT");
41+
public static RelationTypeOne<ActivationDefinition, Activation, NeuronDefinition, Neuron> NEURON = new RelationTypeOne<>(Activation::getNeuron, "ACT-NEURON");
4242

4343
static {
4444
NEURON.setReversed(NeuronDefinition.ACTIVATION);

core/src/main/java/network/aika/typedefs/LinkDefinition.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@
3131
*/
3232
public class LinkDefinition extends Type<LinkDefinition, Link> {
3333

34-
public static RelationTypeOne<LinkDefinition, Link, ActivationDefinition, Activation> INPUT = new RelationTypeOne<>(Link::getInput, LinkDefinition.class, ActivationDefinition.class, "LINK-INPUT");
35-
public static RelationTypeOne<LinkDefinition, Link, ActivationDefinition, Activation> OUTPUT = new RelationTypeOne<>(Link::getOutput, LinkDefinition.class, ActivationDefinition.class, "LINK-OUTPUT");
36-
public static RelationTypeOne<LinkDefinition, Link, SynapseDefinition, Synapse> SYNAPSE = new RelationTypeOne<>(Link::getSynapse, LinkDefinition.class, SynapseDefinition.class, "LINK-SYNAPSE");
34+
public static RelationTypeOne<LinkDefinition, Link, ActivationDefinition, Activation> INPUT = new RelationTypeOne<>(Link::getInput, "LINK-INPUT");
35+
public static RelationTypeOne<LinkDefinition, Link, ActivationDefinition, Activation> OUTPUT = new RelationTypeOne<>(Link::getOutput, "LINK-OUTPUT");
36+
public static RelationTypeOne<LinkDefinition, Link, SynapseDefinition, Synapse> SYNAPSE = new RelationTypeOne<>(Link::getSynapse, "LINK-SYNAPSE");
3737

38-
public static RelationTypeOne<LinkDefinition, Link, LinkDefinition, Link> CORRESPONDING_INPUT_LINK = new RelationTypeOne<>(l -> l.getInput().getCorrespondingInputLink(l), LinkDefinition.class, LinkDefinition.class, "CORRESPONDING_INPUT_LINK");
39-
public static RelationTypeOne<LinkDefinition, Link, LinkDefinition, Link> CORRESPONDING_OUTPUT_LINK = new RelationTypeOne<>(l -> l.getOutput().getCorrespondingOutputLink(l), LinkDefinition.class, LinkDefinition.class, "CORRESPONDING_OUTPUT_LINK");
38+
public static RelationTypeOne<LinkDefinition, Link, LinkDefinition, Link> CORRESPONDING_INPUT_LINK = new RelationTypeOne<>(l -> l.getInput().getCorrespondingInputLink(l), "CORRESPONDING_INPUT_LINK");
39+
public static RelationTypeOne<LinkDefinition, Link, LinkDefinition, Link> CORRESPONDING_OUTPUT_LINK = new RelationTypeOne<>(l -> l.getOutput().getCorrespondingOutputLink(l), "CORRESPONDING_OUTPUT_LINK");
4040

4141
static {
4242
SYNAPSE.setReversed(SynapseDefinition.LINK);

core/src/main/java/network/aika/typedefs/NeuronDefinition.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@
3333
*/
3434
public class NeuronDefinition extends Type<NeuronDefinition, Neuron> {
3535

36-
public static RelationTypeMany<NeuronDefinition, Neuron, SynapseDefinition, Synapse> INPUT = new RelationTypeMany<>(Neuron::getInputSynapsesByType, NeuronDefinition.class, SynapseDefinition.class, "NEURON-INPUT");
37-
public static RelationTypeMany<NeuronDefinition, Neuron, SynapseDefinition, Synapse> OUTPUT = new RelationTypeMany<>(Neuron::getOutputSynapsesByType, NeuronDefinition.class, SynapseDefinition.class, "NEURON-OUTPUT");
38-
public static RelationTypeMany<NeuronDefinition, Neuron, ActivationDefinition, Activation> ACTIVATION = new RelationTypeMany<>(null, NeuronDefinition.class, ActivationDefinition.class, "NEURON-ACTIVATION");
36+
public static RelationTypeMany<NeuronDefinition, Neuron, SynapseDefinition, Synapse> INPUT = new RelationTypeMany<>(Neuron::getInputSynapsesByType, "NEURON-INPUT");
37+
public static RelationTypeMany<NeuronDefinition, Neuron, SynapseDefinition, Synapse> OUTPUT = new RelationTypeMany<>(Neuron::getOutputSynapsesByType, "NEURON-OUTPUT");
38+
public static RelationTypeMany<NeuronDefinition, Neuron, ActivationDefinition, Activation> ACTIVATION = new RelationTypeMany<>(null, "NEURON-ACTIVATION");
3939

4040
static {
4141
ACTIVATION.setReversed(ActivationDefinition.NEURON);

core/src/main/java/network/aika/typedefs/SynapseDefinition.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@
3636
*/
3737
public class SynapseDefinition extends Type<SynapseDefinition, Synapse> {
3838

39-
public static RelationTypeOne<SynapseDefinition, Synapse, NeuronDefinition, Neuron> INPUT = new RelationTypeOne<>(Synapse::getInput, SynapseDefinition.class, NeuronDefinition.class, "SYN-INPUT");
40-
public static RelationTypeOne<SynapseDefinition, Synapse, NeuronDefinition, Neuron> OUTPUT = new RelationTypeOne<>(Synapse::getOutput, SynapseDefinition.class, NeuronDefinition.class, "SYN-OUTPUT");
41-
public static RelationTypeMany<SynapseDefinition, Synapse, LinkDefinition, Link> LINK = new RelationTypeMany<>(null, SynapseDefinition.class, LinkDefinition.class, "SYN-LINK");
39+
public static RelationTypeOne<SynapseDefinition, Synapse, NeuronDefinition, Neuron> INPUT = new RelationTypeOne<>(Synapse::getInput, "SYN-INPUT");
40+
public static RelationTypeOne<SynapseDefinition, Synapse, NeuronDefinition, Neuron> OUTPUT = new RelationTypeOne<>(Synapse::getOutput, "SYN-OUTPUT");
41+
public static RelationTypeMany<SynapseDefinition, Synapse, LinkDefinition, Link> LINK = new RelationTypeMany<>(null, "SYN-LINK");
4242

4343
static {
4444
LINK.setReversed(LinkDefinition.SYNAPSE);

fields/src/main/java/network/aika/type/FlattenedType.java

Lines changed: 70 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,19 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
117
package network.aika.type;
218

319
import network.aika.fields.defs.FieldDefinition;
@@ -8,6 +24,10 @@
824
import java.util.List;
925
import java.util.SortedSet;
1026

27+
/**
28+
*
29+
* @author Lukas Molzberger
30+
*/
1131
public class FlattenedType<T extends Type<T, O>, O extends Obj<T, O>> {
1232

1333
private final T type;
@@ -19,6 +39,7 @@ public class FlattenedType<T extends Type<T, O>, O extends Obj<T, O>> {
1939
private FieldLinkDefinition<T, O, ?, ?>[][] outputs; // To-Type, FD-List
2040

2141

42+
@SuppressWarnings("unchecked")
2243
public FlattenedType(T type) {
2344
this.type = type;
2445

@@ -36,24 +57,61 @@ public FlattenedType(T type) {
3657
}
3758

3859
fieldsReverse = fieldsRev.toArray(new FieldDefinition[0]);
60+
}
3961

62+
public void flattenFieldLinks() {
63+
inputs = flattenInputs(type);
64+
outputs = flattenOutputs(type);
65+
}
66+
67+
@SuppressWarnings("unchecked")
68+
private FieldLinkDefinition<?, ?, T, O>[][] flattenInputs(T type) {
69+
FieldLinkDefinition<?, ?, T, O>[][] results = new FieldLinkDefinition[type.getTypeRegistry().getTypes().size()][];
4070
for (Type<?, ?> relType: type.getTypeRegistry().getTypes()) {
41-
List<? extends FieldLinkDefinition> results = new ArrayList<>();
42-
for(FieldDefinition<T, O> fd: fieldsRev) {
43-
flattenOutputs(results, relType, fd);
44-
}
45-
outputs[relType.getId()] = results.toArray(new FieldLinkDefinition[0]);
71+
results[relType.getId()] = flattenInputPerType(relType);
72+
}
73+
return results;
74+
}
75+
76+
@SuppressWarnings("unchecked")
77+
private FieldLinkDefinition<?, ?, T, O>[] flattenInputPerType(Type<?, ?> relType) {
78+
List<FieldLinkDefinition<?, ?, T, O>> results = new ArrayList<>();
79+
for (FieldDefinition<T, O> fd : fieldsReverse) {
80+
fd.getInputs()
81+
.filter(fl ->
82+
relType.isInstanceOf(fl.getInput().getObjectType())
83+
)
84+
.filter(fl ->
85+
relType.getFlattenedType().fields[fl.getInput().getFieldId()] >= 0
86+
)
87+
.forEach(results::add);
4688
}
89+
90+
return results.toArray(new FieldLinkDefinition[0]);
4791
}
4892

4993
@SuppressWarnings("unchecked")
50-
private void flattenOutputs(List<? extends FieldLinkDefinition> results, Type<?, ?> relType, FieldDefinition<T, O> fd) {
51-
List<? extends FieldLinkDefinition> results = fd.getOutputs()
52-
.filter(fl -> fl.getOutput().getObjectType() == relType)
53-
.filter(fl ->
54-
fl.getInputToOutputRelationType().testRelation(type, relType)
55-
)
56-
.toList();
94+
private FieldLinkDefinition<T, O, ?, ?>[][] flattenOutputs(T type) {
95+
FieldLinkDefinition<T, O, ?, ?>[][] results = new FieldLinkDefinition[type.getTypeRegistry().getTypes().size()][];
96+
for (Type<?, ?> relType: type.getTypeRegistry().getTypes()) {
97+
results[relType.getId()] = flattenOutputsPerType(relType);
98+
}
99+
return results;
100+
}
101+
102+
@SuppressWarnings("unchecked")
103+
private FieldLinkDefinition<T, O, ?, ?>[] flattenOutputsPerType(Type<?, ?> relType) {
104+
List<FieldLinkDefinition<T, O, ?, ?>> results = new ArrayList<>();
105+
for (FieldDefinition<T, O> fd : fieldsReverse) {
106+
fd.getOutputs()
107+
.filter(fl ->
108+
relType.isInstanceOf(fl.getOutput().getObjectType())
109+
)
110+
.filter(fl ->
111+
relType.getFlattenedType().fields[fl.getOutput().getFieldId()] >= 0
112+
)
113+
.forEach(results::add);
114+
}
57115

58116
return results.toArray(new FieldLinkDefinition[0]);
59117
}

fields/src/main/java/network/aika/type/TypeRegistryImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,5 +69,10 @@ public void flattenTypeHierarchy() {
6969

7070
sortedTypes
7171
.forEach(Type::initFlattenedType);
72+
73+
sortedTypes
74+
.forEach(t ->
75+
t.getFlattenedType().flattenFieldLinks()
76+
);
7277
}
7378
}

fields/src/main/java/network/aika/type/relations/AbstractRelationType.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,7 @@ public abstract class AbstractRelationType<
3434

3535
private RelationType<TD, T, FD, F> reversed;
3636

37-
protected final Class<FD> input;
38-
protected final Class<TD> output;
39-
40-
public AbstractRelationType(Class<FD> input, Class<TD> output, String relationName) {
41-
this.input = input;
42-
this.output = output;
37+
public AbstractRelationType(String relationName) {
4338
this.relationName = relationName;
4439
}
4540

@@ -57,8 +52,4 @@ public String toString() {
5752
return getRelationLabel() + " -> " + getReverse().getRelationLabel();
5853
}
5954

60-
@Override
61-
public boolean testRelation(FD fromType, TD toType) {
62-
return fromType.getClass() == input && toType.getClass() == output;
63-
}
6455
}

fields/src/main/java/network/aika/type/relations/RelationType.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,5 @@ public interface RelationType<
4040

4141
boolean testRelation(F fromObj, T toObj);
4242

43-
boolean testRelation(FD fromType, TD toType);
44-
4543
String getRelationLabel();
4644
}

fields/src/main/java/network/aika/type/relations/RelationTypeMany.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ public class RelationTypeMany<
3535

3636
private final BiFunction<F, TD, Stream<T>> transitionFunction;
3737

38-
public RelationTypeMany(BiFunction<F, TD, Stream<T>> transitionFunction, Class<FD> input, Class<TD> output, String relationName) {
39-
super(input, output, relationName);
38+
public RelationTypeMany(BiFunction<F, TD, Stream<T>> transitionFunction, String relationName) {
39+
super(relationName);
4040
this.transitionFunction = transitionFunction;
4141
}
4242

fields/src/main/java/network/aika/type/relations/RelationTypeOne.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,8 @@ public class RelationTypeOne<
3535

3636
private final Function<F, T> followFunction;
3737

38-
39-
public RelationTypeOne(Function<F, T> followFunction, Class<FD> input, Class<TD> output, String relationName) {
40-
super(input, output, relationName);
38+
public RelationTypeOne(Function<F, T> followFunction, String relationName) {
39+
super(relationName);
4140
this.followFunction = followFunction;
4241
}
4342

0 commit comments

Comments
 (0)