The interface to constraint solvers.
We are currently about reengineering the interface. The new one
follows uses the following design:
- The central class Solver is an abstract class
(i.e. interface) and a factory: it produces new Objects of all
needed Classes, like Query, Var, or
Expression.
- Most of the additional classes like the ones just mentioned,
are also abstract, some are concrete. There exist methods in the Solver-class (or similiar ones) to create these objects. As a basic rule, One should not, however,
directly create Objects of that kind. ...
- All class'es constructors should be "package private" so
that the user (of the package) must use the factories creators.
Implementierung neuer Constraints
Um neue (nicht-rücknehmbare) Constraints im System zur Verfügung
zu stellen sollte man folgendermassen vorgehen:
1.) Im Verzeichnis de.fhg.first.fd/constraints das Constraint als Klasse implementieren.
Dazu muß ein Konstruktor implementiert werden, der als ersten Parameter
eine Instanz des Interfaces Solver
bekommt. Danch folgen dann die eigentlichen Parameter, dies sind meist
Instanzen der Klasse Var oder Integers.
Dann muß das Constraint für alle erlaubten Solver implementiert
werden, d.h. der Konstruktor hat folgende Struktur:
public NeuesConstraint(Solver s, Var
v1, Var v2){
super(s);
if(s instanceof SICStusSolver){
... // Aufruf im SICStus
Solver (siehe 2.)
}
else{
if(s instanceof
ILOGSolver){
... // Aufruf
im ILOG Solver, siehe 3.)
}
else{
throw new Error("NeuseConstraint(Solver,Var,Var)
not implemented for "+ s.getClass());
}
}
2.) Der Aufruf des Constraints im SICStusSolver geschieht immer
durch die Methode de.fhg.first.fd.Constraint.call(functor
String, Term[] args). Es muss als Funktior die entsprechende
Repräsentation des SICStus-Constraints angegeben werden. Die Argumente
args sind Instanzen von de.fhg.first.fd.SICStusTerm
evtl. muß hier noch gecastet werden: Aus einer Var
-Instanz variable kann mann z.B.
durch (SICStusTerm)variable.getTerm()
einen SICStus-Term machen. Um Prolog-Listen zu erzeugen kann
man die Methode de.fhg.first.fd.SICStusTerm.array2List
verwenden.
3.) Der Aufruf des Constraints im ILOG Solver geschieht durch den
Aufruf einer Methode, die durch libilog.so
zu Verfügung gestellt werden muß. Man geht folgendermassen vor:
-
Methoden-Aufruf implementieren, wobei alle Argumente
vom Typ log sine muessen, also z.B. native_method(((ILOGSolver)s).asLong(),((ILOGTerm)v.getTerm()).asLong(),
(long)i);
-
Dann muss die native_method importiert
werden, hierzu muss folgender Prototyp in die Klasse eingefügt
werden: public native void native_method(long
solver,long var, long val);
-
Nun erzeugt man eine header Datei, vom Verzeichnis Java-Sics aus muss dazu
folgender Aufruf gemacht werden (der dann auch ins Makefile beim target
header aufgenommen werden sollte) :
javah -jni -o de.fhg.first.fd/constraint/fd_constraint_NeuesConstraint.h
de.fhg.first.fd.constraint.NeuesConstraint
-
Dadurch eintsteht die geannte .h-Datei, in der dann der Prototyp für
die C-Funktion abgelsen werden kann.
-
In der Datei de.fhg.first.fd/ilog.cpp muß
zunächst die header-Datei importiert werden: #include
"/home/konkorde/gr/Java-Sics/de.fhg.first.fd/constraint/fd_constraint_NeuseConstraint.h"
-
Die Methode, die im header steht muss für ilog implementiert werden,
dazu wird in Solver.model die ILOG-Implementierung
des beabsichtigten Constraints mit der Methode IloModel.add
aufgerufen.
-
Schliesslich muss aus der Datei ilog.cpp die aktualisierte Library mit
make lib erzeugt werden.
TODO
-
de.fhg.first.fd veröffentlichen:
- de.fhg.first.fd für SICStus und GNUPROLOG fertig machen.
- in csp-list veröffentlichen:
- de.fhg.first.fd ist Schnittstelle für gängige Constraint-(Logik-)Solver
- Ursprung: Vergleich existierender System
- bei Zuspruch Aktivitäten verstärken und Möglichkeiten einer
Diss prüfen.
- Ergebnis: Vergleich ex. Solver bzgl. verschiedener Probleme
und Kriterien, z.B. Soft-Constr., Constr.-Zurücknehmen,
Scheduling, ...
-
Integration des ILOG Solvers:
-
Die Dateien ILOGSolver.java, ILOGTerm.java und ILOGQuery.java muessen als
Implementierungen von Solver.java,Term.java und Query.java angelegt und
nach dem Vorbild der entsprechenden SICStus...java Dateien implementiert
werden.
-
Dann müssen in allen Constraints, also den Dateien in de.fhg.first.fd.constraint
und de.fhg.first.fd.assignment die Konstruktoren so verändert werden, daß
damit auch ILOGTerme im ILOGSolver verarbeitet werden können. Dazu
muß man meistens im else-Zweig der Methoden statt einen Error zu
erzeugen das Constraint in ILOG absetzen. Der else-Zweig kann aber trotzdem
erhalten bleiben: if(s instanceof SICStusSOlver){...}elseif(s instanceof
ILOGSolver){...}else{throw new Error}
-
Die Dateien Var.java und Domain.java müssen auch noch angepasst werden,
dort wurde ebenfalls die Konstruktion mit if(s instanceof SICStusSolver)...
gewählt.
WISH