Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
    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();
    }
Exemplo n.º 4
0
// ----------------------------------------------------------------------------
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
Exemplo n.º 5
0
// ----------------------------------------------------------------------------
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