
// Added June 17,1999 by RL
/**
  Class containing Principal Variation for a particular search.
 */
public class PV {

  private int[][] path = new int[Board.MAX_PLY+1][Board.MAX_PLY+1];
  private boolean[][] end = new boolean[Board.MAX_PLY+1][Board.MAX_PLY+1];

  public PV()
  {
     end[0][0] = true;
  }


  public void add(Move m, int ply)
  {
     int i=ply;
     
     while (i < Board.MAX_PLY && 
            !end[ply][i] && path[ply][i] != 0) {
        path[ply-1][i] = path[ply][i];
        end[ply-1][i] = false;
        ++i;
     }
     end[ply-1][i] = true;
     end[ply-1][ply-1] = false;
     path[ply-1][ply-1] = m.pvCode();
  }

  public void append(Move m, int ply)
  {
     end[ply-1][ply]  = true;
     end[ply-1][ply-1] = false;
     path[ply-1][ply-1] = m.pvCode();
  }

  public void set(int ply)
  {
     path[ply-1][ply-1] = 0;
     end[ply-1][ply-1] = true;
  }


  public boolean check(Move m, int ply)
  {
     return(path[0][ply-1] == m.pvCode());
  }

  public String display()
  {
     String s="";
     Move m;
     for (int i=0; !end[0][i] ; ++i) {
        m = new Move(path[0][i]);
        if (i > 0 && i%7 == 0 ) s = s + "\n          ";
        s = s + " " + m.string();
     }
     return s;
  }

  public int Hint()
  {
     return path[0][1];
  }

  public void Copy(PV p)
  {
     int i;
     for (i=0; !p.end[0][i] ; ++i) {
         path[0][i] = p.path[0][i];
         end[0][i] = false;
     }
     end[0][i] = true;
  }

  public void Next()
  {
     int i,j=0;
     for (i=0; !end[0][i] && i <= 1 ; ++i) ;
     if (i > 1)
      for (j=0; !end[0][i] ; ++i) {
         path[0][j] = path[0][i];
         end[0][j] = false;
         ++j;
      }
     end[0][j] = true;
  }
}
