AnnealResult Annealer::minimize(const arma::vec& ctr0, const arma::vec& sigma0, const arma::mat& expPos, const arma::vec& expHits) const { assert(ctr0.n_elem > 0); assert(ctr0.n_elem == sigma0.n_elem); AnnealerState state; state.temp = T0; state.sigma = sigma0; state.expPos = expPos; state.expHits = expHits; state.ctrs.push_back(ctr0); state.chis.push_back(runTrack(ctr0, expPos, expHits)); state.numCalls++; for (int iter = 0; iter < numIters; iter++) { try { findNextPoint(state); } catch (const AnnealerReachedMaxCalls&) { return AnnealResult(state.ctrs, state.chis, AnnealStopReason::tooManyCalls, state.numCalls); } // Cool the system before the next iteration state.temp *= coolRate; state.sigma *= coolRate; } return AnnealResult(state.ctrs, state.chis, AnnealStopReason::maxIters, state.numCalls); }
arma::mat MinimizerBase::runTracks(const arma::mat& params, const arma::mat& expPos, const arma::vec& expHits) const { arma::mat chis (params.n_rows, 3); #pragma omp parallel for schedule(static) shared(chis) for (unsigned j = 0; j < params.n_rows; j++) { arma::vec p = arma::conv_to<arma::colvec>::from(params.row(j)); try { auto chiset = runTrack(p, expPos, expHits); chis(j, 0) = chiset.posChi2; chis(j, 1) = chiset.enChi2; chis(j, 2) = chiset.vertChi2; } catch (...) { chis(j, 0) = arma::datum::nan; chis(j, 1) = arma::datum::nan; chis(j, 2) = arma::datum::nan; } } return chis; }
void Annealer::findNextPoint(AnnealerState& state) const { const arma::vec& lastCtr = state.ctrs.back(); const double lastTotalChi = state.chis.back().sum(); const size_t numThreads = static_cast<size_t>(omp_get_max_threads()); for (int iterCalls = 0; iterCalls < maxCallsPerIter; iterCalls += numThreads) { std::vector<Trial> trials (numThreads); #pragma omp parallel { const size_t thnum = static_cast<size_t>(omp_get_thread_num()); Trial& thTrial = trials.at(thnum); thTrial.ctr = randomStep(lastCtr, state.sigma); try { thTrial.chi = runTrack(thTrial.ctr, state.expPos, state.expHits); } catch (const std::exception&) { thTrial.hadError = true; } } state.numCalls += numThreads; auto bestTrialIter = std::min_element(trials.begin(), trials.end()); if (solutionIsBetter(bestTrialIter->chi.sum(), lastTotalChi, state.temp)) { state.ctrs.push_back(bestTrialIter->ctr); state.chis.push_back(bestTrialIter->chi); return; } } // If we reach this point, we didn't find a good solution, so fail throw AnnealerReachedMaxCalls(); }
// ---------------------------------------------------------------------------- bool Editor::OnEvent(const SEvent& event) { if (event.EventType == EET_GUI_EVENT && event.GUIEvent.EventType == EGET_BUTTON_CLICKED) if (importantButtonClicked(event.GUIEvent.Caller->getID())) return true; if (!m_valid_data_dir) { if (event.EventType == EET_GUI_EVENT) { if (event.GUIEvent.EventType == EGET_DIRECTORY_SELECTED) { if (validateDataLoc( ((IGUIFileOpenDialog*)event.GUIEvent.Caller)->getDirectoryName())) { ((IGUIFileOpenDialog*)event.GUIEvent.Caller)->remove(); } return true; } // Directory selected if (event.GUIEvent.EventType == EGET_FILE_CHOOSE_DIALOG_CANCELLED) { dataDirLocDlg(); return true; } } // GUI_EVENT return false; } // !valid data dir if (!m_viewport) return false; // mouse event if (event.EventType == EET_MOUSE_INPUT_EVENT) { // check if mouse is outside of the viewport's domain if (event.MouseInput.Y < 50 || event.MouseInput.X <= 15 || event.MouseInput.X >(s32) m_screen_size.Width - 250 || event.MouseInput.Y >= (s32)m_screen_size.Height - 15 || (event.MouseInput.X >(s32)m_screen_size.Width - 500 && m_tex_sel->isActive())) { u32 s = m_viewport->getState(); if (s == Viewport::EDIT || (s==Viewport::SELECT && m_mouse.middle_btn_down)) keepMouseIn(event.MouseInput.X, event.MouseInput.Y); else { m_viewport->setFocus(false); m_mouse.in_view = false; return false; } } // mouse is outside m_mouse.in_view = true; m_viewport->setFocus(true); m_mouse.refresh(event); } // mouse event if (event.EventType == EET_GUI_EVENT && event.GUIEvent.EventType == EGET_FILE_SELECTED) { switch (((IGUIFileOpenDialog*)event.GUIEvent.Caller)->getID()) { case 1234: m_viewport->getTrack()->setMusic(toRelative( path(((IGUIFileOpenDialog*)event.GUIEvent.Caller)->getFileName()))); break; case 333: m_exe_loc = path(((IGUIFileOpenDialog*)event.GUIEvent.Caller)->getFileName()); writeResAndExePathIntoConfig(); runTrack(); break; default: open(path(((IGUIFileOpenDialog*)event.GUIEvent.Caller)->getFileName())); } m_viewport->lock(false); return true; } if (!m_viewport->getTrack()) return false; if (event.EventType == EET_GUI_EVENT) { RoadPanel* rp; s32 id = event.GUIEvent.Caller->getID(); switch (event.GUIEvent.EventType) { case EGET_FILE_CHOOSE_DIALOG_CANCELLED: m_viewport->lock(false); return true; case EGET_BUTTON_CLICKED: m_gui_env->removeFocus(m_gui_env->getFocus()->getParent()); return buttonClicked(id); case EGET_COMBO_BOX_CHANGED: switch (id) { case EnvPanel::CB_ID: EnvPanel::getEnvPanel()->resetIndex(); EnvPanel::getEnvPanel()->refreshBtnTable(); return true; case RoadPanel::SELECT: m_viewport->setActiveRoad(RoadPanel::getRoadPanel() ->getSelectedRoadID()); break; default: break; } return false; case EGET_EDITBOX_CHANGED: switch (id) { case TerrPanel::H_MAX_EDIT_BOX: case TerrPanel::H_MIN_EDIT_BOX: TerrPanel::getTerrPanel()->refreshTerrModData(); return true; case EnvPanel::SF_ID: EnvPanel::getEnvPanel()->resetIndex(); EnvPanel::getEnvPanel()->refreshBtnTable(); return true; case TexSel::SEARCH_BOX: TexSel::getTexSel()->searchFieldDirty(); return true; default: break; } return false; case EGET_SCROLL_BAR_CHANGED: switch (id) { case TerrPanel::INTENSITY: case TerrPanel::RADIUS: TerrPanel::getTerrPanel()->refreshTerrModData(); m_viewport->setState(Viewport::TERRAIN_MOD); return true; case RoadPanel::DETAIL: rp = RoadPanel::getRoadPanel(); m_viewport->getTrack()->getRoadByID(rp->getSelectedRoadID()) ->setDetail(rp->getDetail()); return true; case RoadPanel::WIDTH: rp = RoadPanel::getRoadPanel(); m_viewport->getTrack()->getRoadByID(rp->getSelectedRoadID()) ->setWidth(rp->getWidth()); return true; case RoadPanel::WRAP_U: rp = RoadPanel::getRoadPanel(); m_viewport->getTrack()->getRoadByID(rp->getSelectedRoadID()) ->setUWrapCount(rp->getTexUCount()); return true; case RoadPanel::WRAP_V: rp = RoadPanel::getRoadPanel(); m_viewport->getTrack()->getRoadByID(rp->getSelectedRoadID()) ->setVWrapCount(rp->getTexVCount()); return true; case RoadPanel::OFFSET_U: rp = RoadPanel::getRoadPanel(); m_viewport->getTrack()->getRoadByID(rp->getSelectedRoadID()) ->setUOffset(rp->getTexUOffset()); return true; case RoadPanel::OFFSET_V: rp = RoadPanel::getRoadPanel(); m_viewport->getTrack()->getRoadByID(rp->getSelectedRoadID()) ->setVOffset(rp->getTexVOffset()); return true; default: break; } return false; case EGET_CHECKBOX_CHANGED: switch (id) { case TerrPanel::H_MAX_CHECK_BOX: case TerrPanel::H_MIN_CHECK_BOX: TerrPanel::getTerrPanel()->refreshTerrModData(); m_viewport->setState(Viewport::TERRAIN_MOD); return true; case RoadPanel::CLOSED_ROAD: m_viewport->roadClosedStateChanged(); return true; case RoadPanel::SWAP_UV: m_viewport->roadSwapStateChanged(); return true; default: break; } default: return false; } } // EventType == EET_GUI_EVENT bool should_quit = false; // gui active, there is nothing we should do if (m_viewport->isLocked()) should_quit = true; if (m_gui_env->getFocus()) { s32 id = m_gui_env->getFocus()->getID(); if (id == RoadPanel::NAMEBOX || id == EnvPanel::SF_ID || id == TerrPanel::H_MAX_EDIT_BOX || id == TerrPanel::H_MIN_EDIT_BOX) should_quit = true; } // keyboard event if (event.EventType == EET_KEY_INPUT_EVENT) { if (!event.KeyInput.PressedDown || !should_quit) m_keys.keyEvent(event.KeyInput.Key, event.KeyInput.PressedDown); if (should_quit) return false; if (event.KeyInput.PressedDown) { if (m_keys.state(SHIFT_PRESSED) && m_keys.state(CTRL_PRESSED)) { if (m_keys.state(S_PRESSED)) m_viewport->build(); } else { if (m_keys.state(SHIFT_PRESSED)) shiftShortcuts(event.KeyInput.Key); if (m_keys.state(CTRL_PRESSED)) ctrlShortcuts(event.KeyInput.Key); if (!m_keys.state(CTRL_PRESSED) && !m_keys.state(SHIFT_PRESSED)) simpleShortcuts(event.KeyInput.Key); } } return true; } return false; } // OnEvent
// ---------------------------------------------------------------------------- bool Editor::buttonClicked(s32 ID) { RoadPanel* rp; switch (ID) { // ToolBar buttons case ToolBar::TBI_UNDO: m_viewport->undo(); return true; case ToolBar::TBI_REDO: m_viewport->redo(); return true; case ToolBar::TBI_SELECT: m_viewport->setState(Viewport::SELECT); return true; case ToolBar::TBI_MOVE: m_viewport->setEditMode(Viewport::MOVE); return true; case ToolBar::TBI_ROTATE: m_viewport->setEditMode(Viewport::ROTATE); return true; case ToolBar::TBI_SCALE: m_viewport->setEditMode(Viewport::SCALE); return true; case ToolBar::TBI_DELETE: m_viewport->deleteCmd(); return true; case ToolBar::TBI_CAM: m_viewport->setState(Viewport::FREECAM); return true; case ToolBar::TBI_RECAM: m_viewport->restoreCam(); return true; case ToolBar::TBI_DRIVELINE: m_viewport->selectDriveLine(); return true; case ToolBar::TBI_HIDE_TERRAIN: m_viewport->getTerrain()->swapVisibility(); return true; case ToolBar::TBI_TRY: runTrack(); return true; case ToolBar::TBI_MUSIC: m_viewport->lock(); m_gui_env->addFileOpenDialog(L"Select music:", true, 0, 1234, true, m_music_loc); return true; // WELCOME SCREEN case ToolBar::TBI_SAVE: if (m_viewport->getTrack()) m_viewport->getTrack()->save(); return true; case ToolBar::TBI_EXPORT: m_viewport->build(); return true; // ToolBox BTN: case ToolBox::TWND_ID: case ToolBox::EWND_ID: case ToolBox::RWND_ID: case ToolBox::XWND_ID: m_toolbox->setWndw(ID); return true; // ToolBox / Terrain buttons: case TerrPanel::EDGE_1: case TerrPanel::EDGE_2: case TerrPanel::EDGE_3: case TerrPanel::M_T1: case TerrPanel::M_T2: case TerrPanel::M_T3: case TerrPanel::M_T4: case TerrPanel::H_BTN: case TerrPanel::T_SOFT_BTN: case TerrPanel::T_HARD_BTN: case TerrPanel::T_BRIGHTNESS_BTN: m_viewport->setState(Viewport::TERRAIN_MOD); case TerrPanel::M_TC1: case TerrPanel::M_TC2: case TerrPanel::M_TC3: case TerrPanel::M_TC4: case TerrPanel::S_T1: case TerrPanel::S_T2: case TerrPanel::S_T3: case TerrPanel::S_T4: case TerrPanel::S_T5: case TerrPanel::S_T6: TerrPanel::getTerrPanel()->btnDown(ID); return true; // ToolBox / RoadPanel buttons: case RoadPanel::CREATE: rp = RoadPanel::getRoadPanel(); Viewport::get()->getTrack()->createRoad(rp->getNextRoadType(), rp->getNextRoadName()); rp->btnDown(ID); return true; case RoadPanel::ADD: case RoadPanel::INSERT: m_viewport->setSplineMode(true); m_viewport->setState(Viewport::SPLINE); RoadPanel::getRoadPanel()->btnDown(ID); return true; case RoadPanel::CHECKLINE: m_viewport->setState(Viewport::CHECK_LINE); return true; case RoadPanel::EXIT: m_viewport->setState(Viewport::SELECT); return true; case RoadPanel::CROSS_SECTION: m_viewport->switchRoadCrossSectionMode(false); return true; case RoadPanel::ATTACH_TO_DL: m_viewport->attachRoadToDriveLine(); return true; case RoadPanel::TEXTURE: for (int i = RoadPanel::getRoadPanel()->getSelectedRoadID(); i != 0; i = 0) { m_tex_sel->subscribe((Road*)m_viewport->getTrack()->getRoadByID(i)); } return true; // ToolBox / Extra buttons: case ExtraPanel::BTN_BANANA: case ExtraPanel::BTN_ITEM: case ExtraPanel::BTN_SNITRO: case ExtraPanel::BTN_BNITRO: addItem(ID); return true; default: break; } EnvPanel* ep = EnvPanel::getEnvPanel(); // env panel if (ID >= ep->FIRST_BTN_ID && ID < ep->FIRST_BTN_ID + ep->getBtnNum()) { // element is picked from env panel m_viewport->setSplineMode(false); m_viewport->setNewEntity(EnvPanel::getEnvPanel()->getModelPathFromBtnId(ID)); return true; } if (ID == ep->FIRST_BTN_ID + ep->getBtnNum()) { ep->switchPage(-1); return true; } if (ID == ep->FIRST_BTN_ID + ep->getBtnNum() + 1) { ep->switchPage(1); return true; } if (ID >= m_tex_sel->FIRST_BTN_ID && ID < m_tex_sel->FIRST_TEX_BTN_ID + (s32)m_tex_sel->getBtnNum()) { m_tex_sel->btnClicked(ID); return true; } std::cerr << "Button click isn't handled!" << std::endl; return false; } // buttonClicked