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; }