void result_show(int point[][TAKE]) { int i, j, k; int deg[POINT_NUM][TAKE]; int sum[POINT_NUM]; double scr[TAKE] = {0.0}; //---- 配列の初期化 for( k = POINT_MIN; k <= POINT_MAX; k++ ) { sum[k] = 0; for( j = 0; j < TAKE; j++ ) { deg[k][j] = 0; } } //---- 役ごとの集計 for ( i = 0; i < Trial; i++ ) { for ( j = 0; j < TAKE; j++ ) { switch( point[i][j] ) { case P9: deg[9][j]++; break; case P8: deg[8][j]++; break; case P7: deg[7][j]++; break; case P6: deg[6][j]++; break; case P5: deg[5][j]++; break; case P4: deg[4][j]++; break; case P3: deg[3][j]++; break; case P2: deg[2][j]++; break; case P1: deg[1][j]++; break; case P0: deg[0][j]++; break; default : break; } } } //---- 全テイクでの役の総数 for( k = POINT_MIN; k <= POINT_MAX; k++ ) { for( j = 0; j < TAKE; j++ ) { sum[k] += deg[k][j]; scr[j] += deg[k][j] * Hand_Value[k]; } } //---- 結果テーブルの表示 #ifdef RICH result_table(deg, sum, scr); #else result_csv(deg, sum, scr); #endif }
std::vector<EdgeWeight> operator()(const DataFacadeT &facade, const std::vector<PhantomNode> &phantom_nodes, const std::vector<std::size_t> &source_indices, const std::vector<std::size_t> &target_indices) const { const auto number_of_sources = source_indices.empty() ? phantom_nodes.size() : source_indices.size(); const auto number_of_targets = target_indices.empty() ? phantom_nodes.size() : target_indices.size(); const auto number_of_entries = number_of_sources * number_of_targets; std::vector<EdgeWeight> result_table(number_of_entries, std::numeric_limits<EdgeWeight>::max()); engine_working_data.InitializeOrClearFirstThreadLocalStorage(facade.GetNumberOfNodes()); QueryHeap &query_heap = *(engine_working_data.forward_heap_1); SearchSpaceWithBuckets search_space_with_buckets; unsigned column_idx = 0; const auto search_target_phantom = [&](const PhantomNode &phantom) { query_heap.Clear(); // insert target(s) at weight 0 if (phantom.forward_segment_id.enabled) { query_heap.Insert(phantom.forward_segment_id.id, phantom.GetForwardWeightPlusOffset(), phantom.forward_segment_id.id); } if (phantom.reverse_segment_id.enabled) { query_heap.Insert(phantom.reverse_segment_id.id, phantom.GetReverseWeightPlusOffset(), phantom.reverse_segment_id.id); } // explore search space while (!query_heap.Empty()) { BackwardRoutingStep(facade, column_idx, query_heap, search_space_with_buckets); } ++column_idx; }; // for each source do forward search unsigned row_idx = 0; const auto search_source_phantom = [&](const PhantomNode &phantom) { query_heap.Clear(); // insert target(s) at weight 0 if (phantom.forward_segment_id.enabled) { query_heap.Insert(phantom.forward_segment_id.id, -phantom.GetForwardWeightPlusOffset(), phantom.forward_segment_id.id); } if (phantom.reverse_segment_id.enabled) { query_heap.Insert(phantom.reverse_segment_id.id, -phantom.GetReverseWeightPlusOffset(), phantom.reverse_segment_id.id); } // explore search space while (!query_heap.Empty()) { ForwardRoutingStep(facade, row_idx, number_of_targets, query_heap, search_space_with_buckets, result_table); } ++row_idx; }; if (target_indices.empty()) { for (const auto &phantom : phantom_nodes) { search_target_phantom(phantom); } } else { for (const auto index : target_indices) { const auto &phantom = phantom_nodes[index]; search_target_phantom(phantom); } } if (source_indices.empty()) { for (const auto &phantom : phantom_nodes) { search_source_phantom(phantom); } } else { for (const auto index : source_indices) { const auto &phantom = phantom_nodes[index]; search_source_phantom(phantom); } } return result_table; }