public boolean predict(FeatureVector featureVector, SingleDecision decision) throws MaltChainedException {
//		if (cardinalities == null) {
//			if (getConfigFileEntry(".car") != null) {
//				cardinalities = loadCardinalities(getInstanceInputStreamReaderFromConfigFile(".car"));
//			} else {
//				cardinalities = getCardinalities(featureVector);
//			}
//		}
		if (cheatValues == null) {
			if (cheaterFileName == null || cheaterFileName.equals("")) {
				throw new CheaterException("The cheater file name is assigned. ");
			}
			try {
				BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(cheaterFileName)));
				String line = "";
				cheatValues = new ArrayList<Integer>();
				while ((line = reader.readLine()) != null) {
					cheatValues.add(Integer.parseInt(line));
				}
				cheaterPosition = 0;
				reader.close();
				cheaterWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(cheaterFileName + ".ins")));
			} catch (Exception e) {
				throw new CheaterException("Couldn't find or read from the cheater file '"+cheaterFileName+"'", e);
			}
		}
		
//		int offset = 1;
//		int i = 0;
		int decisionValue = 0;
		StringBuilder csb = new StringBuilder();
		if (cheaterPosition < cheatValues.size()) {
			decisionValue = cheatValues.get(cheaterPosition++);
			csb.append(decisionValue + " ");
		} else {
			throw new CheaterException("Not enough cheat values to complete all sentences. ");
		}
		

//		for (FeatureFunction feature : featureVector) {
//			final FeatureValue featureValue = feature.getFeatureValue();
//			if (!(excludeNullValues == true && featureValue.isNullValue())) {
//				if (featureValue instanceof SingleFeatureValue) {
//					if (((SingleFeatureValue)featureValue).getCode() < cardinalities[i]) {
//						csb.append((((SingleFeatureValue)featureValue).getCode() + offset) + ":" + "1 ");
//					}
//				} else if (featureValue instanceof MultipleFeatureValue) {
//					for (Integer value : ((MultipleFeatureValue)featureValue).getCodes()) {
//						if (value < cardinalities[i]) {
//							csb.append((value + offset) + ":" + "1 ");
//						}
//					}
//				}
//			}
//			offset += cardinalities[i];
//			i++;
//		}
		csb.setLength(csb.length()-1);
		csb.append('\n');
		try {
			cheaterWriter.write(csb.toString());
			cheaterWriter.flush();
		} catch (Exception e) {
			throw new CheaterException("", e);
		}
		try {
			decision.getKBestList().add(decisionValue);
		} catch (Exception e) {
			decision.getKBestList().add(-1);
		}
		return true;
	}