Skip to content

Commit 4b5f6dd

Browse files
Introduction of FlattenedType
1 parent 0cb295f commit 4b5f6dd

File tree

20 files changed

+171
-70
lines changed

20 files changed

+171
-70
lines changed

core/src/main/java/network/aika/activations/Activation.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,9 @@ public void linkOutgoing() {
150150
}
151151

152152
void linkOutgoing(Synapse targetSyn) {
153-
Set<Activation> targets = collectLinkingTargets(targetSyn.getOutput(getModel()));
153+
Set<Activation> targets = collectLinkingTargets(
154+
targetSyn.getOutput(getModel())
155+
);
154156

155157
targets.forEach(targetAct ->
156158
targetSyn.createLink(

core/src/main/java/network/aika/neurons/Synapse.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import java.io.IOException;
3838
import java.util.HashMap;
3939
import java.util.Map;
40-
import java.util.Set;
4140

4241
import static network.aika.queue.Timestamp.MAX;
4342
import static network.aika.queue.Timestamp.MIN;

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, "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");
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");
4242

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

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package network.aika.typedefs;
1818

1919
import network.aika.activations.Activation;
20-
import network.aika.activations.InhibitoryActivation;
2120
import network.aika.activations.Link;
2221
import network.aika.type.relations.RelationTypeOne;
2322
import network.aika.neurons.Synapse;
@@ -32,12 +31,12 @@
3231
*/
3332
public class LinkDefinition extends Type<LinkDefinition, Link> {
3433

35-
public static RelationTypeOne<LinkDefinition, Link, ActivationDefinition, Activation> INPUT = new RelationTypeOne<>(Link::getInput, "LINK-INPUT");
36-
public static RelationTypeOne<LinkDefinition, Link, ActivationDefinition, Activation> OUTPUT = new RelationTypeOne<>(Link::getOutput, "LINK-OUTPUT");
37-
public static RelationTypeOne<LinkDefinition, Link, SynapseDefinition, Synapse> SYNAPSE = new RelationTypeOne<>(Link::getSynapse, "LINK-SYNAPSE");
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");
3837

39-
public static RelationTypeOne<LinkDefinition, Link, LinkDefinition, Link> CORRESPONDING_INPUT_LINK = new RelationTypeOne<>(l -> l.getInput().getCorrespondingInputLink(l), "CORRESPONDING_INPUT_LINK");
40-
public static RelationTypeOne<LinkDefinition, Link, LinkDefinition, Link> CORRESPONDING_OUTPUT_LINK = new RelationTypeOne<>(l -> l.getOutput().getCorrespondingOutputLink(l), "CORRESPONDING_OUTPUT_LINK");
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");
4140

4241
static {
4342
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, "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");
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");
3939

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

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
*/
1717
package network.aika.typedefs;
1818

19-
import network.aika.activations.InhibitoryActivation;
2019
import network.aika.activations.Link;
2120
import network.aika.bindingsignal.BSType;
2221
import network.aika.type.relations.RelationTypeMany;
@@ -37,9 +36,9 @@
3736
*/
3837
public class SynapseDefinition extends Type<SynapseDefinition, Synapse> {
3938

40-
public static RelationTypeOne<SynapseDefinition, Synapse, NeuronDefinition, Neuron> INPUT = new RelationTypeOne<>(Synapse::getInput, "SYN-INPUT");
41-
public static RelationTypeOne<SynapseDefinition, Synapse, NeuronDefinition, Neuron> OUTPUT = new RelationTypeOne<>(Synapse::getOutput, "SYN-OUTPUT");
42-
public static RelationTypeMany<SynapseDefinition, Synapse, LinkDefinition, Link> LINK = new RelationTypeMany<>(null, "SYN-LINK");
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");
4342

4443
static {
4544
LINK.setReversed(LinkDefinition.SYNAPSE);
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package network.aika.type;
2+
3+
import network.aika.fields.defs.FieldDefinition;
4+
import network.aika.fields.link.FieldLinkDefinition;
5+
6+
import java.util.ArrayList;
7+
import java.util.Arrays;
8+
import java.util.List;
9+
import java.util.SortedSet;
10+
11+
public class FlattenedType<T extends Type<T, O>, O extends Obj<T, O>> {
12+
13+
private final T type;
14+
15+
private final short[] fields;
16+
private final FieldDefinition<T, O>[] fieldsReverse;
17+
18+
private FieldLinkDefinition<?, ?, T, O>[][] inputs; // From-Type, FD-List
19+
private FieldLinkDefinition<T, O, ?, ?>[][] outputs; // To-Type, FD-List
20+
21+
22+
public FlattenedType(T type) {
23+
this.type = type;
24+
25+
fields = new short[type.getTypeRegistry().getNumberOfFields()];
26+
Arrays.fill(fields, (short) -1);
27+
28+
short numberOfFields = 0;
29+
ArrayList<FieldDefinition<T, O>> fieldsRev = new ArrayList<>();
30+
SortedSet<Type<T, O>> sortedTypes = type.collectTypes();
31+
for (Type<T, O> t : sortedTypes) {
32+
for (FieldDefinition<T, O> fd : t.getFieldDefinitions()) {
33+
fields[fd.getFieldId()] = numberOfFields++;
34+
fieldsRev.add(fd);
35+
}
36+
}
37+
38+
fieldsReverse = fieldsRev.toArray(new FieldDefinition[0]);
39+
40+
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]);
46+
}
47+
}
48+
49+
@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();
57+
58+
return results.toArray(new FieldLinkDefinition[0]);
59+
}
60+
61+
public short getFieldIndex(FieldDefinition<T, O> fd) {
62+
return fields[fd.getFieldId()];
63+
}
64+
65+
public short getNumberOfFields() {
66+
return (short) fieldsReverse.length;
67+
}
68+
69+
public T getType() {
70+
return type;
71+
}
72+
73+
public FieldDefinition<T, O> getFieldDefinitionIdByIndex(short idx) {
74+
return fieldsReverse[idx];
75+
}
76+
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import network.aika.fields.field.Field;
2222
import network.aika.queue.Queue;
2323

24-
import java.util.Map;
2524
import java.util.stream.Stream;
2625

2726
/**

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

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,7 @@
2525
import java.io.DataInput;
2626
import java.io.DataOutput;
2727
import java.io.IOException;
28-
import java.util.Arrays;
29-
import java.util.Map;
3028
import java.util.Objects;
31-
import java.util.TreeMap;
3229
import java.util.stream.Stream;
3330

3431
/**
@@ -47,10 +44,10 @@ public ObjImpl(T type) {
4744
@SuppressWarnings("unchecked")
4845
@Override
4946
public void initFields(Obj<?, ?> sourceObj) {
50-
type.getFieldDefinitions()
51-
.forEach(fd ->
52-
fd.initializeField(sourceObj, (O) this)
53-
);
47+
for(short i = 0; i < type.getFlattenedType().getNumberOfFields(); i++) {
48+
FieldDefinition<T, O> fd = type.getFlattenedType().getFieldDefinitionIdByIndex(i);
49+
fd.initializeField(sourceObj, (O) this);
50+
}
5451
}
5552

5653
@Override
@@ -70,14 +67,14 @@ public void setFields(Field[] fields) {
7067

7168
@Override
7269
public Field getField(FieldDefinition<T, O> fd) {
73-
short fieldIndex = type.getFieldIndex(fd);
70+
short fieldIndex = type.getFlattenedType().getFieldIndex(fd);
7471

7572
return fields[fieldIndex];
7673
}
7774

7875
@Override
7976
public Field getOrCreateField(FieldDefinition<T, O> fd) {
80-
short fieldIndex = type.getFieldIndex(fd);
77+
short fieldIndex = type.getFlattenedType().getFieldIndex(fd);
8178

8279
Field f = fields[fieldIndex];
8380
if(f == null) {

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

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,7 @@ public class Type<T extends Type<T, O>, O extends Obj<T, O>> {
5050

5151
private Integer depth;
5252

53-
private short[] flattenedFields;
54-
private short numberOfFields;
55-
53+
private FlattenedType<T, O> flattenedType;
5654

5755
public Type(TypeRegistry registry, String name) {
5856
this.name = name;
@@ -69,30 +67,17 @@ public boolean isAbstract() {
6967
return !children.isEmpty();
7068
}
7169

72-
public void initFlattenedFields() {
73-
flattenedFields = new short[registry.getNumberOfFields()];
74-
Arrays.fill(flattenedFields, (short) -1);
75-
76-
numberOfFields = 0;
77-
SortedSet<Type<?, ?>> sortedTypes = collectTypes();
78-
for (Type<?, ?> t : sortedTypes) {
79-
for (FieldDefinition<?, ?> fd : t.fieldDefinitions) {
80-
flattenedFields[fd.getFieldId()] = numberOfFields++;
81-
}
82-
}
83-
}
84-
85-
public short getFieldIndex(FieldDefinition<T, O> fd) {
86-
return flattenedFields[fd.getFieldId()];
70+
public void initFlattenedType() {
71+
flattenedType = new FlattenedType<>((T)this);
8772
}
8873

89-
public SortedSet<Type<?, ?>> collectTypes() {
90-
TreeSet<Type<?, ?>> sortedTypes = new TreeSet<>(TYPE_COMPARATOR);
74+
public SortedSet<Type<T, O>> collectTypes() {
75+
TreeSet<Type<T, O>> sortedTypes = new TreeSet<>(TYPE_COMPARATOR);
9176
collectTypesRecursiveStep(sortedTypes);
9277
return sortedTypes;
9378
}
9479

95-
public void collectTypesRecursiveStep(SortedSet<Type<?, ?>> sortedTypes) {
80+
public void collectTypesRecursiveStep(SortedSet<Type<T, O>> sortedTypes) {
9681
parents.forEach(p ->
9782
p.collectTypesRecursiveStep(sortedTypes)
9883
);
@@ -121,7 +106,7 @@ protected O instantiate(List<Class<?>> parameterTypes, List<Object> parameters)
121106
LOG.debug(instance.toString());
122107
}
123108

124-
instance.setFields(new Field[numberOfFields]);
109+
instance.setFields(new Field[flattenedType.getNumberOfFields()]);
125110

126111
return instance;
127112
} catch (InstantiationException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
@@ -158,6 +143,14 @@ public String getName() {
158143
return name;
159144
}
160145

146+
public TypeRegistry getTypeRegistry() {
147+
return registry;
148+
}
149+
150+
public FlattenedType<T, O> getFlattenedType() {
151+
return flattenedType;
152+
}
153+
161154
public void setFieldDefinition(FieldDefinition<T, O> fieldDef) {
162155
fieldDef.setFieldId(registry.createFieldId());
163156
fieldDefinitions.add(fieldDef);

0 commit comments

Comments
 (0)