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;
}
}