import java.util.ArrayList;
interface Addable
{
}
/**
* Für alle Eingabe-Neuronen und verdeckten Neuronen.
*/
interface Updateable extends Addable
{
void setSuccessors(ArrayList<Learnable> successors);
ArrayList<Learnable> getSuccessors();
}
/**
* Für alle verdeckten Neuronen und Ausgabe-Neuronen.
*/
interface Learnable extends Addable
{
void setPredecessors(ArrayList<Updateable> predecessors);
ArrayList<Updateable> getPredecessors();
}
/**
* Mixin-Klasse für alle Eingabe-Neuronen und verdeckte Neuronen.
*/
class UpdateMixin implements Updateable
{
ArrayList<Learnable> successors = new ArrayList<Learnable>();
// Methoden von Interface Updateable implementieren:
public void setSuccessors(ArrayList<Learnable> successors)
{
this.successors = successors;
}
public ArrayList<Learnable> getSuccessors()
{
return successors;
}
}
/**
* Mixin-Klasse für alle verdeckten Neuronen und Ausgabe-Neuronen.
*/
class LearnMixin implements Learnable
{
ArrayList<Updateable> predecessors = new ArrayList<Updateable>();
// Methoden von Interface Learnable implementieren:
public void setPredecessors(ArrayList<Updateable> predecessors)
{
this.predecessors = predecessors;
}
public ArrayList<Updateable> getPredecessors()
{
return predecessors;
}
}
/**
* Abstrakte Klasse für alle Neuronen
*/
abstract class Neuron implements Addable
{
protected int id;
int getId()
{
return id;
}
}
/**
* Eingabe-Neuron
*/
class InputNeuron extends Neuron implements Updateable
{
private final UpdateMixin updateMixin = new UpdateMixin();
InputNeuron(int id)
{
this.id = id;
}
// Delegationen:
public void setSuccessors(ArrayList<Learnable> successors)
{
updateMixin.setSuccessors(successors);
}
public ArrayList<Learnable> getSuccessors()
{
return updateMixin.getSuccessors();
}
}
/**
* Verdecktes Neuron
*/
class HiddenNeuron extends Neuron implements Updateable, Learnable
{
private final UpdateMixin updateMixin = new UpdateMixin();
private final LearnMixin learnMixin = new LearnMixin();
HiddenNeuron(int id)
{
this.id = id;
}
// Delegationen:
public void setSuccessors(ArrayList<Learnable> successors)
{
updateMixin.setSuccessors(successors);
}
public ArrayList<Learnable> getSuccessors()
{
return updateMixin.getSuccessors();
}
public void setPredecessors(ArrayList<Updateable> predecessors)
{
learnMixin.setPredecessors(predecessors);
}
public ArrayList<Updateable> getPredecessors()
{
return learnMixin.getPredecessors();
}
}
/**
* Ausgabe-Neuron
*/
class OutputNeuron extends Neuron implements Learnable
{
private final LearnMixin learnMixin = new LearnMixin();;
OutputNeuron(int id)
{
this.id = id;
}
// Delegationen:
public void setPredecessors(ArrayList<Updateable> predecessors)
{
learnMixin.setPredecessors(predecessors);
}
public ArrayList<Updateable> getPredecessors()
{
return learnMixin.getPredecessors();
}
}
class Main
{
private static void dumpSuccessors(ArrayList<Learnable> successors)
{
for(int i = 0; i < successors.size(); ++i)
{
System.out.println(((Neuron)(successors.get(i))).getId());
}
}
private static void dumpPredecessors(ArrayList<Updateable> predecessors)
{
for(int i = 0; i < predecessors.size(); ++i)
{
System.out.println(((Neuron)(predecessors.get(i))).getId());
}
}
public static void main(String[] args)
{
// Architektur (gerichteter Graph, Datenfluss von oben nach unten):
// 0 1 Eingabeschicht
// \\ //
// \ \ / /
// \ \ / /
// \ 2 / verdeckte Schicht
// \ | /
// \|/
// 3 Ausgabeschicht
Addable[] neurons =
{
new InputNeuron(0),
new InputNeuron(1),
new HiddenNeuron(2),
new OutputNeuron(3)
};
// 0 -> 2, 3:
ArrayList<Learnable> s0 = new ArrayList<Learnable>();
s0.add((Learnable)neurons[2]);
s0.add((Learnable)neurons[3]);
((Updateable)neurons[0]).setSuccessors(s0);
// 1 -> 2, 3:
((Updateable)neurons[1]).setSuccessors(s0);
// 0, 1 -> 2
ArrayList<Updateable> p0 = new ArrayList<Updateable>();
p0.add((Updateable)neurons[0]);
p0.add((Updateable)neurons[1]);
((Learnable)neurons[2]).setPredecessors(p0);
// 2 -> 3:
ArrayList<Learnable> s1 = new ArrayList<Learnable>();
s1.add((Learnable)neurons[2]);
((Updateable)neurons[2]).setSuccessors(s1);
// 0, 1, 2 -> 3
ArrayList<Updateable> p1 = new ArrayList<Updateable>();
p1.add((Updateable)neurons[0]);
p1.add((Updateable)neurons[1]);
p1.add((Updateable)neurons[2]);
((Learnable)neurons[3]).setPredecessors(p1);
// Nachfolger von 0:
System.out.println("Nachfolger von 0:");
dumpSuccessors(((Updateable)neurons[0]).getSuccessors()); // 2, 3
// Nachfolger von 1:
System.out.println("Nachfolger von 1:");
dumpSuccessors(((Updateable)neurons[1]).getSuccessors()); // 2, 3
// Vorgänger von 2:
System.out.println("Vorgänger von 2:");
dumpPredecessors(((Learnable)neurons[2]).getPredecessors()); // 0, 1
// Nachfolger von 2:
System.out.println("Nachfolger von 2:");
dumpSuccessors(((Updateable)neurons[2]).getSuccessors()); // 3
// Vorgänger von 3:
System.out.println("Vorgänger von 3:");
dumpPredecessors(((Learnable)neurons[3]).getPredecessors()); // 0, 1, 2
}
}