package buffalo.twoTasksAnalysis;
import java.util.Vector;
import buffalo.dataStructures.*;
import buffalo.util.Heap;
/**
Représente à la fois le domaine de définition des
capacités pertinentes d'un buffer et un
sous-ensemble de sommets d'un graphe.
*/
public class BufferDomain
{
private BufferBipartiteGraph myGraph;
private Buffer myBuffer;
private Vector myBufferValues;
private Heap myHeap;
private int maximin;
/*---------------------------------------------*/
/**
S'instancie avec le <CODE>myBuffer</CODE>
dont l'instance courante est le domaine.
*/
public BufferDomain(BufferBipartiteGraph myGraph, Buffer myBuffer)
{
this.myBuffer = myBuffer;
this.myBufferValues = new Vector();
this.myGraph = myGraph;
maximin = 1;
myHeap = new Heap();
myGraph.addBufferDomain(this);
}
/*---------------------------------------------*/
/**
Retourne le <CODE>buffer</CODE>
dont l'instance courante est le domaine.
*/
public Buffer getBuffer()
{
return myBuffer;
}
/*---------------------------------------------*/
/**
Renvoie <CODE>k(myBuffer)</CODE>, autrement dit
le nombre de valeurs pertinentes pour
le <CODE>buffer</CODE>
dont l'instance courante est le domaine.
*/
public int getNbBufferValues()
{
return myBufferValues.size();
}
/*---------------------------------------------*/
/**
Renvoie la <CODE>index</CODE>-ième
valeur pertinente pouvant être
prise par le <CODE>buffer</CODE>
dont l'instance courante est le domaine.
*/
public BufferValue getBufferValue(int index)
{
return (BufferValue)myBufferValues.get(index);
}
/*---------------------------------------------*/
/**
Ajoute une valeur pour ce buffer.
*/
public void addBufferValue(int value)
{
myBufferValues.add
(new BufferValue(this, value));
}
/*---------------------------------------------*/
/**
Met à jour le maximin pour ce buffer avec
la valeur passée en paramètre.
*/
public void updateMaximin(int newValue)
{
if (maximin < newValue)
{
maximin = newValue;
}
}
/*---------------------------------------------*/
/**
Vide le tas et place les valeurs pertinentes
dans les sommets du graphe biparti.
*/
public void load()
{
Integer myValue = (Integer)myHeap.getRoot();
this.addBufferValue(maximin);
while((myValue != null)&&(myValue.intValue()<=maximin))
{
myHeap.removeRoot();
myValue = (Integer)myHeap.getRoot();
}
while(myValue != null)
{
this.addBufferValue(myValue.intValue());
myHeap.removeRoot();
myValue = (Integer)myHeap.getRoot();
}
defineWeights();
}
/*---------------------------------------------*/
/**
Retourne l'indice de ce domaine.
*/
public int getIndex()
{
return myBuffer.getIndex();
}
/*---------------------------------------------*/
/**
Retourne le tas servant
à trier les valeurs pour ce buffer.
*/
public Heap getHeap()
{
return myHeap;
}
/*---------------------------------------------*/
/**
Définit tous les poids.
*/
public void defineWeights()
{
int nbValues = myBufferValues.size();
for (int i = 0 ; i < nbValues; i++)
{
((BufferValue)myBufferValues.get(i)).defineWeight();
}
}
/*---------------------------------------------*/
/**
Retourne ce domaine au format chaîne de
caractères.
*/
public String toString()
{
String result = "Domain of Buffer ";
result += myBuffer.getIndex() + " = ";
int nbValues = myBufferValues.size();
result += ((BufferValue)myBufferValues.get(0)).toString();
for (int i = 1 ; i < nbValues; i++)
{
result += ", " + ((BufferValue)myBufferValues.get(i)).toString();
}
result += ";\n";
return result;
}
/*---------------------------------------------*/
/**
Retourne le graphe biparti dont ce domaine
fait partie.
*/
public BufferBipartiteGraph getBufferBipartiteGraph()
{
return myGraph;
}
/*---------------------------------------------*/
/**
Retourne le <CODE>BufferValue</CODE>
ayant pour <CODE>value</CODE>
le paramètre <CODE>valueForBuffer</CODE>,
retourne <CODE>null</CODE> si une telle
valeur n'existe pas.
*/
public BufferValue findBufferValue(int valueForBuffer)
{
int nbBufferValues = getNbBufferValues();
if ((nbBufferValues < 2)||(valueForBuffer<getBufferValue(1).getValue()))
{
return null;
}
else
{
return findBufferValue(valueForBuffer, 0, nbBufferValues-1);
}
}
/*---------------------------------------------*/
/**
Recherche par dichotomie le <CODE>BufferValue</CODE>
ayant pour <CODE>value</CODE>
le paramètre <CODE>valueForBuffer</CODE>.
*/
private BufferValue findBufferValue(int valueForBuffer,
int lowerBound,
int upperBound)
{
int myIndex = (int)(((float)lowerBound + (float)upperBound)/2.);
BufferValue myBufferValue = getBufferValue(myIndex);
int myValue = myBufferValue.getValue();
if (myValue == valueForBuffer)
{
return myBufferValue;
}
else
{
if (myValue<valueForBuffer)
{
return findBufferValue(valueForBuffer, myIndex+1, upperBound);
}
else
{
return findBufferValue(valueForBuffer, lowerBound, myIndex-1);
}
}
}
}