Skip to content

Commit 8fc2764

Browse files
Work on FlattenedType
1 parent 1ff40fa commit 8fc2764

File tree

13 files changed

+98
-50
lines changed

13 files changed

+98
-50
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import network.aika.activations.Activation;
2121
import network.aika.activations.Link;
2222
import network.aika.bindingsignal.BindingSignal;
23+
import network.aika.type.relations.RelationType;
2324
import network.aika.type.relations.RelationTypeMany;
2425
import network.aika.type.relations.RelationTypeOne;
2526
import network.aika.neurons.Neuron;
@@ -28,6 +29,7 @@
2829
import network.aika.type.TypeRegistry;
2930

3031
import java.util.*;
32+
import java.util.stream.Stream;
3133

3234
/**
3335
*
@@ -54,6 +56,11 @@ public ActivationDefinition(TypeRegistry registry, String name) {
5456
super(registry, name);
5557
}
5658

59+
@Override
60+
public Stream<RelationType<ActivationDefinition, Activation, ?, ?>> getRelationTypes() {
61+
return Stream.of(INPUT, OUTPUT, NEURON);
62+
}
63+
5764
public Activation instantiate(int actId, Activation parent, Neuron n, Document doc, Map<BSType, BindingSignal> bindingSignals) {
5865
return instantiate(
5966
List.of(ActivationDefinition.class, Activation.class, Integer.class, Neuron.class, Document.class, Map.class),

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@
1818

1919
import network.aika.activations.Activation;
2020
import network.aika.activations.Link;
21+
import network.aika.type.relations.RelationType;
2122
import network.aika.type.relations.RelationTypeOne;
2223
import network.aika.neurons.Synapse;
2324
import network.aika.type.Type;
2425
import network.aika.type.TypeRegistry;
2526

2627
import java.util.List;
28+
import java.util.stream.Stream;
2729

2830
/**
2931
*
@@ -54,6 +56,11 @@ public LinkDefinition(TypeRegistry registry, String name) {
5456
super(registry, name);
5557
}
5658

59+
@Override
60+
public Stream<RelationType<LinkDefinition, Link, ?, ?>> getRelationTypes() {
61+
return Stream.of(INPUT, OUTPUT, SYNAPSE, CORRESPONDING_INPUT_LINK, CORRESPONDING_OUTPUT_LINK);
62+
}
63+
5764
public Link instantiate(Synapse synapse, Activation input, Activation output) {
5865
assert input.getType().isInstanceOf(getInput());
5966
assert output.getType().isInstanceOf(getOutput());

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,26 @@
1818

1919
import network.aika.Model;
2020
import network.aika.activations.Activation;
21+
import network.aika.activations.Link;
2122
import network.aika.type.Type;
2223
import network.aika.type.TypeRegistry;
24+
import network.aika.type.relations.RelationType;
2325
import network.aika.type.relations.RelationTypeMany;
2426
import network.aika.neurons.Neuron;
2527
import network.aika.neurons.RefType;
2628
import network.aika.neurons.Synapse;
2729

2830
import java.util.List;
31+
import java.util.stream.Stream;
2932

3033
/**
3134
*
3235
* @author Lukas Molzberger
3336
*/
3437
public class NeuronDefinition extends Type<NeuronDefinition, Neuron> {
3538

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");
39+
public static RelationTypeMany<NeuronDefinition, Neuron, SynapseDefinition, Synapse> INPUT = new RelationTypeMany<>(Neuron::getInputSynapsesAsStream, "NEURON-INPUT");
40+
public static RelationTypeMany<NeuronDefinition, Neuron, SynapseDefinition, Synapse> OUTPUT = new RelationTypeMany<>(Neuron::getOutputSynapsesAsStream, "NEURON-OUTPUT");
3841
public static RelationTypeMany<NeuronDefinition, Neuron, ActivationDefinition, Activation> ACTIVATION = new RelationTypeMany<>(null, "NEURON-ACTIVATION");
3942

4043
static {
@@ -51,6 +54,11 @@ public NeuronDefinition(TypeRegistry registry, String name) {
5154
super(registry, name);
5255
}
5356

57+
@Override
58+
public Stream<RelationType<NeuronDefinition, Neuron, ?, ?>> getRelationTypes() {
59+
return Stream.of(INPUT, OUTPUT, ACTIVATION);
60+
}
61+
5462
public Neuron instantiate(Model m) {
5563
return instantiate(
5664
List.of(NeuronDefinition.class, Model.class),

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import network.aika.activations.Link;
2020
import network.aika.bindingsignal.BSType;
21+
import network.aika.type.relations.RelationType;
2122
import network.aika.type.relations.RelationTypeMany;
2223
import network.aika.type.relations.RelationTypeOne;
2324
import network.aika.neurons.Neuron;
@@ -29,6 +30,7 @@
2930

3031
import java.util.List;
3132
import java.util.Set;
33+
import java.util.stream.Stream;
3234

3335
/**
3436
*
@@ -63,6 +65,11 @@ public SynapseDefinition(TypeRegistry registry, String name) {
6365
super(registry, name);
6466
}
6567

68+
@Override
69+
public Stream<RelationType<SynapseDefinition, Synapse, ?, ?>> getRelationTypes() {
70+
return Stream.of(INPUT, OUTPUT, LINK);
71+
}
72+
6673
public Synapse instantiate() {
6774
return instantiate(
6875
List.of(SynapseDefinition.class),

fields/src/main/java/network/aika/fields/defs/FieldDefinition.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import network.aika.fields.field.Field;
2020
import network.aika.fields.link.ArgFieldLinkDefinition;
2121
import network.aika.fields.link.FieldLinkDefinition;
22+
import network.aika.type.FlattenedType;
2223
import network.aika.type.relations.RelationType;
2324
import network.aika.type.relations.RelationTypeOne;
2425
import network.aika.type.Obj;
@@ -99,10 +100,19 @@ public void initializeField(Obj<?, ?> sourceObj, O obj) {
99100

100101
@SuppressWarnings("unchecked")
101102
public void propagateUpdate(O fromObj, double update) {
102-
getOutputs()
103-
.forEach(fl ->
104-
fl.propagateToAll(fromObj, update)
105-
);
103+
for(int rel = 0; rel < getObjectType().getFlattenedType().getOutputs().length; rel++) {
104+
FieldLinkDefinition<T, O, ?, ?>[][] outputs = getObjectType().getFlattenedType().getOutputs()[rel];
105+
RelationType<T, O, ?, ?> relationType = getObjectType().getRelationType(rel);
106+
107+
if(outputs != null) {
108+
relationType.followAll(fromObj)
109+
.forEach(toObj -> {
110+
for(FieldLinkDefinition fl: outputs[toObj.getType().getId()]) {
111+
fl.getOutput().receiveUpdate(toObj, fl, update);
112+
}
113+
});
114+
}
115+
}
106116
}
107117

108118
public FieldDefinition<T, O> getParent() {
@@ -131,8 +141,12 @@ public void addOutput(FieldLinkDefinition<T, O, ?, ?> fl) {
131141
}
132142

133143
public Stream<? extends FieldLinkDefinition> getOutputs() {
144+
return outputs.stream();
145+
}
146+
147+
public Stream<? extends FieldLinkDefinition> getAllOutputs() {
134148
return parent != null ?
135-
Stream.concat(outputs.stream(), parent.getOutputs()) :
149+
Stream.concat(outputs.stream(), parent.getAllOutputs()) :
136150
outputs.stream();
137151
}
138152

@@ -188,9 +202,6 @@ public T getObjectType() {
188202
}
189203

190204
public Integer getFieldId() {
191-
if(parent != null)
192-
return parent.getFieldId();
193-
194205
return fieldId;
195206
}
196207

fields/src/main/java/network/aika/fields/link/ArgFieldLinkDefinition.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,7 @@ public int getArgument() {
3535

3636
public Field getInputField(OO obj) {
3737
var rt = (RelationTypeOne<OT, OO, IT, IO>) getOutputToInputRelationType();
38-
IO inputObj = rt.followOne(
39-
obj,
40-
getInput().getObjectType()
41-
);
38+
IO inputObj = rt.followOne(obj);
4239

4340
return inputObj.getField(getInput());
4441
}

fields/src/main/java/network/aika/fields/link/FieldLinkDefinition.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public void fetchFrom(IO sourceObj, OO obj) {
5050
if (rt.testRelation(obj, sourceObj))
5151
fetchFromObject(sourceObj, obj);
5252
} else {
53-
rt.followAll(obj, input.getObjectType())
53+
rt.followAll(obj)
5454
.forEach(fo ->
5555
fetchFromObject(fo, obj)
5656
);
@@ -62,14 +62,6 @@ private void fetchFromObject(IO sourceObj, OO obj) {
6262
output.receiveUpdate(obj, this, inputFieldValue);
6363
}
6464

65-
public void propagateToAll(IO fromObj, double update) {
66-
getInputToOutputRelationType()
67-
.followAll(fromObj, output.getObjectType())
68-
.forEach(toObj ->
69-
output.receiveUpdate(toObj, this, update)
70-
);
71-
}
72-
7365
@Override
7466
public String toString() {
7567
return input + " -- (" + inputToOutputRelationType + ") -> " + output;

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

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ public class FlattenedType<T extends Type<T, O>, O extends Obj<T, O>> {
3535
private final short[] fields;
3636
private final FieldDefinition<T, O>[] fieldsReverse;
3737

38-
private FieldLinkDefinition<?, ?, T, O>[][] inputs; // From-Type, FD-List
39-
private FieldLinkDefinition<T, O, ?, ?>[][] outputs; // To-Type, FD-List
38+
private FieldLinkDefinition<?, ?, T, O>[][][] inputs; // From-Type, FD-List
39+
private FieldLinkDefinition<T, O, ?, ?>[][][] outputs; // To-Type, FD-List
4040

4141

4242
@SuppressWarnings("unchecked")
@@ -60,19 +60,23 @@ public FlattenedType(T type) {
6060
}
6161

6262
public void flattenFieldLinks() {
63-
inputs = flattenInputs(type);
64-
outputs = flattenOutputs(type);
63+
inputs = flattenInputs();
64+
outputs = flattenOutputs();
6565
}
6666

6767
@SuppressWarnings("unchecked")
68-
private FieldLinkDefinition<?, ?, T, O>[][] flattenInputs(T type) {
68+
private FieldLinkDefinition<?, ?, T, O>[][][] flattenInputs() {
6969
FieldLinkDefinition<?, ?, T, O>[][] results = new FieldLinkDefinition[type.getTypeRegistry().getTypes().size()][];
7070
for (Type<?, ?> relType: type.getTypeRegistry().getTypes()) {
7171
results[relType.getId()] = flattenInputPerType(relType);
7272
}
7373
return results;
7474
}
7575

76+
public FieldLinkDefinition<?, ?, T, O>[][][] getInputs() {
77+
return inputs;
78+
}
79+
7680
@SuppressWarnings("unchecked")
7781
private FieldLinkDefinition<?, ?, T, O>[] flattenInputPerType(Type<?, ?> relType) {
7882
List<FieldLinkDefinition<?, ?, T, O>> results = new ArrayList<>();
@@ -91,19 +95,30 @@ public void flattenFieldLinks() {
9195
}
9296

9397
@SuppressWarnings("unchecked")
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-
}
98+
private FieldLinkDefinition<T, O, ?, ?>[][][] flattenOutputs() {
99+
FieldLinkDefinition<T, O, ?, ?>[][][] results = new FieldLinkDefinition[type.getRelationTypes().size()][][];
100+
101+
type.getRelationTypes().forEach(rel -> {
102+
FieldLinkDefinition<T, O, ?, ?>[][] resultsPerRelation = new FieldLinkDefinition[type.getTypeRegistry().getTypes().size()][];
103+
for (Type<?, ?> relType : type.getTypeRegistry().getTypes()) {
104+
resultsPerRelation[relType.getId()] = flattenOutputsPerType(relType);
105+
}
106+
107+
results[rel.getRelationId()] = resultsPerRelation;
108+
});
109+
99110
return results;
100111
}
101112

113+
public FieldLinkDefinition<T, O, ?, ?>[][][] getOutputs() {
114+
return outputs;
115+
}
116+
102117
@SuppressWarnings("unchecked")
103118
private FieldLinkDefinition<T, O, ?, ?>[] flattenOutputsPerType(Type<?, ?> relType) {
104119
List<FieldLinkDefinition<T, O, ?, ?>> results = new ArrayList<>();
105120
for (FieldDefinition<T, O> fd : fieldsReverse) {
106-
fd.getOutputs()
121+
fd.getAllOutputs()
107122
.filter(fl ->
108123
relType.isInstanceOf(fl.getOutput().getObjectType())
109124
)

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,19 @@
1818

1919
import network.aika.fields.defs.FieldDefinition;
2020
import network.aika.fields.field.Field;
21+
import network.aika.type.relations.RelationType;
2122
import org.slf4j.Logger;
2223
import org.slf4j.LoggerFactory;
2324

2425
import java.lang.reflect.InvocationTargetException;
2526
import java.util.*;
2627
import java.util.function.Function;
28+
import java.util.stream.Stream;
2729

2830
/**
2931
* @author Lukas Molzberger
3032
*/
31-
public class Type<T extends Type<T, O>, O extends Obj<T, O>> {
33+
public abstract class Type<T extends Type<T, O>, O extends Obj<T, O>> {
3234

3335
protected static final Logger LOG = LoggerFactory.getLogger(Type.class);
3436

@@ -67,6 +69,8 @@ public boolean isAbstract() {
6769
return !children.isEmpty();
6870
}
6971

72+
public abstract Set<RelationType<T, O, ?, ?>> getRelationTypes();
73+
7074
public void initFlattenedType() {
7175
flattenedType = new FlattenedType<>((T)this);
7276
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,13 @@ public interface RelationType<
3232
T extends Obj<TD, T>
3333
> {
3434

35+
int getRelationId();
36+
3537
void setReversed(RelationType<TD, T, FD, F> reversed);
3638

3739
RelationType<TD, T, FD, F> getReverse();
3840

39-
Stream<T> followAll(F fromObj, TD toType);
41+
Stream<T> followAll(F fromObj);
4042

4143
boolean testRelation(F fromObj, T toObj);
4244

0 commit comments

Comments
 (0)