2011-09-26 26 views
5

Tengo una pequeña función, que se supone que hace una predicción basada en un algoritmo de aprendizaje automático. La función no funcionaba, así que puse una declaración de impresión para verificar el valor y, de repente, comenzó a funcionar. Cuando comento la línea de impresión, deja de funcionar de nuevo. ¿Hay algo que me falta acerca de por qué esto sucedería?¿Por qué la impresión de una variable cambia su valor?

int makePrediction(const InstanceT & instance, bool biased){ 
    double dotProduct = (biased ? instance * _weights + _bias : instance * _weights); 
    std::cout << "dotProduct = " << dotProduct << std::endl; 
    return (dotProduct > 0 ? 1 : -1); 
} 

por alguna razón un resultado diferente a continuación,

int makePrediction(const InstanceT & instance, bool biased){ 
    double dotProduct = (biased ? instance * _weights + _bias : instance * _weights); 
    return (dotProduct > 0 ? 1 : -1); 
} 

y para demostrar que los resultados son diferentes, dadas las mismas entradas, llamo a esta función con:

std::vector<InstanceT> _instances = populate_data() //this works for both versions 
for (int i = 0; i < _instances.size(); i++){ 
    std::cout << "prediction: " << makePrediction(_instances[i], true) << std::endl; 
} 

Cualquier pensamiento ?

+0

Buena pregunta para codereview.stackexchange.com –

+2

¿Qué quiere decir con "was not working"? ¿Cuál fue el comportamiento esperado y observado? Por favor, especifique la entrada y salida exactas. –

+0

std :: endl generalmente se vacía también. ¿Su código de llamada produce salida que depende del estado del buffer de cout? Parece poco probable. Cuán diferente en realidad es la salida; ¿Cuál es el valor correcto de 'makePrediction' y qué da cuando está equivocado? –

Respuesta

4

Esto sucede a menudo debido a dos razones:

  1. problemas de concurrencia. Si su programa es multiproceso, enmascara las condiciones de carrera con salida de depuración. Pruebe un depurador MT como Helgrind.
  2. Pilas rotas. Intente ejecutar valgrind en su programa y vea si sale limpio.

Estos son, por supuesto, consejos bastante genéricos, pero tendrá que especificar mejor su pregunta para obtener un mejor consejo :-).

+0

el código no es multiproceso, por lo que no debe ser un problema de concurrencia.Y para responder a algunos de los otros comentaristas, acerca de publicar los resultados: esencialmente, dadas las mismas entradas (ambos parámetros y también los miembros de datos en la clase son iguales), el código produce tanto +1 como -1 con la instrucción print en, pero solo produce -1 cuando la instrucción de impresión está fuera. – Max

+0

@Max: Creo que te perdiste el punto principal de los comentaristas. Da un ejemplo concreto donde "falla". Un código que puedo compilar y reproducirá el problema. Tienes algún error feo, pero si no te esfuerzas, nadie puede ayudarte. –

+0

El problema es que no sé cómo dar un buen ejemplo, porque esto es parte de una estructura de código más grande, que se basa en un conjunto de datos de un archivo separado. No sé cómo producir un buen ejemplo sin incluir todo el código. – Max

Cuestiones relacionadas