Introduction
This article introduces the Comprehensive DPS model. The model takes into account of:
 Energy gained from taking damage
 Energy wasted when fainting
when calculating a Pokemon's DPS. Inspired by this work, I have improved the DPS model and made several applications:
Notation
We are given two input variables:
 $x$: the energy left of the Pokemon when the battle ends
 $y$: the DPS of the enemy
The following parameters are from the Game Master file or calculated by the damage formula:
 $FDmg$: the Damage per use of the fast move
 $CDmg$: the Damage per use of the charge move
 $FE$: the Energy gained per use of the fast move, positive
 $CE$: the Energy used per use of the charge move, positive
 $FDur$: the Duration of the fast move in seconds
 $CDur$: the Duration of the charge move in seconds
 $CDWS$: the Damage Window Start of the charge move in seconds
 $Def$: the current Defense stat of the subject Pokemon
 $HP$: the effective HP of the subject Pokemon
We further define:
 $FDPS$: the DPS of a fast move, which equals to $\frac { FDmg }{ FDur } $
 $FEPS$: the EPS of a fast move, which equals to $\frac { FE }{ FDur } $
 $CDPS$: the DPS of a charge move, which equals to $\frac { CDmg }{ CDur } $
 $CEPS$: the EPS of a charge move, which equals to $\frac { CE }{ CDur } $
Our metrics of interest are:
 $DPS_{0}$: the Simple Cycle DPS
 $DPS$: the Comprehensive DPS
Formula
DPS Theory
Assumptions
Aside from assumed game mechanics (e.g., damage is converted to energy at a ratio of $0.5$), the Comprehensive DPS model makes the following assumptions:
$FDPS < CDPS$
This is almost always true, as it is the very incentive to use charge move. There are some exceptions though. For example, when a Confusion/Low Sweep user battles against Gengar, spamming fast move yields higher DPS. One could alleviate the issue by simply taking the maximum of $FDPS$ and $DPS$.
x and y are independent variables
This implies that the enemy's DPS ($y$) is steady and independent of our DPS. This isn't always true in solo gym battles or shortman raids, where if you hit the enemy harder, the enemy gets charged energy faster and hits you with more charge moves in return. The dynamics in such cases are better modeled by a simulator; Comprehensive DPS best models populous PvE battles.
No time is wasted
While the Pokemon is on field, it is either in fast move cooldown or in charge move cooldown. It never sits idle.
Derivation
Define:
 $n$: the total number of fast moves used by the Pokemon in the battle
 $m$: the total number of charge moves used by the Pokemon in the battle
 $T$: the duration of the battle
Since the Pokemon never sits idles, we have:
$$ n \cdot FDur + m \cdot CDur = T $$By the conservation of energy, we have:
$$ n \cdot FE + 0.5 HP = m \cdot CE + x $$For onebar charge moves, to account for overcharge, we adjust $CE$ by treating it as if it requires more energy to fire. The overcharge energy results from fast move overcharging (on average $0.5 FE$ per cycle) and losing the energy from damage before the energy actually gets used ($CDWS$ since charge move activation):
$$ CE' = CE + 0.5 FE + 0.5 y \cdot CDWS $$Solve the above linear system for $n$ and $m$:
$$ n = \frac { T \cdot CE + CDur \cdot (x  0.5 HP) }{ FDur \cdot CE + CDur \cdot FE } $$ $$ m = \frac { T \cdot FE  FDur \cdot (x  0.5 HP) }{ FDur \cdot CE + CDur \cdot FE } $$Last but not least:
$$ T = \frac { HP }{ y } $$Finally, by the definition of DPS (total damage over time):
$$ DPS = \frac { n \cdot FDmg + m \cdot CDmg } { T } $$ $$ = ... $$ $$ = DPS_{0} + \frac{ CDPS  FDPS } { CEPS + FEPS } \cdot (0.5  \frac{ x }{ HP }) \cdot y $$Relationship with Simple Cycle DPS
How does the Comprehensive DPS ($DPS$) relate to the traditional Simple Cycle DPS ($DPS_{0}$)?
Recall that:
$$ DPS = DPS_{0} + \frac{ CDPS  FDPS } { CEPS + FEPS } \cdot (0.5  \frac{ x }{ HP }) \cdot y $$Some implications:
 When $y = 0$ (the enemy does not deal damage; the battle lasts forever), $DPS = DPS_{0}$.
 Denote the term $$ \frac{ CDPS  FDPS } { CEPS + FEPS } $$ as $EE$ ("Energy Efficiency"). By assumption, $CDPS > FDPS$, therefore $EE > 0$.

Since $y > 0$ and $EE > 0$, the relationship between $DPS$ and $DPS_{0}$ depends only on the sign of $(0.5 HP  x)$:
 When $x > 0.5 HP$ (more energy is wasted than gained from damage), $DPS < DPS_{0}$
 When $x < 0.5 HP$ (less energy is wasted than gained from damage), $DPS > DPS_{0}$
Application
Comprehensive DPS Spreadsheet
When making a DPS spreadsheet, we want to compute the average value of $DPS(x,y)$ when $x$ and $y$ take different values. To do this, we need to make two more assumptions:
x and y are independent of each other
This is expected in the general sense (all possible matchups). The specific the matchup is, however, the more likely that $x$ correlates with $y$. Again, Comprehensive DPS evaluates the "general performance"; for very specific matchups, it is better to consult a simulator.
All other terms don't depend on x or y
For multibar moves, this holds. For onebar moves, however, since we apply punishment to $CE$, $CEPS$ depends on $y$. That said, the relative error is minimal, so we can live by.
With all said, we have:
$$ E[DPS(x,y)] = DPS(E[x], E[y]) $$Then the next question is how to find $E[x]$ and $E[y]$. Basing on empirical simulation data, the following formulas are used in a neutral setting (against a generic enemy):
$$ \begin{cases} E[x] = 0.5 CE + 0.5 FE \\ E[y] = \frac { 900 } { Def } \end{cases} $$In a specific setting (when the enemy is specified), some more sophisticated formulas are used:
$$ \begin{cases} E[x] = 0.5 CE + 0.5 FE + 0.5 \frac{ \lambda \cdot FDmg_{enemy} + CDmg_{enemy} } { \lambda + 1 } \\ E[y] = \frac{ \lambda \cdot FDmg_{enemy} + CDmg_{enemy} } { \lambda \cdot (FDur_{enemy} + 2) + CDur_{enemy} + 2 } \end{cases} $$where:
 $\lambda = 3$ if the enemy has onebar charge move
 $\lambda = 1.5$ if the enemy has twobar charge move
 $\lambda = 1$ if the enemy has threebar charge move
On an extra note, the damage formula in DPS spreadsheet doesn't use $floor() + 1$; instead, it adds $0.5$ after the fraction term $(0.5 \cdot \frac{Atk}{Def} \cdot Power \cdot Multipliers)$.