Пример #1
0
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();
}
Пример #2
0
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];
}