Exemplo n.º 1
0
void reforge_plot_t::generate_stat_mods(
    std::vector<std::vector<int>>& stat_mods,
    const std::vector<stat_e>& stat_indices, int cur_mod_stat,
    std::vector<int> cur_stat_mods )
{
  if ( cur_mod_stat >= (int)stat_indices.size() - 1 )
  {
    int sum = 0;
    for ( size_t i = 0; i < cur_stat_mods.size() - 1; i++ )
      sum += cur_stat_mods[ i ];

    if ( abs( sum ) > reforge_plot_amount )
      return;

    for ( size_t i = 0; i < sim->player_no_pet_list.size(); ++i )
    {
      player_t* p = sim->player_no_pet_list[ i ];
      if ( p->quiet )
        continue;
      if ( p->current.stats.get_stat( stat_indices[ cur_mod_stat ] ) - sum < 0 )
        return;
    }

    cur_stat_mods[ cur_mod_stat ] = -1 * sum;
    stat_mods.push_back( cur_stat_mods );
    return;
  }

  for ( int mod_amount = -reforge_plot_amount;
        mod_amount <= reforge_plot_amount; mod_amount += reforge_plot_step )
  {
    bool negative_stat = false;
    for ( size_t i = 0; i < sim->player_no_pet_list.size(); ++i )
    {
      player_t* p = sim->player_no_pet_list[ i ];
      if ( p->quiet )
        continue;
      if ( p->current.stats.get_stat( stat_indices[ cur_mod_stat ] ) +
               mod_amount <
           0 )
      {
        negative_stat = true;
        break;
      }
    }
    if ( negative_stat )
      continue;

    cur_stat_mods[ cur_mod_stat ] = mod_amount;
    generate_stat_mods( stat_mods, stat_indices, cur_mod_stat + 1,
                        cur_stat_mods );
  }
}
Exemplo 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;
    }
  }
}
Exemplo n.º 3
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;
    }
  }
}