public double EV() {
    	double ev = 0;
    	double ev_fold;
    	double ev_check;
    	double ev_raise;
    	switch(nodeType) {
    	case SHOWDOWN :
    		double winPossibility = gameInfo.opponentModel.winPossibility(actionHistory, knownCards.evaluate());
    		ev = winPossibility * opponentBetAmount - ((1 - winPossibility) * playerBetAmount);
    		// System.out.println("Win%: " + winPossibility + " BetAmt: " + opponentBetAmount + " ev: " + ev);
    		break;
    		
    	case CHANCE :
    		ev = successor(null).EV();
    		break;
    		
    	case PLAYER :
    		ev_fold = -playerBetAmount;
    		ev_check = successor(Action.CHECK).EV();
    		if(reachedMaxRaises()) {
    			ev = Math.max(ev_fold, ev_check);
    		} else {
    			ev_raise = successor(Action.RAISE).EV();
    			ev = Math.max(Math.max(ev_fold, ev_check), ev_raise);
    		}
    		break;
    	
		case OPPONENT :
    		ev_fold = opponentBetAmount;
    		ev_check = successor(Action.CHECK).EV();
    		
    		if(reachedMaxRaises()) {
    			ev = ev_check;
    		} else {
    			ev_raise = successor(Action.RAISE).EV();
    			ev = 0.5 * ev_check + 0.5 * ev_raise;
    		}
    		break;
    	}

    	return ev;
    }