void plot_t::analyze() { if ( sim -> is_canceled() ) return; if ( dps_plot_stat_str.empty() ) return; analyze_stats(); if ( sim -> reforge_plot_output_file_str.empty() ) { sim -> errorf( "No reforge plot output file specified.\n" ); return; } io::cfile file( sim -> reforge_plot_output_file_str, "w" ); if ( ! file ) { sim -> errorf( "Unable to open output file '%s' . \n", sim -> reforge_plot_output_file_str.c_str() ); return; } for ( size_t i = 0; i < sim -> player_list.size(); ++i ) { player_t* p = sim -> player_list[ i ]; if ( p -> quiet ) continue; util::fprintf( file, "%s Plot Results:\n", p -> name_str.c_str() ); for ( stat_e j = STAT_NONE; j < STAT_MAX; j++ ) { if ( sim -> is_canceled() ) break; if ( ! is_plot_stat( sim, j ) ) continue; current_plot_stat = j; util::fprintf( file, "%s, DPS, DPS-Error\n", util::stat_type_string( j ) ); for ( size_t k = 0; k < p -> dps_plot_data[ j ].size(); k++ ) { util::fprintf( file, "%f, ", p -> dps_plot_data[ j ][ k ].plot_step ); util::fprintf( file, "%f, ", p -> dps_plot_data[ j ][ k ].value ); util::fprintf( file, "%f\n", p -> dps_plot_data[ j ][ k ].error ); } util::fprintf( file, "\n" ); } } }
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 plot_t::analyze_stats() { if ( dps_plot_stat_str.empty() ) return; int num_players = ( int ) sim -> players_by_name.size(); if ( num_players == 0 ) return; remaining_plot_stats = 0; for ( int i=0; i < STAT_MAX; i++ ) if ( is_plot_stat( sim, i ) ) remaining_plot_stats++; num_plot_stats = remaining_plot_stats; for ( int i=0; i < STAT_MAX; i++ ) { if ( sim -> canceled ) break; if ( ! is_plot_stat( sim, i ) ) continue; current_plot_stat = i; if ( sim -> report_progress ) { util_t::fprintf( stdout, "\nGenerating DPS Plot for %s...\n", util_t::stat_type_string( i ) ); fflush( stdout ); } remaining_plot_points = dps_plot_points; int start, end; if ( dps_plot_positive ) { start = 0; end = dps_plot_points; } else { start = - dps_plot_points / 2; end = - start; } for ( int j = start; j <= end; j++ ) { if ( sim -> canceled ) break; sim_t* delta_sim=0; if ( j != 0 ) { delta_sim = new sim_t( sim ); if ( dps_plot_iterations > 0 ) delta_sim -> iterations = dps_plot_iterations; delta_sim -> enchant.add_stat( i, j * dps_plot_step ); delta_sim -> execute(); if ( dps_plot_debug ) { util_t::fprintf( sim -> output_file, "Stat=%s Point=%d\n", util_t::stat_type_string( i ), j ); report_t::print_text( sim -> output_file, delta_sim, true ); } } for ( int k=0; k < num_players; k++ ) { player_t* p = sim -> players_by_name[ k ]; if ( p -> scales_with[ i ] <= 0 ) continue; if ( delta_sim ) { player_t* delta_p = delta_sim -> find_player( p -> name() ); p -> dps_plot_data[ i ].push_back( delta_p -> dps.mean ); } else { p -> dps_plot_data[ i ].push_back( p -> dps.mean ); } } if ( delta_sim ) { delete delta_sim; delta_sim = 0; remaining_plot_points--; } } remaining_plot_stats--; } }
void plot_t::analyze_stats() { if ( dps_plot_stat_str.empty() ) return; size_t num_players = sim -> players_by_name.size(); if ( num_players == 0 ) return; remaining_plot_stats = 0; for ( stat_e i = STAT_NONE; i < STAT_MAX; i++ ) if ( is_plot_stat( sim, i ) ) remaining_plot_stats++; num_plot_stats = remaining_plot_stats; for ( stat_e i = STAT_NONE; i < STAT_MAX; i++ ) { if ( sim -> is_canceled() ) break; if ( ! is_plot_stat( sim, i ) ) continue; current_plot_stat = i; if ( sim -> report_progress ) { util::fprintf( stdout, "\nGenerating DPS Plot for %s...\n", util::stat_type_string( i ) ); fflush( stdout ); } remaining_plot_points = dps_plot_points; int start, end; if ( dps_plot_positive ) { start = 0; end = dps_plot_points; } else if ( dps_plot_negative ) { start = -dps_plot_points; end = 0; } else { start = - dps_plot_points / 2; end = - start; } for ( int j = start; j <= end; j++ ) { if ( sim -> is_canceled() ) break; sim_t* delta_sim = 0; if ( j != 0 ) { delta_sim = new sim_t( sim ); if ( dps_plot_iterations > 0 ) delta_sim -> iterations = dps_plot_iterations; delta_sim -> enchant.add_stat( i, j * dps_plot_step ); if ( sim -> report_progress ) { std::stringstream stat_name; stat_name.width( 12 ); stat_name << std::left << std::string( util::stat_type_abbrev( i ) ) + ":"; delta_sim -> sim_phase_str = util::to_string( j * dps_plot_step ) + " " + stat_name.str(); } delta_sim -> execute(); if ( dps_plot_debug ) { sim -> out_debug.raw().printf( "Stat=%s Point=%d\n", util::stat_type_string( i ), j ); if ( sim -> output_file_str.empty() ) report::print_text( stdout, delta_sim, true ); else { io::cfile report_f( sim -> output_file_str, "a" ); if ( report_f ) report::print_text( report_f, delta_sim, true ); } } } for ( size_t k = 0; k < num_players; k++ ) { player_t* p = sim -> players_by_name[ k ]; if ( ! p -> scales_with[ i ] ) continue; plot_data_t data; if ( delta_sim ) { player_t* delta_p = delta_sim -> find_player( p -> name() ); data.value = delta_p -> scales_over().value; data.error = delta_p -> scales_over().stddev * delta_sim -> confidence_estimator; } else { data.value = p -> scales_over().value; data.error = p -> scales_over().stddev * sim -> confidence_estimator; } data.plot_step = j * dps_plot_step; p -> dps_plot_data[ i ].push_back( data ); } if ( delta_sim ) { delete delta_sim; delta_sim = 0; remaining_plot_points--; } } remaining_plot_stats--; } }
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; } } }