void CuriosityLoop::makePrediction(const matrix::Matrix& s, const matrix::Matrix& m){ matrix::Matrix sm = s.above(m); matrix::Matrix f; f.set(1,1); f.val(0,0) = 1; sm = sm.above(f); matrix::Matrix pwMod = predictorWeights; for(int i = 0; i < predictorWeights.getM(); i++){//to for(int j = 0; j < predictorWeights.getN(); j++){//from if(pInput.val(j,0) == 1 && pOutput.val(i,0) == 1) pwMod.val(i,j) = predictorWeights.val(i,j); //Transposes the weight matrix. else pwMod.val(i,j) = 0; // pwMod.val(i,j) = predictorWeights.val(i,j)*predictorMask.val(i,j); } } matrix::Matrix a = pwMod*sm; //Make prediction here. this->prediction = a; //The prediction is stored here. //************************UNRESTRICTED PREDICTOR CODE **************************** //ALSO MAKE PREDICTIONS FOR THE UNRESTRICTED PREDICTOR matrix::Matrix uPwMod = uPredictorWeights; for(int i = 0; i < uPredictorWeights.getM(); i++){//to for(int j = 0; j < uPredictorWeights.getN(); j++){//from if(uPInput.val(j,0) == 1 && uPOutput.val(i,0) == 1) uPwMod.val(i,j) = uPredictorWeights.val(i,j); else uPwMod.val(i,j) = 0; // pwMod.val(i,j) = predictorWeights.val(i,j)*predictorMask.val(i,j); } } matrix::Matrix uA = uPwMod*sm; //Make prediction here. this->uPrediction = uA; //The prediction is stored here. //************************UNRESTRICTED PREDICTOR CODE **************************** // cout << predictorWeights.getM() << " " << predictorWeights.getN() << "= pw \n"; // cout << sm.getM() << " " << sm.getN() << " = sm\n"; // cout << pwMod.getM() << " " << pwMod.getN() << " = a\n"; // for(int i = 0; i < prediction.getM(); i++){ // for(int j = 0; j < pwMod.getN(); j++){ // cout << prediction.val(i,0) << " "; // } // cout << " = precd\n"; // } };
double CuriosityLoop::updatePrediction(const matrix::Matrix& smHist, const matrix::Matrix& s, const matrix::Matrix& m, int phase){ matrix::Matrix sm = s.above(m); matrix::Matrix f; f.set(1,1); f.val(0,0) = 1; sm = sm.above(f); //1. Go through the predictions of this predictor determining the prediction errors at each dimension. matrix::Matrix error; error.set(smHist.getM(), 1); prediction_error = 0; for(int i = 0; i < prediction.getM(); i++){ if(pOutput.val(i,0) == 1){ error.val(i,0) = prediction.val(i,0) - sm.val(i,0); prediction_error = prediction_error + pow(error.val(i,0),2); // cout << error << "predictionError\n"; } else{ // cout << "This dimension is not predicted, and does not count towards the error\n"; error.val(i,0) = 0; //prediction_error = prediction_error + error.val(i,0); } } parent_error.val(phase,0) = prediction_error; //2. Change the weights by the delta rule. for(int i = 0; i < prediction.getM(); i++){//to for(int j = 0; j < predictorWeights.getN(); j++){//from // predictorWeights.val(i,j) = predictorWeights.val(i,j) - 0.00001*error.val(i,0)*smHist.val(j,0); predictorWeights.val(i,j) = predictorWeights.val(i,j) - 0.0001*error.val(i,0)*smHist.val(j,0); if(predictorWeights.val(i,j) > 10) predictorWeights.val(i,j) = 10; else if(predictorWeights.val(i,j) < -10) predictorWeights.val(i,j) = -10; } } prediction_error_time_average = 0.9999*prediction_error_time_average + (1-0.9999)*prediction_error; //Update the fitness of this predictor based on the instantaneous reduction / increase in prediction error. this->fitness = 0.1 + 100*(prediction_error_time_average - old_prediction_error_time_average); old_prediction_error_time_average = prediction_error_time_average; //cout << fitness << " "; //Improve the method of determining this gradient later! //UPDATE THE UNRESTRICTED PREDICTOR NOW AS WELL, ALWAYS... //1. Go through the predictions of this UNRESTRICTED predictor determining the prediction errors at each dimension. matrix::Matrix uError; uError.set(smHist.getM(), 1); uPrediction_error = 0; for(int i = 0; i < uPrediction.getM(); i++){ if(uPOutput.val(i,0) == 1){ uError.val(i,0) = uPrediction.val(i,0) - sm.val(i,0); uPrediction_error = uPrediction_error + pow(uError.val(i,0),2); // cout << error << "predictionError\n"; } else{ // cout << "This dimension is not predicted, and does not count towards the error\n"; uError.val(i,0) = 0; //prediction_error = prediction_error + error.val(i,0); } } //cout << "phase = " << phase << "\n"; offspring_error.val(phase,0) = uPrediction_error; //2. Change the weights by the delta rule. for(int i = 0; i < uPrediction.getM(); i++){ for(int j = 0; j < uPredictorWeights.getN(); j++){ uPredictorWeights.val(i,j) = uPredictorWeights.val(i,j) - 0.0001*uError.val(i,0)*smHist.val(j,0); if(uPredictorWeights.val(i,j) > 10) uPredictorWeights.val(i,j) = 10; else if(uPredictorWeights.val(i,j) < -10) uPredictorWeights.val(i,j) = -10; } } //************************UNRESTRICTED PREDICTOR CODE **************************** return this->fitness; };