private void reweight(double threshold, List<Card> board, int numPlayers, double potOdds) {
        double variance;
        
        variance = VARIANCE_FACTOR * (1 - threshold);
        
        List<EnumCandidate> holeCards = EnumCandidate.buildCandidates(null, board);
        
        _wt.initReweight();
        
        for (EnumCandidate holeCandidate : holeCards) {
            _eval.compute(holeCandidate.cards(), board, _compositeRange, numPlayers);
            
            if (board.size() > 0 && board.size() < 5 && _eval.posPotential() >= potOdds) {
                continue;
            }
            
            double reweight;
            
            if (threshold < variance) {
                double r = 1.0 - (2 * threshold / (threshold + variance));
                reweight = r + (_eval.effectiveHandStrength() / (threshold + variance));
            }
            else {
                reweight = (_eval.effectiveHandStrength() - threshold + variance) / (2 * variance);                
            }
            
            if (reweight < LOW_WEIGHT) {
                reweight = LOW_WEIGHT;
            }
            else if (reweight > HIGH_WEIGHT) {
                reweight = HIGH_WEIGHT;
            }
            
            double weight = _wt.getWeight(holeCandidate.cards().get(0), holeCandidate.cards().get(1));
            weight *= reweight;
            if (weight < LOW_WEIGHT) {
                weight = LOW_WEIGHT;
            }
            
            if (holeCandidate.generic()) {
                _wt.setWeight(holeCandidate.cards().get(0).rank(), holeCandidate.cards().get(1).rank(), weight);
            }
            else {
                _wt.suspendSetWeight(holeCandidate.cards().get(0), holeCandidate.cards().get(1), weight);
            }
        }
        _wt.consolidate();
    }