It's All About TDO
Our starting point is an important intuition: a good PvP Pokémon should beat another Pokémon before beaten. What metric should we use to measure such ability? The answer is TDO. u/doublefelix921 first pointed out the TDO Theorem in his article:
If two Pokemon battle, the one with the higher TDO will do better every time.
That is, of course, without considering typing and effectiveness. But what exactly does the TDO refer to? Literally, it means Total Damage Output, but what kind of opponent do we use to calculate it? In fact, such TDO is calculated against a common third party. The TDO Theorem can, therefore, be rephrased as:

Let Pokémon A fight Pokémon C, and record its TDO as TDO_A;

Let Pokémon B fight Pokémon C, and record its TDO as TDO_B;

If TDO_A > TDO_B, then Pokémon A will beat Pokémon B in battle, and vice versa.
Felix provided concise proof in his article linked above. The TDO Theorem is important because it is the foundation of any spreadsheet that ranks Pokémon’s PvP viability: we only need to look at one metric. Otherwise, we would have to make an n x n table to record the battle outcome between every two Pokémon.
How We Calculate TDO
Now that we know TDO is the metric for determining PvP battle outcome, our next question is, how do we calculate TDO?
TDO can be broken down into the product of DPS (Damage Per Second) and Survival Time:
$$TDO = DPS \cdot ST$$Starting with DPS. The traditional cycle DPS formula is:
$$DPS = \frac{FDamage \cdot CEnergy + CDamage \cdot FEnergy } {FDur \cdot CEnergy + Cdur \cdot FEnergy} $$We need to modify it to fit the mechanics of PvP.
0duration Trick
Compared to raid/gym battles, Fast Attack mechanics in PvP are mostly the same. The major difference lies in Charged Attack. When you use a Charged Attack, the game initiates a sequence, referred as the "minigame". During the minigame, you tap repeatedly to power up the Charged Attack while the opponent can’t do anything other than choosing Shield or not.
The key conclusion is that varying the duration of the minigame (which equals the Charged Attack duration) does not affect the battle outcome. Therefore, we can set the duration of Charged Attack to 0. The cycle DPS formula then becomes:
$$DPS = \frac{FDamage}{FDur} + \frac{CDamage \cdot FEnergy}{FDur \cdot CEnergy} $$ $$ = FDPS + FEPS \cdot CDPE $$where $FDPS$ and $FEPS$ are the DPS and EPS of the Fast Attack and $CDPE$ is the DPE (Damage Per Energy) of the Charged Attack. These equations provide the insight that why DPE is the major metric we used to rank Charged Attacks: higher DPE yields higher DPS and hence higher TDO.
The 0duration Trick not only simplifies the DPS formula, it also offers a nice property for survival time:
Against a given common third party, a Pokémon’s survival time is in proportional to its bulk, which is the product of its Defense and HP:
$$ ST = a \cdot Defense \cdot HP $$If the Charged Attack duration is nonzero, then the survival time would depend on the number of Charged Attacks used, since each minigame would increase your effective survival time.
Modify FEPS
A Pokémon faints with some energy remained more often than not. This part of energy is wasted, while one assumption of cycle DPS model is that no energy is wasted. Therefore we need to make some tweaks to the formula. By appropriately decreasing $FEPS$, we can make the Pokémon faint with no energy remained while still using the exactly same number of Fast Attacks and Charged Attacks:
$$ModFEPS = FEPS  \frac{EnergyWasted}{ST}$$The choosing of the value of $EnergyWasted$ remained an open question. For now, we may use half of the Charged Attack Energy since we are evaluating the Pokémon in an average sense:
$$EnergyWasted = 0.5 \cdot CEnergy$$Discount Charged Attack Damage
The last thing we need to account for is the two Protect Shields by the opponent. Here we assume that the team consists of 3 identical Pokémon, which is our subject of interest. Then we account for the use of the two Shields by discounting the Charged Attack damage:
$$ModCDamage = CDamage \cdot \frac{n2}{n} $$where $n$ is the number of Charged attacks used by the team throughout the match. To get $n$, we need the Total Energy Gained throughout the match, $TEG$:
$$TEG = 3 \cdot ST \cdot FEPS $$The above improvement by Ryan is using a variable $TEG$ instead of a constant. This rewards high EPS Fast Attacks. Finally:
$$n = \frac{TEG  3 \cdot EnergyWasted}{CEnergy} $$With everything ready, we can compute the TDO of every Pokémon. Our Comprehensive DPS/TDO spreadsheet does it for you automatically: click on PvP Mode button, and sort the results by TDO.
TDO Limitations
We have the TDO of all Pokémon with all combinations of the movesets. Do the top 3 TDO Pokémon make best team ever? Not quite.
Our TDO model assumes no effectiveness. In an average sense this is reasonable, as the Pokémon with higher TDO will do better against a great variety of Pokémon. In a specific PvP battle, however, effectiveness is everything.
Every Pokémon has strength and weakness. Even the topTDO Pokémon can be easily defeated by its hard counters. Therefore, a Pokémon’s actual viability depends on the frequencies of its “breakfast” and hard counters. Such frequencies are dynamic: when Firetypes are prominent, players will tend to use more Watertypes, and then later more Grasstypes. Regarding such dynamics of the meta, we proposed a method to solve for the meta by applying Game Theory here. We are checking our calculations and will publish the results here when they are ready.
A Pokémon’s actual viability also depends on how well it handles its hard counters. We must keep in mind that a Pokémon's performance in its worst matchup may be just as important as that in its best matchup, since both are on the extreme side and you never know what you'll be fighting against. To evaluate a Pokémon's countercoverage ability, we can start by looking at the quantity and quality of its coverage moves. For example, Typhlosion’s Solar Beam can do fatal damage to its Water, Rock or Groundtype counters, making it a good Pokemon for PvP. Manual evaluating different Pokémon case by case is required.
In this article, we discussed how to evaluate a Pokémon’s PvP viability. This is done by applying modified cycle DPS formula to calculate its neutral TDO, analyzing the weights of its ideal targets and hard counters in the meta, and lastly evaluating its countercoverage ability. Evaluating individual Pokémon’s viability is the first and the most essential step in solving the PvP meta. But it is not the whole picture! Stay tuned for our next chapter on team composition.