Esempio n. 1
0
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" );
    }
  }
}
Esempio n. 2
0
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;
    }
  }
}
Esempio n. 3
0
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--;
  }
}
Esempio n. 4
0
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--;
  }
}
Esempio n. 5
0
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;
    }
  }
}