shared_ptr<ProbabilisticSvmClassifier> ProbabilisticSvmClassifier::load(const ptree& subtree)
{
	path classifierFile = subtree.get<path>("classifierFile");
	shared_ptr<ProbabilisticSvmClassifier> psvm;
	if (classifierFile.extension() == ".mat") {
		psvm = loadFromMatlab(classifierFile.string(), subtree.get<string>("thresholdsFile"));
	} else {
		shared_ptr<SvmClassifier> svm = SvmClassifier::loadFromText(classifierFile.string()); // Todo: Make a ProbabilisticSvmClassifier::loadFromText(...)
		if (subtree.get("logisticA", 0.0) == 0.0 || subtree.get("logisticB", 0.0) == 0.0) {
			std::cout << "Warning, one or both sigmoid parameters not set in config, using default sigmoid parameters." << std::endl; // TODO use logger
		}
		psvm = make_shared<ProbabilisticSvmClassifier>(svm);
	}

	// If the user sets the logistic parameters in the config, overwrite the current settings with it
	double logisticA = subtree.get("logisticA", 0.0); // TODO: This is not so good, better use the try/catch of get(...). Because: What if the user actually sets a value of 0.0 in the config...
	double logisticB = subtree.get("logisticB", 0.0);
	if (logisticA != 0.0 && logisticB != 0.0) {
		psvm->setLogisticParameters(logisticA, logisticB);
	}

	psvm->getSvm()->setThreshold(subtree.get("threshold", 0.0f));

	return psvm;
}
shared_ptr<RvmClassifier> RvmClassifier::load(const ptree& subtree)
{
	path classifierFile = subtree.get<path>("classifierFile");
	if (classifierFile.extension() == ".mat") {
		shared_ptr<RvmClassifier> rvm = loadFromMatlab(classifierFile.string(), subtree.get<string>("thresholdsFile"));
		// Do some stuff, e.g.
		//int numFiltersToUse = subtree.get<int>("");
		//Number filters to use
		//wvm->numUsedFilters=280;	// Todo make dynamic (from script)
		return rvm;
	} else {
		throw logic_error("ProbabilisticRvmClassifier: Only loading of .mat RVMs is supported. If you want to load a non-cascaded RVM, use an SvmClassifier.");
	}
}