string TrackedObject::getDataForUpdate(string inputVideoFile){ evaluateParameters(); stringstream outStream; outStream << inputVideoFile << "," << firstFrame << "," << lastFrame << ","; outStream << id << "," << speed << "," << intercept << "," << slope << "," << avgX << "," << avgY; for (vector<int*>::iterator iter = positions.begin(); iter != positions.end(); ++iter){ outStream << "," << (*iter)[0] << "_" << (*iter)[1]; } return outStream.str(); }
void RegionAnalysis::NelderMeadOptimization (std::vector<BasecallerRead> &dataAll, DPTreephaser& treephaser, float *parameters, int numEvaluations, int numParameters) { int iEvaluation = 0; // // Step 1. Pick initial vertices, evaluate the function at vertices, and sort the vertices // float vertex[numParameters+1][numParameters]; float value[numParameters+1]; int order[numParameters+1]; for (int iVertex = 0; iVertex <= numParameters; iVertex++) { for (int iParam = 0; iParam < numParameters; iParam++) vertex[iVertex][iParam] = parameters[iParam]; switch (iVertex) { case 0: // First vertex just matches the provided starting values break; case 1: // Second vertex has higher CF vertex[iVertex][0] += 0.004; break; case 2: // Third vertex has higher IE vertex[iVertex][1] += 0.004; break; case 3: // Fourth vertex has higher DR vertex[iVertex][2] += 0.001; break; default: // Default for future parameters vertex[iVertex][iVertex-1] *= 1.5; break; } value[iVertex] = evaluateParameters(dataAll, treephaser, vertex[iVertex]); iEvaluation++; order[iVertex] = iVertex; for (int xVertex = iVertex; xVertex > 0; xVertex--) { if (value[order[xVertex]] < value[order[xVertex-1]]) { int x = order[xVertex]; order[xVertex] = order[xVertex-1]; order[xVertex-1] = x; } } } // Main optimization loop while (iEvaluation < numEvaluations) { // // Step 2. Attempt reflection (and possibly expansion) // float center[numParameters]; float reflection[numParameters]; int worst = order[numParameters]; int secondWorst = order[numParameters-1]; int best = order[0]; for (int iParam = 0; iParam < numParameters; iParam++) { center[iParam] = 0; for (int iVertex = 0; iVertex <= numParameters; iVertex++) if (iVertex != worst) center[iParam] += vertex[iVertex][iParam]; center[iParam] /= numParameters ; reflection[iParam] = center[iParam] + NMalpha * (center[iParam] - vertex[worst][iParam]); } float reflectionValue = evaluateParameters(dataAll, treephaser, reflection); iEvaluation++; if (reflectionValue < value[best]) { // Consider expansion: float expansion[numParameters]; for (int iParam = 0; iParam < numParameters; iParam++) expansion[iParam] = center[iParam] + NMgamma * (center[iParam] - vertex[worst][iParam]); float expansionValue = evaluateParameters(dataAll, treephaser, expansion); iEvaluation++; if (expansionValue < reflectionValue) { // Expansion indeed better than reflection for (int iParam = 0; iParam < numParameters; iParam++) reflection[iParam] = expansion[iParam]; reflectionValue = expansionValue; } } if (reflectionValue < value[secondWorst]) { // Either reflection or expansion was successful for (int iParam = 0; iParam < numParameters; iParam++) vertex[worst][iParam] = reflection[iParam]; value[worst] = reflectionValue; for (int xVertex = numParameters; xVertex > 0; xVertex--) { if (value[order[xVertex]] < value[order[xVertex-1]]) { int x = order[xVertex]; order[xVertex] = order[xVertex-1]; order[xVertex-1] = x; } } continue; } // // Step 3. Attempt contraction (reflection was unsuccessful) // float contraction[numParameters]; for (int iParam = 0; iParam < numParameters; iParam++) contraction[iParam] = vertex[worst][iParam] + NMrho * (center[iParam] - vertex[worst][iParam]); float contractionValue = evaluateParameters(dataAll, treephaser, contraction); iEvaluation++; if (contractionValue < value[worst]) { // Contraction was successful for (int iParam = 0; iParam < numParameters; iParam++) vertex[worst][iParam] = contraction[iParam]; value[worst] = contractionValue; for (int xVertex = numParameters; xVertex > 0; xVertex--) { if (value[order[xVertex]] < value[order[xVertex-1]]) { int x = order[xVertex]; order[xVertex] = order[xVertex-1]; order[xVertex-1] = x; } } continue; } // // Step 4. Perform reduction (contraction was unsuccessful) // for (int iVertex = 1; iVertex <= numParameters; iVertex++) { for (int iParam = 0; iParam < numParameters; iParam++) vertex[order[iVertex]][iParam] = vertex[best][iParam] + NMsigma * (vertex[order[iVertex]][iParam] - vertex[best][iParam]); value[order[iVertex]] = evaluateParameters(dataAll, treephaser, vertex[order[iVertex]]); iEvaluation++; for (int xVertex = iVertex; xVertex > 0; xVertex--) { if (value[order[xVertex]] < value[order[xVertex-1]]) { int x = order[xVertex]; order[xVertex] = order[xVertex-1]; order[xVertex-1] = x; } } } } for (int iParam = 0; iParam < numParameters; iParam++) parameters[iParam] = vertex[order[0]][iParam]; }