next up previous contents
suivant: Package transportNetwork monter: Package twoTasksAnalysis précédent: BufferDomain.java   Table des matières

BufferValue.java


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&eacute;e &agrave; l'instance courante.
     */
    
    public int getValue()
    {
	return value;
    }

    /*---------------------------------------------*/

    /**
       Retourne l'<CODE>index</CODE>
       associ&eacute;e &agrave; l'instance courante.
     */
    
    public int getIndex()
    {
	return index;
    }

    /*---------------------------------------------*/

    /**
       D&eacute;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&eacute;jà une ar&ecirc;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&ecirc;te entre <CODE>this</CODE>
       et les ar&ecirc;tes d'indice inf&eacute;rieur ou 
       &eacute;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&ecirc;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&icirc;ne de 
       caract&egrave;res.
     */

    public String toString()
    {
	String result = "{ ind. : " + index + "; ";
	result += "val. : " + value + "; ";
	result += "wgt : " + weight + " }";
	return result;
    }


}



Alexandre 2009-05-14