void Goban::init_priors(Prior priors[]) const { const double EQUIV = size;// /2; priors[PASS].prior = 0.1*EQUIV, priors[PASS].equiv = EQUIV; for(int i = 0; i < empty_points.length(); ++i){ int p = empty_points[i]; priors[p].prior = 0.5*EQUIV, priors[p].equiv = EQUIV; } for(int i = 0; i < empty_points.length(); ++i){ int p = empty_points[i]; if(is_self_atari(p, side)){ priors[p].prior = 0.2*EQUIV, priors[p].equiv = 2*EQUIV; continue; } if(is_surrounded(p, side)){ priors[p].prior = 0.3*EQUIV, priors[p].equiv = EQUIV; continue; } priors[p].prior = 0.5*EQUIV, priors[p].equiv = EQUIV; if(size > 11){ if(distance_to_edge[p] == 0 && !stones_around(p, 4)){ priors[p].prior = 0.1*EQUIV, priors[p].equiv = EQUIV; } else if(distance_to_edge[p] == 3 && !stones_around(p, 4)){ priors[p].prior = 0.9*EQUIV, priors[p].equiv = EQUIV; } } GroupSet<4> neigh; int nneigh = neighbour_groups(p, neigh); for(int j = 0; j < nneigh; j++){ if(neigh[j]->has_one_liberty()){ if(neigh[j]->get_color() != side){ priors[p].prior = 1.4*EQUIV, priors[p].equiv = 2*EQUIV; goto endloop; } else{ priors[p].prior = 0.6*EQUIV, priors[p].equiv = EQUIV; goto endloop; } } } if(match_mogo_pattern(p, side)){ priors[p].prior = 0.9*EQUIV, priors[p].equiv = EQUIV; continue; } endloop:; } if(last_point == 0) return; PointSet<MAXSIZE2> list; capture_heuristic(last_point, list); for(int i = 0; i < list.length(); i++){ priors[list[i]].prior += 3*EQUIV, priors[list[i]].equiv += 3*EQUIV; } list.clear(); save_heuristic(last_point, list); for(int i = 0; i < list.length(); i++){ priors[list[i]].prior += 2*EQUIV, priors[list[i]].equiv += 2*EQUIV; } list.clear(); pattern_heuristic(last_point, list); for(int i = 0; i < list.length(); i++){ priors[list[i]].prior += 2*EQUIV, priors[list[i]].equiv += 2*EQUIV; } list.clear(); for(int i = 0; last_point && i < 4; i++){ for(int j = 0; j < 4*(i+1); j++){ int v = within_manhattan[last_point][i][j]; if(v) { priors[v].prior += (1.0-0.1*i)*EQUIV, priors[v].equiv += EQUIV; } } } }
bool RangeProfilePlotManager::plotProfile(Signature* pSignature) { VERIFY(mpView && pSignature); std::string plotName = pSignature->getDisplayName(); if (plotName.empty()) { plotName = pSignature->getName(); } if (plotName == "Difference") { QMessageBox::warning(Service<DesktopServices>()->getMainWidget(), "Invalid signature", "Signatures can not be named 'Difference' as this is a reserved " "name for this plot. Please rename your signature and try again."); return false; } const Units* pXUnits = NULL; const Units* pYUnits = NULL; std::vector<double> xData; std::vector<double> yData; std::set<std::string> dataNames = pSignature->getDataNames(); for (std::set<std::string>::const_iterator dataName = dataNames.begin(); dataName != dataNames.end() && (pXUnits == NULL || pYUnits == NULL); ++dataName) { const Units* pUnits = pSignature->getUnits(*dataName); if (pUnits == NULL) { continue; } if (pUnits->getUnitType() == DISTANCE) { if (pXUnits == NULL) { pXUnits = pUnits; xData = dv_cast<std::vector<double> >(pSignature->getData(*dataName), std::vector<double>()); } } else if (pYUnits == NULL) { pYUnits = pUnits; yData = dv_cast<std::vector<double> >(pSignature->getData(*dataName), std::vector<double>()); } } if (xData.empty() || xData.size() != yData.size()) { QMessageBox::warning(Service<DesktopServices>()->getMainWidget(), "Invalid signature", QString("Signatures must have a distance axis. '%1' does not and will not be plotted.") .arg(QString::fromStdString(pSignature->getName()))); return false; } std::map<Signature*, std::string>::iterator oldPointSet = mSigPointSets.find(pSignature); PointSet* pSet = getPointSet(pSignature); if (pSet != NULL) { pSet->clear(true); } std::list<PlotObject*> curObjects; mpView->getObjects(POINT_SET, curObjects); if (pSet == NULL) { std::vector<ColorType> excluded; excluded.push_back(ColorType(255, 255, 255)); // background excluded.push_back(ColorType(200, 0, 0)); // color for the difference plot for (std::list<PlotObject*>::const_iterator cur = curObjects.begin(); cur != curObjects.end(); ++cur) { excluded.push_back(static_cast<PointSet*>(*cur)->getLineColor()); } pSet = static_cast<PointSet*>(mpView->addObject(POINT_SET, true)); mSigPointSets[pSignature] = plotName; pSignature->attach(SIGNAL_NAME(Subject, Deleted), Slot(this, &RangeProfilePlotManager::signatureDeleted)); pSignature->getDataDescriptor()->attach(SIGNAL_NAME(DataDescriptor, Renamed), Slot(this, &RangeProfilePlotManager::signatureRenamed)); std::vector<ColorType> colors; ColorType::getUniqueColors(1, colors, excluded); if (!colors.empty()) { pSet->setLineColor(colors.front()); } } pSet->setObjectName(plotName); for (size_t idx = 0; idx < xData.size(); ++idx) { pSet->addPoint(xData[idx], yData[idx]); } VERIFY(mpPlot); Axis* pBottom = mpPlot->getAxis(AXIS_BOTTOM); Axis* pLeft = mpPlot->getAxis(AXIS_LEFT); VERIFYRV(pBottom && pLeft, NULL); if (pBottom->getTitle().empty()) { pBottom->setTitle(pXUnits->getUnitName()); } if (pLeft->getTitle().empty()) { pLeft->setTitle(pYUnits->getUnitName()); } else if (pLeft->getTitle() != pYUnits->getUnitName()) { Axis* pRight = mpPlot->getAxis(AXIS_RIGHT); VERIFYRV(pRight, NULL); if (pRight->getTitle().empty()) { pRight->setTitle(pYUnits->getUnitName()); } } std::string classificationText = dv_cast<std::string>(pSignature->getMetadata()->getAttribute("Raw Classification"), mpPlot->getClassificationText()); if (classificationText.empty() == false) { FactoryResource<Classification> pClassification; if (pClassification->setClassification(classificationText) == true) { mpPlot->setClassification(pClassification.get()); } else { QMessageBox::warning(Service<DesktopServices>()->getMainWidget(), QString::fromStdString(getName()), "The plot could not be updated with the signature classification. Please ensure that the plot " "has the proper classification."); } } getDockWindow()->show(); mpView->zoomExtents(); mpView->refresh(); return true; }
void RangeProfilePlotManager::calculateDifferences() { // ensure we have only two objects selected VERIFYNRV(mpView); std::list<PlotObject*> selected; mpView->getSelectedObjects(selected, true); std::list<PlotObject*>::iterator selIt = selected.begin(); PointSet* pFirst = (selIt == selected.end()) ? NULL : dynamic_cast<PointSet*>(*(selIt++)); PointSet* pSecond = (selIt == selected.end()) ? NULL : dynamic_cast<PointSet*>(*(selIt++)); if (pFirst == NULL || pSecond == NULL) { return; } // locate the Difference point set std::list<PlotObject*> allObjects; mpView->getObjects(POINT_SET, allObjects); PointSet* pDiffSet = NULL; for (std::list<PlotObject*>::iterator obj = allObjects.begin(); obj != allObjects.end(); ++obj) { PointSet* pSet = static_cast<PointSet*>(*obj); std::string name; pSet->getObjectName(name); if (name == "Difference") { pDiffSet = pSet; pDiffSet->clear(true); break; } } if (pDiffSet == NULL) { pDiffSet = static_cast<PointSet*>(mpView->addObject(POINT_SET, true)); pDiffSet->setObjectName("Difference"); } // calculate the differences and errors std::vector<Point*> aPoints = pFirst->getPoints(); std::vector<Point*> bPoints = pSecond->getPoints(); if (aPoints.size() < 2 || bPoints.size() < 2) { return; } double mae = 0.0; double mse1 = 0.0; double mse2 = 0.0; for (size_t aIdx = 0; aIdx < aPoints.size(); ++aIdx) { Point* pA = aPoints[aIdx]; VERIFYNRV(pA); LocationType aVal = pA->getLocation(); LocationType newVal; // locate the associated spot in b for (size_t bIdx = 0; bIdx < bPoints.size(); ++bIdx) { Point* pB = bPoints[bIdx]; VERIFYNRV(pB); LocationType bVal = pB->getLocation(); double diff = aVal.mX - bVal.mX; if (fabs(diff) < 0.0000001) // a == b use the exact value { newVal.mX = aVal.mX; newVal.mY = bVal.mY - aVal.mY; break; } else if (diff < 0.0) // a < b found the upper point, interpolate { newVal.mX = aVal.mX; LocationType secondBVal; if (bIdx == 0) // we are at the start so continue the segment from the right { Point* pSecondB = bPoints[1]; VERIFYNRV(pSecondB); secondBVal = pSecondB->getLocation(); } else // grab the previous point for interpolation { Point* pSecondB = bPoints[bIdx-1]; VERIFYNRV(pSecondB); secondBVal = pSecondB->getLocation(); } // calculate slope-intercept double m = (bVal.mY - secondBVal.mY) / (bVal.mX - secondBVal.mX); double b = bVal.mY - m * bVal.mX; // find the y corresponding to the interpolated x newVal.mY = m * newVal.mX + b; newVal.mY -= aVal.mY; break; } } mae += fabs(newVal.mY); mse1 += newVal.mY * newVal.mY; mse2 += (newVal.mY * newVal.mY) / (aVal.mY * aVal.mY); pDiffSet->addPoint(newVal.mX, newVal.mY); } pDiffSet->setLineColor(ColorType(200, 0, 0)); mpView->refresh(); mae /= aPoints.size(); mse1 /= aPoints.size(); mse2 /= aPoints.size(); QMessageBox::information(mpView->getWidget(), "Comparison metrics", QString("Mean squared error (method 1): %1\n" "Mean squared error (method 2): %2\n" "Mean absolute error: %3").arg(mse1).arg(mse2).arg(mae), QMessageBox::Close); }
double createPointSets(const ThreadParams& params, bool sample, double stdDev, PointSet& altitude, PointSet& speed) { double startTime = 0; double lastTime = 0; altitude.clear(); speed.clear(); for(auto i = params.flightProfile.begin(); i != params.flightProfile.end(); ++i) { double time; if(sample) { time = i->time.sample(); } else { time = i->time.offsetMean(stdDev); } if(i == params.flightProfile.begin()) { startTime = time; } else { lastTime = time - startTime; } if(!i->altitude.isNull()) { double alt; if(sample) { alt = i->altitude.sample(); } else { alt = i->altitude.offsetMean(stdDev); } altitude.addPoint(time, alt); } if(!i->speed.isNull()) { double spd; if(sample) { spd = i->speed.sample(); } else { spd = i->speed.offsetMean(stdDev); } speed.addPoint(time, spd); } } //remove-me // std::cerr << "altitude" << std::endl; // for(size_t i = 0; i < altitude.size(); ++i) // { // std::cerr << "t=" << altitude[i].x_ << " altitude=" << altitude[i].y_ << std::endl; // } // std::cerr << "speed" << std::endl; // for(size_t i = 0; i < speed.size(); ++i) // { // std::cerr << "t=" << speed[i].x_ << " speed=" << speed[i].y_ << std::endl; // } // std::cerr << "elapsed=" << lastTime << std::endl; return lastTime; }