Projet

Général

Profil

Télécharger (4,78 ko) Statistiques
| Branche: | Tag: | Révision:
package de.huberlin.informatik.pnk.netElementExtensions.llNet;

/*
Petri Net Kernel,
Copyright 1996-1999 Petri Net Kernel Team,
Petri Net Technology Group,
Department of Computer Science,
Humboldt-Universitaet zu Berlin, Germany
All Rights Reserved.

Java source Inscription.java is part of the
Petri Net Kernel Java reimplementation.
Inscription.java has been created by the
PNK JAVA code generator script.

Date of last code generator run: Jul 08, 1999

Do NOT modify the following lines!
They contain CVS management information.
$Log: TimedNetRule.java,v $
Revision 1.7 2001/10/11 16:59:19 oschmann
Neue Release

Revision 1.5 2001/06/12 07:04:09 oschmann
Neueste Variante...

Revision 1.4 2001/06/04 15:19:09 efischer
*** empty log message ***

Revision 1.3 2001/05/11 17:23:22 oschmann
Alpha Version... hoffentlich komplett und unzerstvrt.

Revision 1.2 2001/02/27 13:30:47 hohberg
New exceptions

Revision 1.1 2001/02/22 16:11:04 hohberg
New package structure

Revision 1.2 2001/02/15 12:46:27 hohberg
Local and parse using context

Revision 1.1 2001/02/08 11:36:58 hohberg
*** empty log message ***

*/

import de.huberlin.informatik.pnk.kernel.*;
import java.util.*;

/**
* The {@link de.huberlin.informatik.pnk.netElementExtensions.base.FiringRule firing rule}
* of a {@link Net Petri Net} is a standard {@link Extension extension}. <br>
* The TimedNetRule requires
* an {@link Arc arc} inscription of type {@link de.huberlin.informatik.pnk.netElementExtensions.base.Inscription}
* and a {@link IntValue} extension for {@link Transition transitions} with id "delay".
*/
public class TimedNetRule extends SimpleRule {
protected int clock = 0;
protected boolean newStep = false; // true: if step started, not finished
protected Vector delayedTrans = new Vector(5);

/**
* Constructor specifying the extended extendable (a net).
*/
public TimedNetRule(Extendable ext) {
super(ext);
}

private void finishTimeStep() {
newStep = false;
}

/**
* Fires the given <code>transition</code>.
*/
public void fire(Transition tr) {
finishTimeStep();
int delay = ((IntValue)tr.getExtension("delay")).getValue();
// System.out.println("Delaye time "+ delay);
// add delayed transition tr
delayedTrans.addElement(new DelayedTr(tr, delay + clock));
subMarkings(tr);
} // public void fire

protected void fireDelayedTransitions() {
Vector del = new Vector(3);
Enumeration e = delayedTrans.elements();
while (e.hasMoreElements()) {
DelayedTr dtr = (DelayedTr)e.nextElement();
if (dtr.time <= clock) {
addMarkings(dtr.tr);
del.addElement(dtr);
// System.out.println("Delayed transition "+ dtr.tr.getName() + " fired at time " + clock);
}
}
e = del.elements();
while (e.hasMoreElements()) {
DelayedTr delTr = (DelayedTr)e.nextElement();
delayedTrans.removeElement(delTr);
}
}

/**
* Gets the set of all {@link #isConcessioned concessioned} {@link
* Transition transitions}. <BR>
* If no transition is activated finish time step.
*/
public Vector getAllConcessioned() {
Vector v = super.getAllConcessioned();
while (v.isEmpty()) {
if (delayedTrans.isEmpty()) return null;
else {
startTimeStep();
fireDelayedTransitions();
v = super.getAllConcessioned();
}
}
return v;
}

/**
* Gets a {@link #isConcessioned concessioned}
* transition. <BR>
* If no transition is activated finish time step.
*/
public Transition getConcessioned() {
Transition tr = super.getConcessioned();
while (tr == null) {
if (delayedTrans.isEmpty()) return null;
else {
startTimeStep();
fireDelayedTransitions();
tr = super.getConcessioned();
}
}
return tr;
}

public int getTime() {return clock; }
/**
* Returns whether the given
* <code>transition</code> is concessioned. <BR>
* If for the first transition isConcessioned is called
* time step begins
* If one transition fires a time step is completed.
*/
public boolean isConcessioned(Transition tr) {
if (newStep == false) {
startTimeStep();
}
return super.isConcessioned(tr);
} // boolean isConcessioned

private void startTimeStep() {
//System.out.println("Timestep at "+clock);
clock++;
newStep = true;
fireDelayedTransitions();
}
} // TimedNetRule
(7-7/11)