void reforge_plot_t::analyze_stats() { if ( reforge_plot_stat_str.empty() ) return; reforge_plot_stat_indices.clear(); for ( stat_e i = STAT_NONE; i < STAT_MAX; i++ ) { if ( is_plot_stat( sim, i ) ) reforge_plot_stat_indices.push_back( i ); } if ( reforge_plot_stat_indices.empty() ) return; // Create vector of all stat_add combinations recursively std::vector<int> cur_stat_mods( reforge_plot_stat_indices.size() ); std::vector<std::vector<int>> stat_mods; generate_stat_mods( stat_mods, reforge_plot_stat_indices, 0, cur_stat_mods ); num_stat_combos = as<int>( stat_mods.size() ); if ( reforge_plot_debug ) { sim->out_debug.raw() << "Reforge Plot Stats:"; for ( size_t i = 0; i < reforge_plot_stat_indices.size(); i++ ) { sim->out_log.raw().printf( "%s%s", i ? ", " : " ", util::stat_type_string( reforge_plot_stat_indices[ i ] ) ); } sim->out_log.raw() << "\n"; sim->out_log.raw() << "Reforge Plot Stat Mods:\n"; for ( size_t i = 0; i < stat_mods.size(); i++ ) { for ( size_t j = 0; j < stat_mods[ i ].size(); j++ ) sim->out_log.raw().printf( "%s: %d ", util::stat_type_string( reforge_plot_stat_indices[ j ] ), stat_mods[ i ][ j ] ); sim->out_log.raw() << "\n"; } } for ( size_t i = 0; i < stat_mods.size(); i++ ) { if ( sim->is_canceled() ) break; std::vector<plot_data_t> delta_result( stat_mods[ i ].size() + 1 ); current_reforge_sim = new sim_t( sim ); if ( reforge_plot_iterations > 0 ) { current_reforge_sim->work_queue->init( reforge_plot_iterations ); } std::string& tmp = current_reforge_sim->sim_phase_str; for ( size_t j = 0; j < stat_mods[ i ].size(); j++ ) { stat_e stat = reforge_plot_stat_indices[ j ]; int mod = stat_mods[ i ][ j ]; current_reforge_sim->enchant.add_stat( stat, mod ); delta_result[ j ].value = mod; delta_result[ j ].error = 0; if ( sim->report_progress ) { tmp += util::to_string( mod ) + " " + util::stat_type_abbrev( stat ); if ( j < stat_mods[ i ].size() - 1 ) tmp += ","; } } if ( sim->report_progress ) { tmp += ":"; if ( tmp.length() < 23 ) tmp.append( 23 - tmp.length(), ' ' ); } current_stat_combo = as<int>( i ); current_reforge_sim->execute(); for ( player_t* player : sim->players_by_name ) { if ( current_reforge_sim ) { plot_data_t& data = delta_result[ stat_mods[ i ].size() ]; player_t* delta_p = current_reforge_sim->find_player( player->name() ); scaling_metric_data_t scaling_data = delta_p->scaling_for_metric( player->sim->scaling->scaling_metric ); data.value = scaling_data.value; data.error = scaling_data.stddev * current_reforge_sim->confidence_estimator; player->reforge_plot_data.push_back( delta_result ); } } if ( current_reforge_sim ) { delete current_reforge_sim; current_reforge_sim = nullptr; } } }
void reforge_plot_t::analyze_stats() { if ( reforge_plot_stat_str.empty() ) return; size_t num_players = sim -> players_by_name.size(); reforge_plot_stat_indices.clear(); for ( stat_e i = STAT_NONE; i < STAT_MAX; i++ ) { if ( is_plot_stat( sim, i ) ) reforge_plot_stat_indices.push_back( i ); } if ( reforge_plot_stat_indices.empty() ) return; // Create vector of all stat_add combinations recursively std::vector<int> cur_stat_mods( reforge_plot_stat_indices.size() ); std::vector<std::vector<int> > stat_mods; generate_stat_mods( stat_mods, reforge_plot_stat_indices, 0, cur_stat_mods ); num_stat_combos = as<int>( stat_mods.size() ); // Figure out if we have different multipliers for stats bool same_multiplier = true; if ( !sim -> equalize_plot_weights ) { for ( size_t i = 1; i < reforge_plot_stat_indices.size(); i++ ) { if ( util::stat_itemization_weight( reforge_plot_stat_indices[0] ) != util::stat_itemization_weight( reforge_plot_stat_indices[i] ) ) { same_multiplier = false; break; } } } // Weight the modifications by stat value, e.g., // 10 Intellect trades for 20 Crit on gems. if ( ! same_multiplier ) { for ( int i = 0; i < num_stat_combos; ++i ) { for ( size_t j = 0; j < stat_mods[ i ].size(); ++j ) stat_mods[ i ][ j ] = ( int ) ( stat_mods[ i ][ j ] * util::stat_itemization_weight( reforge_plot_stat_indices[ j ] ) ); } } if ( reforge_plot_debug ) { sim -> out_debug.raw() << "Reforge Plot Stats:"; for ( size_t i = 0; i < reforge_plot_stat_indices.size(); i++ ) { sim -> out_log.raw().printf( "%s%s", i ? ", " : " ", util::stat_type_string( reforge_plot_stat_indices[ i ] ) ); } sim -> out_log.raw() << "\n"; sim -> out_log.raw() << "Reforge Plot Stat Mods:\n"; for ( size_t i = 0; i < stat_mods.size(); i++ ) { for ( size_t j = 0; j < stat_mods[ i ].size(); j++ ) sim -> out_log.raw().printf( "%s: %d ", util::stat_type_string( reforge_plot_stat_indices[ j ] ), stat_mods[ i ][ j ] ); sim -> out_log.raw() << "\n"; } } for ( size_t i = 0; i < stat_mods.size(); i++ ) { if ( sim -> is_canceled() ) break; std::vector<plot_data_t> delta_result( stat_mods[ i ].size() + 1 ); current_reforge_sim = new sim_t( sim ); if ( reforge_plot_iterations > 0 ) current_reforge_sim -> iterations = reforge_plot_iterations; std::string& tmp = current_reforge_sim -> sim_phase_str; for ( size_t j = 0; j < stat_mods[ i ].size(); j++ ) { stat_e stat = reforge_plot_stat_indices[ j ]; int mod = stat_mods[ i ][ j ]; current_reforge_sim -> enchant.add_stat( stat, mod ); delta_result[ j ].value = mod; delta_result[ j ].error = 0; if ( sim -> report_progress ) { tmp += util::to_string( mod ) + " " + util::stat_type_abbrev( stat ); if ( j < stat_mods[ i ].size() - 1 ) tmp += ","; } } if ( sim -> report_progress ) { tmp += ":"; if ( tmp.length() < 23 ) tmp.append( 23 - tmp.length(), ' ' ); } current_stat_combo = as<int>( i ); current_reforge_sim -> execute(); for ( size_t k = 0; k < num_players; k++ ) { player_t* p = sim -> players_by_name[ k ]; if ( current_reforge_sim ) { plot_data_t& data = delta_result[ stat_mods[ i ].size() ]; player_t* delta_p = current_reforge_sim -> find_player( p -> name() ); data.value = delta_p -> scales_over().value; data.error = delta_p -> scales_over().stddev * current_reforge_sim -> confidence_estimator; p -> reforge_plot_data.push_back( delta_result ); } } if ( current_reforge_sim ) { delete current_reforge_sim; current_reforge_sim = 0; } } }