//------------------------------------------------------------------------ virtual void on_idle() { bool redraw = false; if(m_rotate_polygon.status()) { m_polygon_angle.value(m_polygon_angle.value() + 0.5); if(m_polygon_angle.value() >= 180.0) { m_polygon_angle.value(m_polygon_angle.value() - 360.0); } redraw = true; } if(m_rotate_pattern.status()) { m_pattern_angle.value(m_pattern_angle.value() - 0.5); if(m_pattern_angle.value() <= -180.0) { m_pattern_angle.value(m_pattern_angle.value() + 360.0); } generate_pattern(); redraw = true; } if(redraw) force_redraw(); }
// Run: Logic Sampling (a.k.a. Rejection Sampling) return_type operator()( std::vector<std::pair<vertex_type, int>> const& condition, int const generate_sample_num = 10000 ) { // パターン作る(generate_pattern) auto const generated_patterns = generate_pattern(generate_sample_num, condition); // 数え上げを行う rejection_sampling::return_type result; for(auto const node : graph_.vertex_list()) { bn::matrix_type mat(1, node->selectable_num, 0.0); for(auto const& pattern : generated_patterns) { mat[0][pattern.at(node)] += 1.0; } // 全要素をパターン数で割る for(std::size_t i = 0; i < node->selectable_num; ++i) { mat[0][i] /= generated_patterns.size(); } result[node] = std::move(mat); } return result; }
//------------------------------------------------------------------------ virtual void on_ctrl_change() { if(m_rotate_polygon.status() || m_rotate_pattern.status()) { wait_mode(false); } else { wait_mode(true); } generate_pattern(); force_redraw(); }
//------------------------------------------------------------------------ virtual void on_init() { m_polygon_cx = initial_width() / 2.0; m_polygon_cy = initial_height() / 2.0; generate_pattern(); }