Exemple #1
0
int main(int argc, char** argv) {
  NormalDistribution<1> distNorm1(5, 5);
  std::vector<double> samplesNorm1;
  distNorm1.getSamples(samplesNorm1, 1000);
  EstimatorML<NormalDistribution<1> > estNorm1;
  estNorm1.addPoints(samplesNorm1.begin(), samplesNorm1.end());
  std::cout << "Estimation1: " << std::endl << estNorm1 << std::endl;
  NormalDistribution<2> distNorm2(Eigen::Matrix<double, 2, 1>(5, 5),
    (Eigen::Matrix<double, 2, 2>() << 5.0, 0.5, 0.5, 5.0).finished());
  std::vector<Eigen::Matrix<double, 2, 1> > samplesNorm2;
  distNorm2.getSamples(samplesNorm2, 1000);
  EstimatorML<NormalDistribution<2> > estNorm2;
  estNorm2.addPoints(samplesNorm2.begin(), samplesNorm2.end());
  std::cout << "Estimation2: " << std::endl << estNorm2 << std::endl;
  CategoricalDistribution<4> distCat4(
    (Eigen::Matrix<double, 4, 1>() << 0.1, 0.2, 0.2, 0.5).finished());
  std::vector<Eigen::Matrix<int, 4, 1> > samplesCat4;
  distCat4.getSamples(samplesCat4, 1000);
  EstimatorML<CategoricalDistribution<4> > estCat4;
  estCat4.addPoints(samplesCat4.begin(), samplesCat4.end());
  std::cout << "Estimation3: " << std::endl << estCat4 << std::endl;
  MultinomialDistribution<4> distMult4(20,
    (Eigen::Matrix<double, 4, 1>() << 0.1, 0.2, 0.2, 0.5).finished());
  std::vector<Eigen::Matrix<int, 4, 1> > samplesMult4;
  distMult4.getSamples(samplesMult4, 1000);
  EstimatorML<MultinomialDistribution<4> > estMult4;
  estMult4.addPoints(samplesMult4.begin(), samplesMult4.end());
  std::cout << "Estimation4: " << std::endl << estMult4 << std::endl;
  ExponentialDistribution distExp(5);
  std::vector<double> samplesExp;
  distExp.getSamples(samplesExp, 1000);
  EstimatorML<ExponentialDistribution> estExp;
  estExp.addPoints(samplesExp.begin(), samplesExp.end());
  std::cout << "Estimation5: " << std::endl << estExp << std::endl;
  GeometricDistribution distGeom(0.7);
  std::vector<int> samplesGeom;
  distGeom.getSamples(samplesGeom, 1000);
  EstimatorML<GeometricDistribution> estGeom;
  estGeom.addPoints(samplesGeom.begin(), samplesGeom.end());
  std::cout << "Estimation6: " << std::endl << estGeom << std::endl;
  PoissonDistribution distPois(5.0);
  std::vector<int> samplesPois;
  distPois.getSamples(samplesPois, 1000);
  EstimatorML<PoissonDistribution> estPois;
  estPois.addPoints(samplesPois.begin(), samplesPois.end());
  std::cout << "Estimation7: " << std::endl << estPois << std::endl;
  LinearRegression<2> distLine(LinearBasisFunction<double, 2>(
    Eigen::Matrix<double, 2, 1>(2.0, 2.0)), 2.0);
  std::vector<Eigen::Matrix<double, 2, 1> > samplesLine;
  for (double x = -10; x < 10; x += 0.01) {
    distLine.setBasis((Eigen::Matrix<double, 1, 1>() << x).finished());
    samplesLine.push_back(distLine.getSample());
  }
  EstimatorML<LinearRegression<2> > estLine;
  estLine.addPoints(samplesLine.begin(), samplesLine.end());
  std::cout << "Estimation8: " << std::endl << estLine << std::endl;
  std::vector<NormalDistribution<1> > distributionsNorm1;
  distributionsNorm1.push_back(NormalDistribution<1>(0, 1.5));
  distributionsNorm1.push_back(NormalDistribution<1>(5, 1.7));
  distributionsNorm1.push_back(NormalDistribution<1>(10, 1.2));
  distributionsNorm1.push_back(NormalDistribution<1>(-5, 1.3));
  distributionsNorm1.push_back(NormalDistribution<1>(-10, 1.5));
  MixtureSampleDistribution<NormalDistribution<1>, 5> distMixtNorm1(
    distributionsNorm1, CategoricalDistribution<5>(
    (Eigen::Matrix<double, 5, 1>() << 0.1, 0.2, 0.2, 0.4, 0.1).finished()));
  std::vector<double> samplesMixtNorm1;
  distMixtNorm1.getSamples(samplesMixtNorm1, 1000);
  std::vector<NormalDistribution<1> > distributionsNorm1Init;
  distributionsNorm1Init.push_back(NormalDistribution<1>(1, 2.4));
  distributionsNorm1Init.push_back(NormalDistribution<1>(6, 3.1));
  distributionsNorm1Init.push_back(NormalDistribution<1>(12, 4.7));
  distributionsNorm1Init.push_back(NormalDistribution<1>(-5.5, 2.1));
  distributionsNorm1Init.push_back(NormalDistribution<1>(-9.5, 1.4));
  MixtureSampleDistribution<NormalDistribution<1>, 5> distMixtNorm1Init(
    distributionsNorm1Init, CategoricalDistribution<5>());
  EstimatorML<MixtureDistribution<NormalDistribution<1>, 5> >
    estMixtNorm1(distMixtNorm1Init);
  size_t numIter = estMixtNorm1.addPointsEM(samplesMixtNorm1.begin(),
    samplesMixtNorm1.end());
  std::cout << "Estimation9: " << std::endl << estMixtNorm1 << std::endl;
  std::cout << "Converged in: " << numIter << " iterations" << std::endl;
  estMixtNorm1 = EstimatorML<MixtureDistribution<NormalDistribution<1>, 5> >
    (distMixtNorm1Init);
  numIter = estMixtNorm1.addPointsCEM(samplesMixtNorm1.begin(),
    samplesMixtNorm1.end());
  std::cout << "Estimation10: " << std::endl << estMixtNorm1 << std::endl;
  std::cout << "Converged in: " << numIter << " iterations" << std::endl;
  estMixtNorm1 = EstimatorML<MixtureDistribution<NormalDistribution<1>, 5> >
    (distMixtNorm1Init);
  numIter = estMixtNorm1.addPointsSEM(samplesMixtNorm1.begin(),
    samplesMixtNorm1.end());
  std::cout << "Estimation11: " << std::endl << estMixtNorm1 << std::endl;
  std::cout << "Converged in: " << numIter << " iterations" << std::endl;
  std::vector<NormalDistribution<3> > distributionsNorm3;
  distributionsNorm3.push_back(NormalDistribution<3>(
    Eigen::Matrix<double, 3, 1>(0, 0, 0),
    Eigen::Matrix<double, 3, 3>::Identity()));
  distributionsNorm3.push_back(NormalDistribution<3>(
    Eigen::Matrix<double, 3, 1>(5, 5, 5),
    Eigen::Matrix<double, 3, 3>::Identity()));
  distributionsNorm3.push_back(NormalDistribution<3>(
    Eigen::Matrix<double, 3, 1>(10, 10, 10),
    Eigen::Matrix<double, 3, 3>::Identity()));
  distributionsNorm3.push_back(NormalDistribution<3>(
    Eigen::Matrix<double, 3, 1>(-5, -5, -5),
    Eigen::Matrix<double, 3, 3>::Identity()));
  distributionsNorm3.push_back(NormalDistribution<3>(
    Eigen::Matrix<double, 3, 1>(-10, -10, -10),
    Eigen::Matrix<double, 3, 3>::Identity()));
  MixtureSampleDistribution<NormalDistribution<3>, 5> distMixtNorm3(
    distributionsNorm3, CategoricalDistribution<5>());
  std::vector<Eigen::Matrix<double, 3, 1> > samplesMixtNorm3;
  distMixtNorm3.getSamples(samplesMixtNorm3, 1000);
  std::vector<NormalDistribution<3> > distributionsNorm3Init;
  distributionsNorm3Init.push_back(NormalDistribution<3>(
    Eigen::Matrix<double, 3, 1>(0.1, 0.2, 0.3)));
  distributionsNorm3Init.push_back(NormalDistribution<3>(
    Eigen::Matrix<double, 3, 1>(5.5, 6, 5.1)));
  distributionsNorm3Init.push_back(NormalDistribution<3>(
    Eigen::Matrix<double, 3, 1>(10.5, 11, 12)));
  distributionsNorm3Init.push_back(NormalDistribution<3>(
    Eigen::Matrix<double, 3, 1>(-5, -5.4, -4.2)));
  distributionsNorm3Init.push_back(NormalDistribution<3>(
    Eigen::Matrix<double, 3, 1>(-10.5, -10.2, -11)));
  MixtureSampleDistribution<NormalDistribution<3>, 5> distMixtNorm3Init(
    distributionsNorm3Init, CategoricalDistribution<5>());
  EstimatorML<MixtureDistribution<NormalDistribution<3>, 5> > estMixtNorm3(
    distMixtNorm3Init);
  numIter = estMixtNorm3.addPointsEM(samplesMixtNorm3.begin(),
    samplesMixtNorm3.end());
  std::cout << "Estimation12: " << std::endl << estMixtNorm3 << std::endl;
  std::cout << "Converged in: " << numIter << " iterations" << std::endl;
  std::vector<LinearRegression<2> > distLines;
  distLines.push_back(LinearRegression<2>(LinearBasisFunction<double, 2>(
    Eigen::Matrix<double, 2, 1>(1.0, 1.0)), 1.5));
  distLines.push_back(LinearRegression<2>(LinearBasisFunction<double, 2>(
    Eigen::Matrix<double, 2, 1>(2.0, 2.0)), 1.2));
  distLines.push_back(LinearRegression<2>(LinearBasisFunction<double, 2>(
    Eigen::Matrix<double, 2, 1>(-1.0, -1.0)), 2.1));
  distLines.push_back(LinearRegression<2>(LinearBasisFunction<double, 2>(
    Eigen::Matrix<double, 2, 1>(-2.0, -2.0)), 2.5));
  MixtureSampleDistribution<LinearRegression<2>, 4> distMixtLines(distLines,
    CategoricalDistribution<4>());
  std::vector<Eigen::Matrix<double, 2, 1> > samplesMixtLines;
  for (size_t i = 0; i < 100; ++i)
    for (double x = -10; x < 10; x += 0.1) {
      for (size_t j = 0; j < distLines.size(); ++j)
        distLines[j].setBasis((Eigen::Matrix<double, 1, 1>() << x).finished());
      distMixtLines.setCompDistributions(distLines);
      samplesMixtLines.push_back(distMixtLines.getSample());
    }
  EstimatorML<MixtureDistribution<LinearRegression<2>, 4> > estMixtLines(
    distMixtLines);
  numIter = estMixtLines.addPointsEM(samplesMixtLines.begin(),
    samplesMixtLines.end());
  std::cout << "Estimation13: " << std::endl << estMixtLines << std::endl;
  std::cout << "Converged in: " << numIter << " iterations" << std::endl;
  return 0;
}
void LapTimerThread::onCurrentCoordReceived(QStringList currentCoord)
{
    lastLat = currentLat;
    lastLon = currentLon;
    lastTime = currentTime;
    double kmlCurrentLat = ((int)(currentCoord.at(0).toDouble()/100)+(currentCoord.at(0).toDouble()/100-(int)(currentCoord.at(0).toDouble()/100))*1.6666667);
    double kmlCurrentLon = ((int)(currentCoord.at(1).toDouble()/100)+(currentCoord.at(1).toDouble()/100-(int)(currentCoord.at(1).toDouble()/100))*1.6666667);
    currentLat = (((int)(currentCoord.at(0).toDouble()/100)+(currentCoord.at(0).toDouble()/100-(int)(currentCoord.at(0).toDouble()/100))*1.6666667)- refLat)*latScale;
    currentLon = (((int)(currentCoord.at(1).toDouble()/100)+(currentCoord.at(1).toDouble()/100-(int)(currentCoord.at(1).toDouble()/100))*1.6666667)- refLon)*lonScale;

    currentTime =  QTime::fromString(currentCoord.at(2), "hhmmss.zzz");
    QString alt = currentCoord.at(3);
    alt.remove("(/s|m)");
    currentAlt = alt;
    int ctr=0;// ctr indicates the number of changes of one coordinate
    for (int i=0;i<sectionFlag.length();i++)
    {
      int temp;
      temp = sectionFlag.at(i);
      sectionFlag.replace(i,(((coefA.at(i)*currentLon + coefB.at(i)*currentLat + coefC.at(i))>0)?1:-1));
      if (temp==0)
      {
          sectionChange.replace(i,0);//first coordinate
      }
      else if (temp!=sectionFlag.at(i)&& (dist(currentLat,waypointLatList.at(i),currentLon,waypointLonList.at(i))<30) && (dist(lastLat,waypointLatList.at(i),lastLon,waypointLonList.at(i))<30))
      {
          sectionChange.replace(i,1);
          ctr++;
      }
      else
          sectionChange.replace(i,0);
    }

    if (ctr==0)
    {
        //do nothing
    }
    else if ((ctr >0))
    {
        if (sectionExp==-1)// acquisition
        {
            if (sectionChange.last()==1)//if the acquisition happens at the finish line
            {
                sectionExp = 0;
                QList <double> sentList;
                sentList.append((double)sectionExp);
                sentList.append(distLine(currentLat,currentLon,coefA.last(),coefB.last(),coefC.last()));
                sentList.append(currentTime.hour());
                sentList.append(currentTime.minute());
                sentList.append(currentTime.second());
                sentList.append(currentTime.msec());
                qWarning()<<lastLat<<lastLon;
                sentList.append(distLine(lastLat,lastLon,coefA.last(),coefB.last(),coefC.last()));
                sentList.append(lastTime.hour());
                sentList.append(lastTime.minute());
                sentList.append(lastTime.second());
                sentList.append(lastTime.msec());
                sentList.append(0);
                sectionChangeSender(sentList);
                qWarning()<<"sentlist(acq): "<<sentList;
            }

        }
        else if (sectionExp == sectionFlag.length()-1) //cross finish point
        {
            if (sectionChange.indexOf(1)==sectionExp)
            {
                sectionExp=0;
            QList <double> sentList;
            sentList.append((double)sectionExp);
            sentList.append(distLine(currentLat,currentLon,coefA.last(),coefB.last(),coefC.last()));
            sentList.append(currentTime.hour());
            sentList.append(currentTime.minute());
            sentList.append(currentTime.second());
            sentList.append(currentTime.msec());
            sentList.append(distLine(lastLat,lastLon,coefA.last(),coefB.last(),coefC.last()));
            sentList.append(lastTime.hour());
            sentList.append(lastTime.minute());
            sentList.append(lastTime.second());
            sentList.append(lastTime.msec());
            sentList.append(1);
            bufferWaypt.writeTextElement("when",QDate::currentDate().toString("yyyy-MM-dd")+"T"+currentTime.toString("hh:mm:ss.zzz")+"Z");
            bufferWaypt.writeTextElement("waypt",QString::number(kmlCurrentLon,'f',8)+","+QString::number(kmlCurrentLat,'f',8)+","+alt);
            sectionChangeSender(sentList);
            qWarning()<<"sentlist(fin): "<<sentList;
            }
            else
                sectionExp = -1; //reset section
        }
        else //cross other waypoints
        {
            if ((sectionExp+1)==(sectionChange.indexOf(1)+1))
            {
                sectionExp++;
                QList <double> sentList;
                sentList.append((double)sectionExp);//0
                sentList.append(distLine(currentLat,currentLon,coefA.at(sectionExp-1),coefB.at(sectionExp-1),coefC.at(sectionExp-1)));//1
                sentList.append(currentTime.hour());//2
                sentList.append(currentTime.minute());//3
                sentList.append(currentTime.second());//4
                sentList.append(currentTime.msec());//5
                sentList.append(distLine(lastLat,lastLon,coefA.at(sectionExp-1),coefB.at(sectionExp-1),coefC.at(sectionExp-1)));//6
                sentList.append(lastTime.hour());//7
                sentList.append(lastTime.minute());//8
                sentList.append(lastTime.second());//9
                sentList.append(lastTime.msec());//10
                sentList.append(1);
                bufferWaypt.writeTextElement("when",QDate::currentDate().toString("yyyy-MM-dd")+"T"+currentTime.toString("hh:mm:ss.zzz")+"Z");
                bufferWaypt.writeTextElement("waypt",QString::number(kmlCurrentLon,'f',8)+","+QString::number(kmlCurrentLat,'f',8)+","+alt);
                sectionChangeSender(sentList);
                qWarning()<<"sentlist(way): "<<sentList;

            }
            else
                sectionExp = -1;//reset section
        }


    }

    if (flag)
    {
    bufferCoord.writeTextElement("when",QDate::currentDate().toString("yyyy-MM-dd")+"T"+currentTime.toString("hh:mm:ss.zzz")+"Z");
    bufferCoord.writeTextElement("coord",QString::number(kmlCurrentLon,'f',8)+" "+QString::number(kmlCurrentLat,'f',8)+" "+alt);
    bufferSpeed.writeTextElement("speed",currentSpeed);
    }
//    else
//    {
//        sectionExp = -1;//reset section
//    }
qWarning()<<currentLat<<currentLon;
qWarning()<<"sectionChange: "<<sectionChange;
qWarning()<<"sectionFlag: "<<sectionFlag;


}