double MultilayerPerceptron::getCE(const vector<vector<double> > &inputs, const vector<vector<double> > &targets)
{
	size_t sInputs = inputs.size();
	int os = getOutputSize();
	int errCount = 0;
	int n = 0;
	vector<int> yObtained;
	for(size_t p = 0; p < sInputs; p++){
		yObtained = getClasifierOutput(inputs[p],
									   (ot == UnipolarClasifier ? 0.5 : 0),
									   ot);
		for(int element = 0; element < os; element++){
			switch(ot){
				case UnipolarClasifier:
					if(toUnipolar(targets[p], 0.5)[element] != yObtained[element]){
						errCount++;
					}
					break;
				case BipolarClasifier:
					if(toBipolar(targets[p], 0)[element] != yObtained[element]){
						errCount++;
					}
					break;
			}
			n++;
		}
	}

	return errCount/n;
}
String MouseOverKnob::getTextFromValue(double val)
{
    // calculate bipolar value, only makes sense if minimum is 0 since maximum is used for scaling
    if (displayBipolarValue)
    {
        float coeff = toBipolar(static_cast<float>(this->getMinimum()), static_cast<float>(this->getMaximum()), static_cast<float>(val));
        val = this->getMaximum() * coeff;
    }

    int decimal = getNumDecimalPlacesToDisplay();
    if (decimal > 0)
    {
        return String(val, decimal) + getTextValueSuffix();
    }
    return String(roundToInt(val)) + getTextValueSuffix();
}