public int alphabeta_min(int currentDepth, int alpha, int beta, Tuple lastMove) {
	    if (currentDepth >= depth || board.legalMoves.isEmpty()) {
	    	if (currentDepth==0 && board.winStatus != 2) {
	    		// System.out.println("Board state with immediate win:\n" + board);
	    		// System.out.println("Returning highest possible value for immediate win at " + lastMove);
	    		return Integer.MAX_VALUE;
	    	}
	    	// System.out.println("Board state before eval return:\n" + board);
	    	int eval = -1*board.eval(weights);
	    	evals++;
	    	// System.out.println("Returning eval: " + eval + " at min.");
	    	// if (eval < -1000000 || eval > 1000000)
	    	// 	System.out.println("WIN DETECTED FOR MAX!");
	    	return eval;
	    }
	    int b = infHolder.MAX + 1;
	    LinkedList<Tuple> list = (LinkedList<Tuple>) board.legalMoves.clone();
	    for (Tuple chosenMove : list) {
	        board.move(chosenMove);
	    	// System.out.println("Now searching move " + chosenMove + ", a=" + alpha + ", b=" + beta + " min");
	        int s = alphabeta_max(currentDepth+1, alpha, beta, chosenMove.clone());
	        b = min(b, s);
	        if (b < alpha) {
	        	// System.out.println("Move " + chosenMove + " worse than alpha of " + alpha + ", (" + b + ")");
		        // MoveRecord oldMove = board.takeBack(1);
		        // System.out.println("Took back " + oldMove.move + " at depth " + currentDepth);
		        	board.takeBack(1);
	        	return b;
	        }
	        if (b < beta) {
	        	// System.out.println("Move " + chosenMove + " sets beta to " + b + " (beta was " + beta + ")");
	        	beta = b;
	        }
	        // MoveRecord oldMove = board.takeBack(1);
	        // System.out.println("Took back " + oldMove.move + " at depth " + currentDepth);
	        	board.takeBack(1);
	    }
	    return b;
	}