Hallo Leute.
Das wird jetzt etwas schwer zu erklären sein, aber ich hoffe ihr versteht was ich will. Ich möchte ein Programm schreiben, in dem es möglich sein soll dynamisch (durch den Benutzer) einen Graphen aufzubauen, bei dem jeder Knoten einem Algorithmus entspricht und jede Kante einer Daten-Transformation zwischen Ausgabedaten von Algorithmus1 und Eingabedaten von Algorithmus2. Ein Beispiel-Graph könnte so aussehen:
In dem Fall würde ein Bild eingegeben, von der Bildverarbeitung vorverarbeitet und dann an ein Neuronale Netz übergeben werden. Als Zwischenschritt müsste das Bild, welches aus der Bildverarbeitung rauskommt in einen Vektor umgewandelt werden, der als Eingabe des Neuronalen Netzes dient.
Mein Problem ist, dass ich solch einen Prozess verallgemeinern will/muss. D.h. natürlich zum einen, dass ich beliebige solcher Graphen erzeugen will und vor allem die Graph-Klasse zum Ausführen solcher (sequentieller) Graphen kompilierbar sein muss.
Das heißt zunächst einmal dass jedes Graph-Objekt (ob Algorithmus oder Daten-Transformation) eine allgemeine Schnittstelle implementiert, z.B. (Pseudocode):
So wäre es allgemein möglich, eine Liste von IGraphComponent-Objekten abzuarbeiten und den Output eines Objekts als Input des nächsten zu benutzen. Das Problem dabei wird offensichtlich: es werden nur Object's hin- und hergeschuppst, das sagt aber noch gar nichts darüber aus, ob es sich z.B. bei dem an das Neuronale Netz übergebene Argument (Object) nun um einen Vektor oder ein Bild oder sonstwas handelt.
Meine Frage ist nun, wie ich das bereinigen kann? Ich könnte sicher im Neuronalen Netz in der Input()-Methode eine Abfrage starten, z.B. so in der Art "if(!(o is Vector)) throw Exception", aber die Exception würde erst dann geworfen werden, wenn der Graph traversiert wird. Ich möchte aber, dass eine Prüfung schon beim Zusammenbauen des Graphen stattfindet, sodass unmögliche Fälle gleich ausgeschlossen werden. Wie könnte ich das realisieren?
Ich dachte schon an eine Art "AcceptedInputs()"-Methode, die ein String-Array der Sorten zurückgibt, die als Input erlaubt sind. Analog dazu eine "ProvidedOutputs()"-Methode. Allerdings halte ich diesen "Umweg" über String's für nicht sehr elegant und auch für fehleranfällig, wenn z.B. mal eine Klasse umbenannt wird etc. ...
Danke für eure Hilfe.
Viele Grüße,
Matthias
Das wird jetzt etwas schwer zu erklären sein, aber ich hoffe ihr versteht was ich will. Ich möchte ein Programm schreiben, in dem es möglich sein soll dynamisch (durch den Benutzer) einen Graphen aufzubauen, bei dem jeder Knoten einem Algorithmus entspricht und jede Kante einer Daten-Transformation zwischen Ausgabedaten von Algorithmus1 und Eingabedaten von Algorithmus2. Ein Beispiel-Graph könnte so aussehen:
Code:
---> ImgProc ---> NeuralNet --->
Mein Problem ist, dass ich solch einen Prozess verallgemeinern will/muss. D.h. natürlich zum einen, dass ich beliebige solcher Graphen erzeugen will und vor allem die Graph-Klasse zum Ausführen solcher (sequentieller) Graphen kompilierbar sein muss.
Das heißt zunächst einmal dass jedes Graph-Objekt (ob Algorithmus oder Daten-Transformation) eine allgemeine Schnittstelle implementiert, z.B. (Pseudocode):
Code:
interface IGraphComponent{
public void Input(Object o);
public Object Output();
}
So wäre es allgemein möglich, eine Liste von IGraphComponent-Objekten abzuarbeiten und den Output eines Objekts als Input des nächsten zu benutzen. Das Problem dabei wird offensichtlich: es werden nur Object's hin- und hergeschuppst, das sagt aber noch gar nichts darüber aus, ob es sich z.B. bei dem an das Neuronale Netz übergebene Argument (Object) nun um einen Vektor oder ein Bild oder sonstwas handelt.
Meine Frage ist nun, wie ich das bereinigen kann? Ich könnte sicher im Neuronalen Netz in der Input()-Methode eine Abfrage starten, z.B. so in der Art "if(!(o is Vector)) throw Exception", aber die Exception würde erst dann geworfen werden, wenn der Graph traversiert wird. Ich möchte aber, dass eine Prüfung schon beim Zusammenbauen des Graphen stattfindet, sodass unmögliche Fälle gleich ausgeschlossen werden. Wie könnte ich das realisieren?
Ich dachte schon an eine Art "AcceptedInputs()"-Methode, die ein String-Array der Sorten zurückgibt, die als Input erlaubt sind. Analog dazu eine "ProvidedOutputs()"-Methode. Allerdings halte ich diesen "Umweg" über String's für nicht sehr elegant und auch für fehleranfällig, wenn z.B. mal eine Klasse umbenannt wird etc. ...
Danke für eure Hilfe.
Viele Grüße,
Matthias