public Move evaluate(LosersBoard lcb)
	{
		String completeFEN = lcb.toFEN(false);
		Debug.Log(completeFEN);
		Move opening = m_book.get(completeFEN);
		if (opening != null)
			return opening; //found in book

		if (lcb.getState() != Definitions.State.NORMAL)
			return null;

		double highScore = staticEval(lcb);
		Debug.Log("Current Score: " + highScore);
		MovelistScore bms = new MovelistScore(null, 0);
		hashmoves = new ArrayList<Move>();

		m_starttime = System.nanoTime();
		stop = false;
		for (int d = 1; d <= 10; d++)
		{
			long starttime = System.nanoTime();
			branches = 0;
			LosersBoard temp = lcb.clone();
			bms = new MovelistScore(alphabetaMax(temp, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, 0, 2*d, true, false));
			long endtime = System.nanoTime();
			double duration = getDuration(starttime, endtime);
			highScore = bms.getScore();
			Debug.Log("Depth " + d + ": " + bms.getMovelist() + ", " + highScore + "; " + duration + " s, B-Factor: " + Math.pow(branches, 0.5/d));

			if (stop)
				break;

			hashmoves.clear();
			for (Move m : bms.getMovelist())
				hashmoves.add(m);

			if (highScore > MATE_SCORE)
				break; //if we found checkmate, don't look deeper
		}
		Debug.Log("");
		return hashmoves.get(0); //the best next move
	}