Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,6 @@ setup_target(
src/Battle/Pokemon/ManagePokemonState.cpp
src/Battle/Setup/BattleStateSetup.cpp
src/Battle/Setup/EmplaceTagFromEnum.cpp
src/Battle/Setup/MoveStateSetup.cpp
src/Battle/Setup/PokemonStateSetup.cpp
src/Battle/Setup/SideStateSetup.cpp
src/Battle/Side/ManageSideState.cpp
Expand All @@ -205,7 +204,6 @@ setup_target(
src/Pokedex/Setup/GetMoveBuild.cpp
src/Pokedex/Setup/GetSpeciesBuild.cpp
src/Pokedex/Setup/ItemDexDataSetup.cpp
src/Pokedex/Setup/MoveDexDataSetup.cpp
src/Pokedex/Setup/SpeciesDexDataSetup.cpp
src/SimulateTurn/CalcDamageSpecifics.cpp
src/SimulateTurn/ManageActionQueue.cpp
Expand Down
1 change: 0 additions & 1 deletion benchmarks/Benchmarks.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,6 @@ struct CreateSingleBattleSimulation : BenchmarkInputHolder {

struct CreateDoubleBattleSimulation : BenchmarkInputHolder {
inline static const std::vector<std::string> TAGS = {"DoubleBattle"};
static constexpr types::entityIndex MAX_INPUTS = 1U << 13U;
static Simulation run(types::rngState&, Pokedex& pokedex) { return Simulation{pokedex, BattleFormat::DOUBLES}; }
};

Expand Down
59 changes: 30 additions & 29 deletions benchmarks/RandomInputs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ struct Random {
};

template <typename T>
static auto pickFromList(const T& list, types::rngState rngState) {
static auto pickFromList(const T& list, types::rngState& rngState) {
return list[internal::nextBoundedRandomValue(rngState, (types::rngResult)list.size())];
}

Expand Down Expand Up @@ -149,34 +149,34 @@ struct Random {
SideDecision p1Decision{PlayerSideId::P1};
SideDecision p2Decision{PlayerSideId::P2};
if (simulation.isBattleFormat(BattleFormat::SINGLES)) {
SlotDecision p1SlotDecision{Slot::P1A, Slot::P2A};
SlotDecision p2SlotDecision{Slot::P2A, Slot::P1A};
p1SlotDecision.moveChoice = pickFromList(battle.sides.p1().team[0].moves, rngState).name;
p2SlotDecision.moveChoice = pickFromList(battle.sides.p2().team[0].moves, rngState).name;
MoveDecision p1MoveDecision{Slot::P1A, Slot::P2A};
MoveDecision p2MoveDecision{Slot::P2A, Slot::P1A};
p1MoveDecision.move = pickFromList(battle.sides.p1().team[0].moves, rngState).name;
p2MoveDecision.move = pickFromList(battle.sides.p2().team[0].moves, rngState).name;

p1Decision.decisions = types::sideSlots<SlotDecision>{p1SlotDecision};
p2Decision.decisions = types::sideSlots<SlotDecision>{p2SlotDecision};
p1Decision.decisions = types::slotDecisions{p1MoveDecision};
p2Decision.decisions = types::slotDecisions{p2MoveDecision};
}
else {
SlotDecision p1ASlotDecision{Slot::P1A, pickFromList(std::vector{Slot::P1B, Slot::P2A, Slot::P2B}, rngState)};
SlotDecision p1BSlotDecision{Slot::P1B, pickFromList(std::vector{Slot::P1A, Slot::P2A, Slot::P2B}, rngState)};
SlotDecision p2ASlotDecision{Slot::P2A, pickFromList(std::vector{Slot::P2B, Slot::P1A, Slot::P1B}, rngState)};
SlotDecision p2BSlotDecision{Slot::P2B, pickFromList(std::vector{Slot::P2A, Slot::P1A, Slot::P1B}, rngState)};
p1ASlotDecision.moveChoice = pickFromList(battle.sides.p1().team[0].moves, rngState).name;
p1BSlotDecision.moveChoice = pickFromList(battle.sides.p1().team[1].moves, rngState).name;
p2ASlotDecision.moveChoice = pickFromList(battle.sides.p2().team[0].moves, rngState).name;
p2BSlotDecision.moveChoice = pickFromList(battle.sides.p2().team[1].moves, rngState).name;

p1Decision.decisions = types::slotDecisions{p1ASlotDecision, p1BSlotDecision};
p2Decision.decisions = types::slotDecisions{p2ASlotDecision, p2BSlotDecision};
MoveDecision p1AMoveDecision{Slot::P1A, pickFromList(std::vector{Slot::P1B, Slot::P2A, Slot::P2B}, rngState)};
MoveDecision p1BMoveDecision{Slot::P1B, pickFromList(std::vector{Slot::P1A, Slot::P2A, Slot::P2B}, rngState)};
MoveDecision p2AMoveDecision{Slot::P2A, pickFromList(std::vector{Slot::P2B, Slot::P1A, Slot::P1B}, rngState)};
MoveDecision p2BMoveDecision{Slot::P2B, pickFromList(std::vector{Slot::P2A, Slot::P1A, Slot::P1B}, rngState)};
p1AMoveDecision.move = pickFromList(battle.sides.p1().team[0].moves, rngState).name;
p1BMoveDecision.move = pickFromList(battle.sides.p1().team[1].moves, rngState).name;
p2AMoveDecision.move = pickFromList(battle.sides.p2().team[0].moves, rngState).name;
p2BMoveDecision.move = pickFromList(battle.sides.p2().team[1].moves, rngState).name;

p1Decision.decisions = types::slotDecisions{p1AMoveDecision, p1BMoveDecision};
p2Decision.decisions = types::slotDecisions{p2AMoveDecision, p2BMoveDecision};
}

TurnDecisionInfo turnDecision{p1Decision, p2Decision};

for (auto& sideDecision : turnDecision) {
for (auto& slotDecision : sideDecision.decisions.get<types::slotDecisions>()) {
if (simulation.pokedex().moveHas<move::tags::Self>(slotDecision.moveChoice.value())) {
slotDecision.targetSlot = slotDecision.sourceSlot;
if (simulation.pokedex().moveHas<move::tags::Self>(slotDecision.get<MoveDecision>().move)) {
slotDecision.get<MoveDecision>().targetSlot = slotDecision.sourceSlot();
}
}
}
Expand Down Expand Up @@ -307,40 +307,41 @@ struct Random {
}
}

pokedex.loadForBattleInfo(battleInfoList);
simulation.createInitialStates(battleInfoList);
updateAllStats(simulation);
}
};

public:
struct AssignSimulateTurnOneBattleOneInput : Assign<tags::SimulateTurn, true, true> {
static constexpr types::entityIndex MAX_INPUTS = 1U << 14U;
static constexpr types::entityIndex MAX_INPUTS = 1U << 16U;
};
struct AssignSimulateTurnOneBattleManyInputs : Assign<tags::SimulateTurn, true, false> {
static constexpr types::entityIndex MAX_INPUTS = 1U << 14U;
static constexpr types::entityIndex MAX_INPUTS = 1U << 16U;
};
struct AssignSimulateTurnManyBattlesManyInputs : Assign<tags::SimulateTurn, false, false> {
static constexpr types::entityIndex MAX_INPUTS = 1U << 14U;
static constexpr types::entityIndex MAX_INPUTS = 1U << 16U;
};

struct AssignCalcDamageOneBattleOneInput : Assign<tags::CalculateDamage, true, true> {
static constexpr types::entityIndex MAX_INPUTS = 1U << 14U;
static constexpr types::entityIndex MAX_INPUTS = 1U << 16U;
};
struct AssignCalcDamageOneBattleManyInputs : Assign<tags::CalculateDamage, true, false> {
static constexpr types::entityIndex MAX_INPUTS = 1U << 14U;
static constexpr types::entityIndex MAX_INPUTS = 1U << 16U;
};
struct AssignCalcDamageManyBattlesManyInputs : Assign<tags::CalculateDamage, false, false> {
static constexpr types::entityIndex MAX_INPUTS = 1U << 14U;
static constexpr types::entityIndex MAX_INPUTS = 1U << 16U;
};

struct AssignAnalyzeEffectOneBattleOneInput : Assign<tags::AnalyzeEffect, true, true> {
static constexpr types::entityIndex MAX_INPUTS = 1U << 13U;
static constexpr types::entityIndex MAX_INPUTS = 1U << 15U;
};
struct AssignAnalyzeEffectOneBattleManyInputs : Assign<tags::AnalyzeEffect, true, false> {
static constexpr types::entityIndex MAX_INPUTS = 1U << 13U;
static constexpr types::entityIndex MAX_INPUTS = 1U << 15U;
};
struct AssignAnalyzeEffectManyBattlesManyInputs : Assign<tags::AnalyzeEffect, false, false> {
static constexpr types::entityIndex MAX_INPUTS = 1U << 13U;
static constexpr types::entityIndex MAX_INPUTS = 1U << 15U;
};
};
} // namespace
Expand Down
34 changes: 15 additions & 19 deletions benchmarks/VerticalSlices.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,13 +101,11 @@ struct VerticalSlice {
battleCreationInfo.runWithSimulateTurn = true;
SideDecision p1Decision{PlayerSideId::P1};
SideDecision p2Decision{PlayerSideId::P2};
SlotDecision p1SlotDecision{Slot::P1A, Slot::P2A};
SlotDecision p2SlotDecision{Slot::P2A, Slot::P1A};
MoveDecision p1MoveDecision{Slot::P1A, Slot::P2A, dex::Move::KNOCK_OFF};
MoveDecision p2MoveDecision{Slot::P2A, Slot::P1A, dex::Move::THUNDERBOLT};

p1SlotDecision.moveChoice = dex::Move::KNOCK_OFF;
p1Decision.decisions = types::sideSlots<SlotDecision>{p1SlotDecision};
p2SlotDecision.moveChoice = dex::Move::THUNDERBOLT;
p2Decision.decisions = types::sideSlots<SlotDecision>{p2SlotDecision};
p1Decision.decisions = types::slotDecisions{p1MoveDecision};
p2Decision.decisions = types::slotDecisions{p2MoveDecision};
battleCreationInfo.decisionsToSimulate = {{p1Decision, p2Decision}};

simulation.createInitialStates({inputCount, battleCreationInfo});
Expand All @@ -124,17 +122,13 @@ struct VerticalSlice {
battleCreationInfo.runWithSimulateTurn = true;
SideDecision p1Decision{PlayerSideId::P1};
SideDecision p2Decision{PlayerSideId::P2};
SlotDecision p1ASlotDecision{Slot::P1A, Slot::P2B};
SlotDecision p1BSlotDecision{Slot::P1B, Slot::P2A};
SlotDecision p2ASlotDecision{Slot::P2A, Slot::P1B};
SlotDecision p2BSlotDecision{Slot::P2B, Slot::P2B};

p1ASlotDecision.moveChoice = dex::Move::MOONBLAST;
p1BSlotDecision.moveChoice = dex::Move::WILL_O_WISP;
p1Decision.decisions = types::sideSlots<SlotDecision>{p1ASlotDecision, p1BSlotDecision};
p2ASlotDecision.moveChoice = dex::Move::KNOCK_OFF;
p2BSlotDecision.moveChoice = dex::Move::QUIVER_DANCE;
p2Decision.decisions = types::sideSlots<SlotDecision>{p2ASlotDecision, p2BSlotDecision};
MoveDecision p1AMoveDecision{Slot::P1A, Slot::P2B, dex::Move::MOONBLAST};
MoveDecision p1BMoveDecision{Slot::P1B, Slot::P2A, dex::Move::WILL_O_WISP};
MoveDecision p2AMoveDecision{Slot::P2A, Slot::P1B, dex::Move::KNOCK_OFF};
MoveDecision p2BMoveDecision{Slot::P2B, Slot::P2B, dex::Move::QUIVER_DANCE};

p1Decision.decisions = types::slotDecisions{p1AMoveDecision, p1BMoveDecision};
p2Decision.decisions = types::slotDecisions{p2AMoveDecision, p2BMoveDecision};
battleCreationInfo.decisionsToSimulate = {{p1Decision, p2Decision}};

simulation.createInitialStates({inputCount, battleCreationInfo});
Expand All @@ -160,7 +154,6 @@ struct VerticalSlice {

struct AssignAnalyzeEffectSingleBattleInputs : BenchmarkInputHolder {
inline static const std::vector<std::string> TAGS = {"AnalyzeEffect", "VerticalSlice1"};
static constexpr types::entityIndex MAX_INPUTS = 1U << 14U;
static void run(types::rngState&, types::entityIndex inputCount, Simulation& simulation, Pokedex& pokedex) {
static BattleCreationInfo battleCreationInfo = createSingleBattleTeam(pokedex);
pokedex.loadForBattleInfo({battleCreationInfo});
Expand All @@ -187,8 +180,11 @@ BENCHMARK_CASE(
BENCHMARK_CASE(
CreatePokedex, CreateDoubleBattleSimulation, ChooseMonteCarloOptions,
VerticalSlice::AssignSimulateTurnDoubleBattleInputs)
struct ChooseRandomDoublesBranchingOptions : ChooseRandomBranchingOptions {
static constexpr types::entityIndex MAX_INPUTS = 1U << 13U;
};
BENCHMARK_CASE(
CreatePokedex, CreateDoubleBattleSimulation, ChooseRandomBranchingOptions,
CreatePokedex, CreateDoubleBattleSimulation, ChooseRandomDoublesBranchingOptions,
VerticalSlice::AssignSimulateTurnDoubleBattleInputs)

BENCHMARK_CASE(
Expand Down
Loading
Loading