public void setPointSet(MonteCarloPluginAdministration administration) {
    MersenneTwisterFast random = administration.RANDOM;
    _boardSize = administration.getBoardSize();

    assert (_emptyPoints.getSize() == 0);
    PointSet copy = PointSetFactory.createPointSet();
    copy.copyFrom(administration.getEmptyPoints());
    //		boolean isTestVersion = GlobalParameters.isTestVersion();
    ProbabilityMap map = administration.getProbabilityMap();
    byte colorToMove = administration.getColorToMove();
    for (int size = copy.getSize(); size > 0; size--) {
      int xy = copy.get(random.nextInt(size));
      copy.remove(xy);
      if (administration.isLegal(xy) && !administration.isVerboten(xy)) {
        _emptyPoints.add(xy);
        //				if (isTestVersion)
        //				{
        //					float weight = (float)map.getWeight(xy, colorToMove);
        //					float factor = (float)Math.log(weight);
        //					if (weight<1.0)
        //						weight = 0.0f;
        //					else
        //						weight -= 1.0f;
        //					if (factor<1)
        //						factor = 1.0f;
        //					_virtualPlayouts[xy] = weight/factor;
        //					_virtualWins[xy] = weight;
        //				}
        //				else
        {
          _virtualPlayouts[xy] = 0.0f;
          _virtualWins[xy] = 0.0f;
        }
      }
    }
    copy.recycle();
    if (administration.isGameAlmostFinished()) {
      _virtualPlayouts[GoConstant.PASS] = 0;
      _virtualWins[GoConstant.PASS] = 0;
      _emptyPoints.add(GoConstant.PASS);
    }

    for (MoveGenerator generator : administration.getExplorationMoveGeneratorList()) {
      int xy = generator.generate();
      if (xy != GoConstant.UNDEFINED_COORDINATE)
        increaseVirtualPlayouts(xy, generator.getUrgency(), generator.getUrgency());
    }
    assert (_emptyPoints.freeze());
  }
  public int getBestVirtualMove() {
    _logNrPlayouts = Math.log(_totalPlayouts + 1.0f);
    _beta = getBeta();

    int bestMove = GoConstant.PASS;
    double bestResult = computeResult(_bestMove);
    if (_bestMove != GoConstant.PASS && bestResult > _bestResult) {
      assert (bestResult > 0.0);
      usedLastBest = true;
      // What was previously the best move, most likely still is as it only got better.
      _bestResult = bestResult;
      return _bestMove;
    }
    usedLastBest = false;

    for (int i = _emptyPoints.getSize(); --i >= 0; ) {
      int next = _emptyPoints.get(i);
      double result = computeResult(next);
      boolean better;
      if (result > bestResult) better = true;
      else if (result == bestResult)
        better =
            (bestMove == GoConstant.PASS || _virtualPlayouts[next] > _virtualPlayouts[bestMove]);
      else better = false;

      if (better) {
        bestMove = next;
        bestResult = result;
      }
    }
    _bestMove = bestMove;
    _bestResult = bestResult;
    assert (bestResult >= 0.0);
    return bestMove;
  }
 public int getBestMove() {
   int bestMove = GoConstant.PASS;
   for (int i = _emptyPoints.getSize(); --i >= 0; ) {
     int next = _emptyPoints.get(i);
     if (isBetterResultThan(next, bestMove)) bestMove = next;
   }
   return bestMove;
 }