//--------------------------------------------------------------------------------------- void ScorePlayerCtrl::handle_event(SpEventInfo pEvent) { SpEventMouse pEv( static_pointer_cast<EventMouse>(pEvent) ); if (!pEv->is_still_valid()) return; if (m_fEnabled) { if (pEvent->is_mouse_in_event()) { LOMSE_LOG_DEBUG(Logger::k_events | Logger::k_score_player, "Mouse in event received"); m_currentColor = m_hoverColor; m_fFullView = true; m_pMainBox->set_dirty(true); } else if (pEvent->is_mouse_out_event()) { LOMSE_LOG_DEBUG(Logger::k_events | Logger::k_score_player, "Mouse out event received"); m_fFullView = false; m_currentColor = m_normalColor; m_pMainBox->set_dirty(true); } else if (pEvent->is_on_click_event()) { LOMSE_LOG_DEBUG(Logger::k_events | Logger::k_score_player, "Mouse on-click event received"); m_fFullView = true; bool fPlay = (m_playButtonState == k_play ); if (fPlay) { set_play_button_state(k_stop); } else { set_play_button_state(k_play); } //create event for user app EEventType evType = (fPlay ? k_do_play_score_event : k_stop_playback_event); //k_pause_score_event); WpInteractor wpIntor = pEv->get_interactor(); if (SpInteractor p = wpIntor.lock()) { ImoScore* pScore = m_pOwnerImo->get_score(); SpEventPlayScore event( LOMSE_NEW EventPlayScore(evType, wpIntor, pScore, this) ); //AWARE: we notify directly to user app. (to observers of Interactor) p->notify_observers(event, p.get()); } } else { LOMSE_LOG_WARN(str(boost::format("Unknown event received. Type=%d") % pEvent->get_event_type()) ); } } }
void CBICLearningEngine::Learn() { CEMLearningEngine *pLearn = NULL; float resultBIC = -FLT_MAX; CBNet *pResultBNet = NULL; intVector resultOrder; pEvidencesVector pEv(m_Vector_pEvidences.size(), NULL ); CModelDomain *pMD = m_pGrModel->GetModelDomain(); int nnodes = m_pGrModel->GetNumberOfNodes(); nodeTypeVector varTypes; pMD->GetVariableTypes(&varTypes); intVector varAss( pMD->GetVariableAssociations(), pMD->GetVariableAssociations() + nnodes ); intVector currentAssociation(nnodes); intVector currentObsNodes(nnodes); int i; for( i = 0; i < nnodes; i++ ) { currentObsNodes[i] = i; } CGraph *pGraph = CGraph::Create(nnodes, NULL, NULL, NULL); CBNet *pBNet; int lineSz = int( nnodes * ( nnodes - 1 ) / 2 ); intVecVector connect; intVector indexes(lineSz, 0); int startNode, endNode; int ind; for( ind = 0; ind < lineSz ; ) { if( indexes[ind] == 1 ) { FindNodesByNumber(&startNode, &endNode, nnodes, ind); pGraph->RemoveEdge(startNode, endNode ); indexes[ind] = 0; ind++; } else { FindNodesByNumber(&startNode, &endNode, nnodes, ind); pGraph->AddEdge(startNode, endNode, 1 ); indexes[ind] = 1; ind = 0; connect.clear(); pGraph->GetConnectivityComponents(&connect); if( connect.size() == 1 ) { do { CGraph *pCopyGraph = CGraph::Copy(pGraph); int j; for( j = 0; j < nnodes; j++ ) { currentAssociation[j] = varAss[currentObsNodes[j]]; } pBNet = CBNet::Create(nnodes, varTypes, currentAssociation, pCopyGraph); pBNet->AllocFactors(); for( j = 0; j < nnodes; j++ ) { pBNet->AllocFactor( j ); pBNet->GetFactor(j)->CreateAllNecessaryMatrices(); } int dimOfModel = DimOfModel(pBNet); int k; for( k = 0; k < pEv.size(); k++ ) { valueVector vls; m_Vector_pEvidences[k]->GetRawData(&vls); pEv[k] = CEvidence::Create( pBNet->GetModelDomain(),currentObsNodes, vls ); } pLearn = CEMLearningEngine::Create(pBNet); pLearn->SetData(pEv.size(), &pEv.front()); pLearn->Learn(); int nsteps; const float *score; pLearn->GetCriterionValue(&nsteps, &score); float log_lik = score[nsteps-1]; float BIC = log_lik - 0.5f*float( dimOfModel*log(float(pEv.size())) ); if( BIC >= resultBIC ) { delete pResultBNet; resultBIC = BIC; m_critValue.push_back(BIC); pResultBNet = pBNet; resultOrder.assign( currentObsNodes.begin(), currentObsNodes.end() ); } else { delete pBNet; } for( k = 0; k < pEv.size(); k++ ) { delete pEv[k]; } delete pLearn; }while(std::next_permutation(currentObsNodes.begin(), currentObsNodes.end())); } } } delete pGraph; m_pResultGrModel = pResultBNet; m_resultRenaming.assign(resultOrder.begin(), resultOrder.end()); }