package buffalo.twoTasksAnalysis; import buffalo.transportNetwork.Vertex; import buffalo.transportNetwork.Arc; import buffalo.dataStructures.*; import java.util.Vector; /** Représente à la fois une valeur pertinente pour la capacité d'un buffer et un sommet dans le graphe biparti/réseau de transport. */ public class BufferValue extends Vertex { int index; BufferDomain myDomain; int value; int weight; int[] arcRegister; /*---------------------------------------------*/ /** S'instancie avec le <CODE>myBuffer</CODE> dont l'instance courante est le domaine. */ BufferValue(BufferDomain myDomain, int value) { super(null, 0); this.myDomain = myDomain; this. value = value; index = myDomain.getNbBufferValues(); Task writingTask = getBufferDomain().getBufferBipartiteGraph(). getFirstTask(); Task myTask = getBuffer().getWritingTask(); if ( writingTask == myTask) { int nbBuffers = Buffer.getNbBuffers(); arcRegister = new int[nbBuffers]; for(int i=0 ; i<nbBuffers ; i++) { arcRegister[i]=0; } } getBufferDomain().getBufferBipartiteGraph().addVertex(this); } /*---------------------------------------------*/ /** Retourne le <CODE>buffer</CODE> dont l'instance courante est le domaine. */ public Buffer getBuffer() { return myDomain.getBuffer(); } /*---------------------------------------------*/ /** Retourne le <CODE>BufferDomain</CODE> de cette value. */ public BufferDomain getBufferDomain() { return myDomain; } /*---------------------------------------------*/ /** Retourne le <CODE>poids</CODE> de ce sommet dans le graphe biparti. */ public int getWeight() { return weight; } /*---------------------------------------------*/ /** Retourne la <CODE>Value</CODE> associée à l'instance courante. */ public int getValue() { return value; } /*---------------------------------------------*/ /** Retourne l'<CODE>index</CODE> associée à l'instance courante. */ public int getIndex() { return index; } /*---------------------------------------------*/ /** Déinit le <CODE>poids</CODE> de ce sommet dans le graphe biparti. */ public void defineWeight() { int gap; if(this.index==0) { gap = this.value; } else { gap = this.value - this.myDomain.getBufferValue(index-1).getValue(); } weight = gap * this.getBuffer().getWeight(); } /*---------------------------------------------*/ /** Retourne <CODE>true</CODE> s'il existe déjà une arête entre <CODE>this</CODE> et <CODE>otherVertex</CODE>. */ public boolean forbidenEdge(BufferValue otherVertex) { int newValue = otherVertex.getValue(); int otherIndex = otherVertex.getBufferDomain().getIndex(); int actualValueForThisVertex = arcRegister[otherIndex]; return (newValue<=actualValueForThisVertex); } /*---------------------------------------------*/ /** Place une arête entre <CODE>this</CODE> et les arêtes d'indice inférieur ou égal à <CODE>otherVertex</CODE>. */ public void addEdges(BufferValue otherVertex) { BufferValue copyOfOtherVertex = otherVertex; while ((!this.forbidenEdge(otherVertex))&& (otherVertex.getIndex()>=1)) { this.addEdge(otherVertex); otherVertex = otherVertex.getBufferDomain(). getBufferValue(otherVertex.getIndex()-1); } int actualValue = copyOfOtherVertex.getValue(); int otherIndex = copyOfOtherVertex.getBufferDomain().getIndex(); if(arcRegister[otherIndex] < actualValue) { arcRegister[otherIndex] = actualValue; } } /*---------------------------------------------*/ /** Place une arête entre <CODE>this</CODE> et <CODE>otherVertex</CODE>. */ private void addEdge(BufferValue otherVertex) { new Arc(this, otherVertex, 0, -1); } /*---------------------------------------------*/ /** Retourne cette valeur au format chaîne de caractères. */ public String toString() { String result = "{ ind. : " + index + "; "; result += "val. : " + value + "; "; result += "wgt : " + weight + " }"; return result; } }