Please upgrade your browser for the best possible experience.

Chrome Firefox Internet Explorer
×

Understanding Tank Theory Crafting

STAR WARS: The Old Republic > English > Classes
Understanding Tank Theory Crafting

KeyboardNinja's Avatar


KeyboardNinja
02.24.2014 , 02:25 AM | #1
One of the major problems with posts like my Ideal Tank Stat Distribution is that the work behind the final results is fairly involved, and so it is very difficult for people to verify. This results in an unfortunate dichotomy, where most people either a) trustingly accept the results and stat accordingly, or b) discard the results as altogether untrustworthy.

This post is an attempt to shed a little light on the mechanics and reasoning behind the stat optimization work performed not only by myself, but also by others in the community. This is done in the hope that a little more understanding of how the results were derived (and how they can be verified!) will go a long way toward making the work more broadly accepted. Also, it would be really nice if more people were able to bring their skepticism to bear in the form of math-checking, since errors can (and have in the past!) slip through.

This post assumes a fairly firm knowledge of algebra, and a general familiarity with probability terminology. I do highly recommend that you read Wikipedia's explanation of probability theory for some more theoretical background here, since it will make some of the derivations below a lot more intuitive. Calculus is mentioned, but not used. Ultimately, all of this does come down to multi-variable differential calculus, but we can punt before we get to that point and allow tools like Mathematica to do all the heavy lifting. At least, that's what I do…

Fundamental Survivability

The entire concept of tank optimization is based around the idea that there is a single number that can be derived for any tank based on their character sheet which scores how well on average they will perform in content. Unlike with DPS and healing, tank theory crafters have the distinct advantage in that the fundamental form of this function is extremely uncontroversial and easy to define. Healing and DPS depend on a lot of external factors (especially healing) and involve very complex prior-optimization stages to handle things like proc chains and energy levels. Tanking is simply a matter of composing conditional probabilities.

The foundation of the tanking survivability math is the following expression:

1 - (1 - defense*1)(1 - shield*absorb)(1 - dr)

In SWTOR, damage levels are computed on the receiving end via a three step process involving two separate rolls. First, the game determines whether or not a particular hit is defended. This term encompasses a number of phenomena, variously labeled as "dodge", "parry", "deflect", "miss", and so on. It's all just defense. If you defend a hit, then you take zero damage. Thus, the remainder of the expression is only interesting in the case where we don't defend.

For this reason, we don't consider defense chance directly. Instead, we consider the chance that you don't defend (which is to say, the complement of the defense probability). Another way of looking at this would be to see it as taking the average percentage of damage which is undefended. This undefended damage is then subject to the second mitigation roll: shielding. If an attack is shielded, its value is reduced not by 100% as in the case of defense, but only by the percentage of the target's absorb. We can model this in a similar fashion to defense by pretending that shielding works by first rolling the shield chance and then rolling an absorb chance and only mitigating damage if both rolls come up in the affirmative. Thus, we multiply shield by absorb and complement it in the same fashion as defense, leaving us with the percentage of damage which is neither shielded nor defended.

At this stage, we have made it past all of the RNG-based mitigation mechanisms and we are purely in the realm of static reduction. Any damage which is neither shielded nor defended (where "shielded" means "reduced by the union of shield and absorb") gets through to damage reduction. We can see damage reduction in a very similar light as defense, but slightly backwards. Whereas defense has a moderate chance to mitigate 100% of the damage, DR has a 100% chance to mitigate a moderate amount of the damage. Thus, it is the same idea, only the other way around! For that reason, we model it using the same mathematical mechanism: find the percentage of damage not eliminated by damage reduction.

We multiply all of these mitigation complements together – defense, shield/absorb and DR – to generate a final percentage value. This percentage is precisely the fraction of damage which will be taken by the target on average. It is very easy to take this value and multiply it by a given DPS value to determine the average DtPS (damage taken per second) from the perspective of the damage recipient. However, for reasons of "bigger numbers are better" psychology, we traditionally take the complement of this value rather than the direct value itself. This is why we have the leading "1 - " in the expression. This complementation results in a survivability score which increases as the fraction of damage taken decreases, which makes for a somewhat more intuitive read.

Damage Cases

Unfortunately, the above only describes a single mitigation case: the one for melee/ranged attacks. The SWTOR combat system involves not just melee/ranged attacks, but also force/tech attacks. To make things even more complex, SWTOR allows for two different damage types independent of attack type: kinetic/energy and internal/elemental. Any given ability (NPC or Player) will correspond with a single attack type and a single damage type. In theory, any attack type can be paired with any other damage type, meaning that there are four possible sorts of abilities that must pass through the combat math. In practice though, melee/ranged attacks are never paired with internal/elemental damage (despite what EC Kephess's animations imply), which means that we can safely focus on just three ability sorts: melee/ranged+kinetic/energy, force/tech+kinetic/energy and force/tech+internal/elemental.

Attack and damage type are both significant because they determine exactly which mitigation mechanisms are relevant for the incoming damage. The cases are described as follows:
  • Melee/Ranged attacks are subject to defense
  • Force/Tech attacks bypass defense but are subject to resist
  • Kinetic/Energy damage is subject to shield/absorb and armor
  • Internal/Elemental damage bypasses shields and armor, but is subject to internal resist

Be careful not to confuse "resist" with "internal resist". I didn't make up these names. I swear, this is what the game calls them! For the record, neither "resist" nor "internal resist" come from gear in any way (aside from set bonuses). In general, these attributes come from talents and passive class skills.

By using the same arguments that we did in the previous section, we can come up with a tanking score for every single one of these cases in the following way:
  • Melee/Ranged + Kinetic/Energy = 1 - (1 - defense)(1 - shield*absorb)(1 - armor)
  • Force/Tech + Kinetic/Energy = 1 - (1 - resist)(1 - shield*absorb)(1 - armor)
  • Force/Tech + Internal/Elemental = 1 - (1 - resist)(1 - internalresist)

We set out trying to make a single number, a single score which represented how good a hypothetical tank is on average. Now we have three numbers. Fortunately, the axioms of probability theory come to our rescue.

It is never, ever the case that an ability is both melee/ranged and force/tech. The same thing goes for damage types. In fact, all abilities fall precisely into one of the three scores that we just expressed. Note: abilities which have multiple hits of different types, such as Plasma Grenade/Fusion Missile are counted by the game as different abilities activated by a single action! This is why DoT effects usually show up as a separate entry from the hit which applied the DoT in a combat log analysis like torparse. Anyway…

The fact that these cases are disjoint (never, ever overlap) is very useful to us. It allows us to merge these three scores together into a single master score, bringing us back to just one number that measures tank performance. We do this by scaling each score by the percentage of damage which applies in each case, and then simply summing up the scaled subscores into the single whole:

1 - ((mrke)(1 - defense)(1 - shield*absorb)(1 - armor) + (ftke)(1 - resist)(1 - shield*absorb)(1 - armor) + (ftie)(1 - resist)(1 - internalresist))

Assuming that "mrke", "ftke" and "ftie" are percentages (i.e. values between 0 and 1), this expression is precisely what we want! If 100% of all damage is melee/ranged + kinetic/energy, then our single master score becomes simply the score for the melee/ranged + kinetic/energy case. Less pathological cases work similarly. The exact ratios of damage (i.e. the values for mrke, ftke and ftie) are determined by the abilities used by bosses in currently relevant content. In other words, when we say "ideal tank stat distribution", we actually mean "tank stat distribution that is ideal for X content". In the case of my tanking stats post linked at the top, I try to make it very very clear exactly what content each stat distribution is optimal for.

Critical Hits

One tiny wrinkle in our current expression for tanking score comes from the fact that critically hitting attacks cannot be shielded. In other words, if an attacker rolls a critical hit on a certain ability, that ability may be subject to defense (if it is a melee/ranged attack) and damage reduction, but it will never ever be subject to shielding. This wrinkle is entirely irrelevant in PvE content, since NPCs have 0% native crit chance (though some, such as the trash in Czerka Meltdown, have abilities which buff their crit chance to non-0%), but it is very very important in PvP.

Fortunately, it is fairly easy to see how we might account for crit chance in our tanking score. At present, the shield/absorb term for our tanking score expresses the percentage of damage remaining assuming that we do shield and the damage is absorbed. What we need to do is modify this express the percentage of damage remaining assuming that we do shield and the attacker did not critically hit and the damage is absorbed. This is fairly easy to do:

1 - ((mrke)(1 - defense)(1 - (1 - crit)*shield*absorb)(1 - armor) + (ftke)(1 - resist)(1 - (1 - crit)*shield*absorb)(1 - armor) + (ftie)(1 - resist)(1 - internalresist))

The added part of the expression has been marked in bold. Basically, we only consider shielding for the average percentage subset of damage which is not a critical hit. In the case of PvE and non-critting NPCs, this multiplier simply reduces to 1 (since a crit chance of 0 will result in a scalar of 1). For this reason, we often leave off this multiplier when optimizing stat budgets for PvE content, simply because it will never be anything other than 1.

Healing

Just to be complete, there are a few more loose ends to tie up relating to tank survivability metrics.

The first such case is that some tanks (Guardians/Juggernauts and Vanguards/Powertechs) have self-healing mechanics which allow them to periodically recover a small, fixed amount of health. There is no particularly clean way of incorporating this value into the "master score" that we have derived for tanking, simply because this master score is represented as a percentage reduction of incoming damage, not a fixed recovery value. In order to determine the value of a self-heal mechanic in terms of percentage reduction, we need to scale it by the damage taken per second. This is done with the following expression:

invsquish := 1 - ((mrke)(1 - defense)(1 - (1 - crit)*shield*absorb)(1 - armor) + (ftke)(1 - resist)(1 - (1 - crit)*shield*absorb)(1 - armor) + (ftie)(1 - resist)(1 - internalresist))

1 - (1 - invsquish)(1 - hps / (dtps (1 - invsquish)))

In other words, we take the hps from our self-heal and then divide it by the damage taken per second post-mitigation (after it has been reduced by our previous master score). This means that we're determining the percentage of incoming damage that we're healing on average. This puts self-heal mechanics on the same terms as conventional damage reduction mechanics, at least for bosses with that specific DPS output. Clearly, increasing the DPS on a boss would decrease the mitigation percentage resulting from the self-heal, and decreasing the DPS would increase it correspondingly.

With the self-heal represented in terms of damage reduction, we can simply incorporate it into our master score expression in the same fashion as any other damage reduction mechanic (such as armor). The only thing that is interesting here is the fact that self-healing always applies, regardless of damage type. Thus, we put the self-healing term outside the sum used to combine the three scores for each individual attack/damage case.

The second case that we need to incorporate is the fact that one of the three tanks (Shadows/Assassins) has a talented increase to healing received. Clearly, this is a mechanism which impacts survivability, and thus we need to incorporate it into our math if we want our score to be complete. However, it is rather tricky to represent this as a form of damage reduction, seeing as it isn't actually reducing the damage received!

The solution to this is to take a small step back and see tanking in terms of healing. In a very real sense, every fight is an equation of the following form:

hps = dtps (1 - score)

In this case, "score" is simply our master score from above (including the self-heal HPS work). The "hps" in this term represents the external healing that is required (from the raid's dedicated healers) in order to perfectly negate the incoming damage with no overheal. Seeing tank mitigation in this light gives us a very easy algebraic way to incorporate healing received bonuses into our tank score:

hps (1 + heal-bonus) = dtps (1 - score)

hps = dtps (1 - score) / (1 + heal-bonus)

Thus, our final score looks something like this:

invsquish := 1 - ((mrke)(1 - defense)(1 - (1 - crit)*shield*absorb)(1 - armor) + (ftke)(1 - resist)(1 - (1 - crit)*shield*absorb)(1 - armor) + (ftie)(1 - resist)(1 - internalresist))

score := 1 - (1 - invsquish)(1 - hps / (dtps (1 - invsquish))) / (1 + heal-bonus)

And there we have it. A single number which represents the average performance of a tank given only the values on their character sheet and in their talent tree. Any tank which has a higher score will require less output from the raid's dedicated healers in order to survive a fight (on average). Any tank which has a lower score will require more output. Thus, higher scores are a measurement of higher efficiency in a raid. It is an open (and somewhat subjective) argument about whether or not efficiency is really the thing that we should be optimizing for, but it seems clear that efficiency is very easy to express and definitely one possible objective metric of tank performance.

Simplification

So, how do we use this score to determine gearing information? The answer to this question, mercifully, involves some simplification of our now-multi-line score down to something a lot easier to digest. For starters, self-healing mechanics and healing bonuses are very interesting from an overall tank comparison standpoint (since it allows us to compare different tanks head-to-head without worrying about their class), but they are entirely irrelevant if we're trying to determine how we want to itemize our gear. The reason for this lies in the fact that no combination of defense, shield or absorb rating will result in a higher (or lower) self-healing HPS. Thus, we can effectively ignore self-healing and healing bonuses as being irrelevant from a gear standpoint.

Sidebar: It is possible for Guardians/Juggernauts to increase their self-healing by stacking power or strength, and it is possible for Vanguards/Powertechs to increase their self-healing by stacking endurance. However, these itemization possibilities have been separately verified to be substantially (literally an order of magnitude) inferior to putting those same points into traditional mitigation stats. Pre-2.0, Shadows/Assassins were in a position where increasing their self-healing (by stacking endurance) was actually better than increasing their mitigation when it could be accomplished at a better than 1-to-1 ratio (as with "lettered" mods). This is no longer the case for any class! It is not longer even close to the case. Thus, we ignore these self-heal related possibilities altogether and only consider defense, shield and absorb ratings.

Another simplification we can perform is to entirely ignore force/tech + internal/elemental abilities. For the purposes of gearing, these abilities simply do not exist. The reason for this stems from the fact that it is impossible to raise your resist chance or your internal resist percentage by itemizing your gear in a different fashion. These attributes come only from set bonuses, talents, buffs and passives. Traditional gear attributes (such as armor rating, shield, defense and absorb) have no impact. Since we don't really have any control over our internal/elemental mitigation beyond how we spend our talent points, we can thus ignore this entire mitigation case when attempting to optimize the things we do control (i.e. our stat allocations).

With these changes, our scoring expression has been radically simplified back down to the following:

1 - ((mrke)(1 - defense)(1 - (1 - crit)*shield*absorb)(1 - armor) + (ftke)(1 - resist)(1 - (1 - crit)*shield*absorb)(1 - armor))

We can actually take things even one step further. You'll notice that both mitigation terms involve armor. Armor is special because it isn't part of the traditional gear itemization pool. There is no way that you can trade down your defense rating to pick up more armor rating (if you could, then everyone would do it). Armor just…reduces damage. And because armor is applied equally in both the melee/range case and the force/tech case, we can just factor it out entire.

Note that we cannot factor out resist. As mentioned before, there is no way that we can affect it with gearing (outside of set bonuses), but unlike internal/elemental damage, it is not simply an addend that we can set aside at the top level, and also unlike armor it is not applied equally to melee/range. Resist chance directly impacts the value of shield, interacting with it through the force/tech term, but has no direct effect on the value of defense. Thus, we need to keep it in the expression:

1 - ((mrke)(1 - defense)(1 - (1 - crit)*shield*absorb) + (ftke)(1 - resist)(1 - (1 - crit)*shield*absorb))

This is a much more tractable expression to work with than what we had before.

Bonuses

In order to look at what the optimal distribution of defense, shield and absorb is for a particular stat budget, we need to enrich our expression with some variables that come from the talent tree and set bonuses of whatever tank we are theory crafting. These variables come in the form of added percentages to defense, shield and absorb. For example, Kinetic Ward/Dark Ward works by adding 20% shield chance whenever the ability is active. As it turns out, current content is such that, on average, the ability will always be active assuming perfect play. Thus, we can model this as a flat 20% bonus to shield chance. All of the tanks have bonuses of this nature, some to defense, some to absorb, and others to shield. In fact, all of the tanks have bonuses to all of these attributes, it's just that some tanks have more bonuses in one area than another. It is these bonuses which define the differences between the tanks and make the largest impact on why some tanks prefer some stat allocations over others.

For the sake of simplification, let's look at just guardian/juggernaut tanks. You could play this same game with any tank class though (note: in order to find the absorb bonuses for shadow/assassin and vanguard/powertech tanks, you need some fairly heavy-duty math that is beyond the scope of this post):

1 - ((mrke)(1 - (defense + 0.03 + 0.10))(1 - (1 - crit)*(shield + 0.19)*absorb) + (ftke)(1 - resist)(1 - (1 - crit)*(shield + 0.19)*absorb))

Guardians/Juggernauts get 3% bonus defense chance from their talent tree, in addition to a whopping 10% additional defense chance from two in-combat sources: Blade Barricade (Riposte/Retaliate) and the 5% accuracy debuff (Force Sweep/Smash). We model these by simply adding them to the defense chance that we get from our gear. In addition to this, guardians/juggernauts get a 19% shield chance increase from talents in their tree and Soresu form. There are no bonuses to absorb (unlike shadows/assassins and vanguards/powertechs).

Optimization

Now that we have a simplified expression solely in terms of gear-affected stats which includes all of the relevant bonuses for the class in question (guardians/juggernauts), we can (finally) go about determining the optimal stat allocation at a particular budget. In order to do this, we're going to need to first make a slight change to our fundamental expression:

score[budget_] := 1 - ((mrke)(1 - (defense[budget * a] + 0.03 + 0.10))(1 - (1 - crit)*(shield[budget * b] + 0.19)*absorb[budget * c]) + (ftke)(1 - resist)(1 - (1 - crit)*(shield[budget * b] + 0.19)*absorb[budget * c]))

Ok, so there are more letters now… The letters "a", "b" and "c" represent the relative subset of our available stat budget which is assigned to each of the three categories: defense, shield and absorb. All three must be greater than (or equal to) 0, and less than or equal to 1. Additionally, the sum of the three must be precisely equal to 1, since we want to spend all of our available stat points (and we can't just manufacture more stat points out of thin air).

Incidentally, a note on syntax… When I say "score[budget_] := …", what that really means is "a function named 'score' defined in terms of one parameter, 'budget'". Thus, given a stat budget, the score function will return to us how much mitigation we have (also assuming values for a, b and c that we obtain from…somewhere).

So, what about the whole "defense[budget * a]" stuff? Well, that means "the defense chance corresponding to the defense rating of 'budget * a'". The same goes for shield and absorb. Fortunately, these formulae are very, very well understood. They are precisely equivalent to the following:

defense[x_] := 0.05+0.3 (1-(1-0.01/0.3)^(x/(55 * 1.2)))
shield[x_] := 0.05+0.5 (1-(1-0.01/0.5)^(x/(55 * 0.78)))
absorb[x_] := 0.2+0.5 (1-(1-0.01/0.5)^(x/(55 * 0.65)))

You don't have to take my word for it, of course. You can play around with your character sheet and verify that these formulae do in fact correctly predict the defense, shield and absorb percentages given your current ratings. Just remember to hover your mouse over the percentages in question so that you get the exact percentage from rating rather than including the bonuses (from talents, etc). The formulae above for defense, shield and absorb are three of the nearly-a-dozen fundamental formulae which underly the meaning of stats in SWTOR. All of these formulae are available here, along with information on the experiments which were used to derive them in the first place.

Anyway, having a function for each of defense, shield and absorb in terms of rating allows us to do something very interesting with our "score" function: optimize the values of a, b and c. In this case, "optimize" means to determine a set of values for a, b and c such that they result in the highest value of "score". In other words, if we have correctly optimized our function, there will be no other values of a, b and c which produce better mitigation for this particular stat budget.

If you're a visual person, it might help you to consider the following analogy. Imagine that we only had two variables to optimize: a and b (defense and shield). Now imagine that we graphed the score function such that the X axis was representing the a variable, while the Y axis was representing the b variable, and the Z axis was representing the value produced by the score function. The results would be some sort of surface, curving gently up and down at various points and extending from (0, 0) up to (1, 1) in both directions (presumably, we're zoomed in very close to this surface). Now, you can imagine that, on this surface, there will be some points that are higher than others, and some that are lower. Peaks and valleys, if you will. One of these peaks will be the highest of all of them. This peak will correspond to a particular value of a and b. This is the optimum for the function.

Of course, we don't have just two variables. We have three: a, b and c. Thus, the 3-dimensional visual breaks down, because we actually would need to plot over four axes: a, b, c, and the value of the score function. This sort of thing gets to be very difficult to picture unless you happen to be someone with a lot of experience thinking about abstract geometries. But of course, if you're that sort of person, optimization really needs no explanation. :-)

The real question is simply this: how do we find these peaks? How do we discover a set of values for a, b and c such that we are at not only one of these peaks, but actually the highest one? The answer to that question is actually somewhat complicated and has everything to do with multivariable calculus. I'm…not really going to explain all of that in this post (you're welcome). Fortunately for both of us, this is the point where I stop doing legwork myself and just plug everything into Mathematica. Specifically, the FindMaximum function. If you're following along at home, that's probably what you want to do now. (note: Wolfram|Alpha can do some of this, but the trivariate optimization is generally a bit too computationally intensive for it, since the differentiation gets to be very hairy)

Constraints

Just to make things extra-tricky, it isn't enough to derive a set of values for a, b and c such that we are at the highest possible peak, since those values may not correspond to a distribution of stats that we can actually achieve with the mod system in game! For example, if we decided that the optimal gearing strategy for a stat budget of 2000 was to put 1500 points into defense and 500 points into absorb, we would be categorically wrong, since it is impossible to get 0 points in shield without taking off all of your gear (except belt and bracer)! Thus, we need to find a way to further constrain a, b and c such that the results we generate are realistic and actually reflecting what is possible in the game.

For this reason, we need to derive three functions: ShieldMin, ShieldMax and DefenseMin. Technically, there is also a minimum and maximum absorb and a maximum defense, but as a practical matter, we never really hit those limits. Deriving these functions actually turns out to be fairly simple.

For the shield min, what we really need to know is how many points of shield are unavoidable. Unavoidable shield comes from three sources: enhancements, implants and the ear piece. These sources all scale up as we increase our stat budget (i.e. as our gear is upgraded to higher-tier mods), and thus these are specifically the pieces that we want to look at. In order to more conveniently do this, we remove from our stat budget the itemization granted by augments (448 stat points) and the nano-infused stim (70 defense). This gives us a subset of our stat budget which is going to scale with gear tier (augments and stim do not scale). Once we have that value, we cheat!

Arkanian gear has a stat budget of 2181 fully augmented and stimmed. Of that, 720 is shield rating from enhancements, implants and ear. Dread Forged has a stat budget of 2721. Of that, 940 is shield rating from enhancements, implants and ear. Using these numbers and a bit of algebra, it is pretty easy to derive the following magic formula:

ShieldMin[budget_] := (budget - (448 + 70))/2.30972 - (budget - 2181)/38.5

From here, the maximum is very easy to calculate. The maximum possible shield rating is simply the minimum plus a full set of shield augments (or 448 shield):

ShieldMax[budget_] := ShieldMin[budget] + 448

Needless to say, the shield minimum and maximum (like the defense minimum) is an approximation, and one that we as a community are continuing to refine. Fundamentally, we are attempting to approximate with continuous values the quantized nature of itemization in SWTOR. It's very difficult to model the fact that stat budgets and itemizations increase in "jumps" (e.g. you can't just add 1 point of shield rating). Thus, the ShieldMin (and DefenseMin) function are approximating a phenomenon which is fundamentally discrete, not continuous. Fortunately, the error which results from this approximation is in the fourth or fifth order of magnitude, so it's not really something to worry about.

Computing the defense minimum is slightly more straightforward than determining the shield minimum. We no longer have to worry about enhancements, since we could just stack all Bulwark enhancements if we really wanted to. However, most gear tiers only provide a single implant type, a single ear type and a single pair of BiS relics. This forces a particular set of stat itemization for at least a subset of one's gear. In addition to that, the nano-infused fortitude stim provides 70 defense rating, and no other tanking stim types are available. Thus, in order to model the defense minimum, we need to sum up three components: the defense forced upon us by implants and ear, the defense forced upon us by relics, and the 70 defense from the stim. Spoiler! This is expressed as the following:

DefenseMin[budget_, pieces_] := ((budget - (448 + 70)) pieces)/20.2791 + (budget - (448 + 70))/56.9160 + 70

The "pieces" variable represents the fact that some tanks have fewer implant/ear pieces with defense than others. For example, shadows/assassins have absorb-based implants, but a defense based ear. Vanguards/Powertechs are stuck with defense based implants and a defense based ear. The fewer defense pieces are forced upon us, the lower the defense minimum. As an example, the defense minimum in full Dread Forged is 217 for a shadow/assassin tank.

As with the ShieldMin function, the DefenseMin function is an approximation, but a very good one. It is within 3 points down to the Arkanian tier and all the way up to the Dread Forged tier, which is close enough for any practical purposes.

Obviously, I'm not explaining the derivation of these functions in as much detail as the score function, but that's because they're BORING! Also, one derivation is pretty much as good as another. If you have a better way of approximating the minimum and maximum values for a particular stat budget, I would love to hear it! These are essentially a hack to encode some annoying quirks of Bioware's itemization scheme.

However, with these functions, we can go back and modify our scoring function such that our optimization doesn't produce results which our outside the range of achievable given the way that gear fits together:

score[budget_] := 1 - ((mrke)(1 - (defense[budget * a] + 0.03 + 0.10))(1 - (1 - crit)*(shield[budget * b] + 0.19)*absorb[budget * c]) + (ftke)(1 - resist)(1 - (1 - crit)*(shield[budget * b] + 0.19)*absorb[budget * c])), WHERE a + b + c = 1 & a * budget >= DefenseMin[budget, pieces] & b * budget >= ShieldMin[budget] & b * budget <= ShieldMax[budget]

Got all that?

Meanwhile…

At this point, we're essentially done. There are a few things that I have neglected to mention, most notably the defense rating contribution from the Fortunate Redoubt relic and the effect of low accuracy boss attacks (which essentially result in additional defense bonuses to all tanks). However, the structure and essence of all of the theory crafting work which goes into the tanking stats post is summed up in the above. In fact, you probably have enough information at this point to understand the following:

Code:
mitigation[x_, def_, shld_, abs_, resist_, op_, pieces_] := FindMaximum[{mrke *FRRatio* (1 - (1 - (defense[x*a + FRRelic[x]] + def + LowAccuracyRatio * 0.1))*(1 - (1 - crit /. op)(shield[x*b] + shld)(absorb[x*c] + abs[defense[x*a + FRRelic[x]] + def + LowAccuracyRatio * 0.1, shield[x*b] + shld]))) + mrke *(1- FRRatio)* (1 - (1 - (defense[x*a] + def + LowAccuracyRatio * 0.1))*(1 - (1 - crit /. op)(shield[x*b] + shld)(absorb[x*c] + abs[defense[x*a] + def + LowAccuracyRatio * 0.1, shield[x*b] + shld]))) + ftke*(1 - (1 - resist)(1 - (1 - crit /. op)(shield[x*b] + shld)(absorb[x*c] + abs[defense[x*a] + def + LowAccuracyRatio * 0.1, shield[x*b] + shld]))) /. op, a >=0 && a <= 1 && x*b >= ShieldMin[x] && x*b <= ShieldMax[x] && c >= 0 && c <= 1 && a + b + c == 1 && x*a >= DefenseMin[x, pieces]}, {a,b,c}]
This is the real actual function which sits in my Mathematica worksheet and generates all of the stat distribution tables that we know and love. As you can see, it looks a lot like the score function that we've been working with, just with a few added bells and whistles. The defense, shield and absorb bonuses, for example, are passed in as function parameters (along with the resist chance). Just to make matters interesting, the absorb bonus is actually itself a function of the defense and shield chances (this is because of the Kinetic Bulwark/Dark Bulwark absorb bonus for shadow/assassin tanks, which produces fewer stacks and less average value if more attacks are defended and/or fewer are shielded). Also, we can see the effects of the Fortunate Redoubt relic on the defense rating in the fact that the melee/range + kinetic/energy term is split into two components: one with and one without the Fortunate Redoubt relic currently active.

You get the idea though. If you plug the above into Mathematica, together with the requisite baggage to compute the bonuses for each class and the decorative trappings required to spit out tables and graphs, you too could generate all of the pretty tables in the ideal tanking stats thread linked at the top.

Conclusion

Tanking stat optimization really isn't that complicated. There's a lot of prerequisite knowledge, and a lot of thought and time that has been put into making it as accurate and as precise as possible. This work is still ongoing! We're still finding ways to refine the calculations; still debating ways to determine the value of various bonuses (such as Kinetic Ward/Dark Ward). This means that the ideal stat tables are always going to be something of a work in progress. The goal is to always present the most accurate information known to the theory crafting community, and sometimes that means changing what was presented in the past as new ideas and new discoveries come to the surface. Also, sometimes we make mistakes (check our math!).

The goal of this post was to demystify what we do in a way that is understandable and verifiable. Ideally, you should be able to take all of the above and check it yourself! Verify that the math is in fact giving you an answer which lines up with reality in the game, because ultimately that's what we're really trying to affect.
Computer Programmer. Theory Crafter. Dragonslayer on The Ebon Hawk.
Tam (shadow tank) Tov-ren (commando healer) Aveo (combat sentinel) Nimri (df scoundrel)
Averith (hybrid sniper) Alish (lightning sorcerer) Aresham (jugg tank) Effek (ap powertech)

Methoxa's Avatar


Methoxa
02.24.2014 , 04:17 AM | #2
I am currently looking for formulas regarding the defensive cd's for all tanks i.e. force shroud, oil slick, Saber ward and so on. I would like to implement all the def cd's for each class into their overall mitgation. I remember you publishing a thread for the mitgation of each tank without the defensive cd's or extra abilities ( phasewalk, sonic barrier). That mitgation sheet shows a ranking of the tanks ( Sin>Hybrid Jugger>Pt>Immortal Jugger). Implementing the defensive cd's of each tank class could change the rankings. As i have only fundamental knowledge of math i wanted to ask you if it was possible to do a mitgation+def cd ranking. I know its much work, i only have done the formulas for invincible, saber ward and saber reflect. Enrage defense for example seems to have different hps. The quicker the attack the more it heals, so its to unstable to predict.

I think the passive mitgation you presented only seems to be the half truth because in ops i have my defensive cd's on cooldown ( Juggernaut) as the sin tank next to me trusts his passive mitgation. This results ofc in total different dtps ( sin tank 2k dtps, me 1600dtps @ nefra 16hm). What i want to say is that a tank only with his passive mitgation is only a half tank, the other half is his active mitgation. In order to get a detailled picture about each tank you have to consider both the passive and the active mitgation. Otherwise people get a wrong picture about tanks in my opinion.

I am not quite sure if you already published a thread to this topic, in case you did could you give me the link?

To you example above : You forgot crushing blow at bonus reducing the damage taken by 3%. However you only implemented defense chance there so i am not quite sure whether cb should be implemented there or somewehere else or maybe you just left it out for simplification as it is a manual for Theory crafting. Nicely written and explained, thanks.

1 thing i dont understand is why dont you set defense chance and dmg reduction as equal? 1% defense chance equals 1 % dmg reduction. Therefore cb would be 3% defense chance. Wouldnt that simplify formulas and you wouldnt need extra formulas for cb, saber ward and invincible? Or does it have to do with your spikiness formula?
Conquerer of the Dread Fortress Methoxa - Gate Crasher - Black Bantha - Vanjervalis Chain EU

THoK-Zeus's Avatar


THoK-Zeus
02.24.2014 , 06:11 AM | #3
Quote: Originally Posted by Methoxa View Post
....
To you example above : You forgot crushing blow at bonus reducing the damage taken by 3%. However you only implemented defense chance there so i am not quite sure whether cb should be implemented there or somewehere else or maybe you just left it out for simplification as it is a manual for Theory crafting. Nicely written and explained, thanks.

1 thing i dont understand is why dont you set defense chance and dmg reduction as equal? 1% defense chance equals 1 % dmg reduction. Therefore cb would be 3% defense chance. Wouldnt that simplify formulas and you wouldnt need extra formulas for cb, saber ward and invincible? Or does it have to do with your spikiness formula?
Crushing Blow Bonus is inside KBN's armor calculation.

1% defense Chance doesn't equal 1% damage reduction. Not at all!
1% Defense is more then 1% Damage Reduction against melee/range damage (unless you have excactly 0% defense Chance and 0% Damage Reduction against all other types of damage a tank can get.
Zahik - DiLiH - The Red Eclipse

Omophorus's Avatar


Omophorus
02.24.2014 , 08:32 AM | #4
Quote: Originally Posted by Methoxa View Post
I am currently looking for formulas regarding the defensive cd's for all tanks i.e. force shroud, oil slick, Saber ward and so on. I would like to implement all the def cd's for each class into their overall mitgation. I remember you publishing a thread for the mitgation of each tank without the defensive cd's or extra abilities ( phasewalk, sonic barrier).
So the issue here is that it requires a very dangerous assumption - that you're always using every defensive CD exactly as often as it is available, and that doing so is the optimal use for each CD.

In practice, the second part of that assumption is usually inaccurate. Even when it's not wholly inaccurate, it doesn't paint a complete picture (e.g. one generally just maximizes CD uptime tanking Nefra, but how do you account for Force Shroud? Not only can it reduce the damage you take by purging DOT faster than a cleanse would, but it also means the healer who would've cleansed you can cleanse someone else sooner, meaning you indirectly reduce someone else's DTPS).

Not using CDs will yield a big increase in DTPS, but it does not follow that just burning them as often as possible will decrease DTPS to a minimum. If boss' attacks were entirely uniform, this would be true, but they're not. Bosses have bigger and smaller hits, of different attack/damage types, on different timers. Because of this, optimal CD use is situational and highly dependent on fight knowledge.

You could create a top-to-bottom list of "reverse dummy" efficiency (e.g. instead of beating on a static target, having a static set of attacks hitting you), but it wouldn't be reflective of any actual content, so would be worse than useless - it would generate preconceived notions about which tank/spec is "best" even when the terms used to define "best" do not align with what you'll actually see participating in content.
Srs'bsns, GM of <Proper Villains> of The Ebon Hawk
5/5 Nightmare Power DF & DP
"This is why we don't bring Assassin tanks"

Methoxa's Avatar


Methoxa
02.24.2014 , 10:40 AM | #5
Quote:
one generally just maximizes CD uptime tanking Nefra, but how do you account for Force Shroud? Not only can it reduce the damage you take by purging DOT faster than a cleanse would, but it also means the healer who would've cleansed you can cleanse someone else sooner, meaning you indirectly reduce someone else's DTPS).
It reduces the damage another person would get, same does sonic wall. I do it as much as i can do when nefra's scream comes. That means my sonic wall shrugs off the first tick of the dot ( in 16hm, the 2 first dots in 8hm) of 15 other ppl every second time Nefra does her scream. That means i can use sonic wall as often as a sin can use his force shroud. Force shroud saves the gcd of 1 healer. Sonic wall absorbs damage therefore healers might have not to heal saving eventually casttime + gcd. 1gcd = 1 dottick. Meaning Force shroud "absorbs" 1 tick while sonic wall absorbs 15. Now you have to find out the damage of the dot and you can calculate the effeciency of force shroud and sonic wall. I am on the train atm therefore i cant access my logs.

Quote:
Not using CDs will yield a big increase in DTPS, but it does not follow that just burning them as often as possible will decrease DTPS to a minimum. If boss' attacks were entirely uniform, this would be true, but they're not. Bosses have bigger and smaller hits, of different attack/damage types, on different timers. Because of this, optimal CD use is situational and highly dependent on fight knowledge.
7

Of course you should use your cd's when you know there will be a big hit by a boss ( e.g. Raptus Force execution followed by his other big attack ( forgot its name it does 20k+). But bosses have also sustained damage. If you would calculate the sustained dps a boss does + the passive mitgation ( done so far by kbn) + adding the formulas of the defensive cd's you would get another sustained dtps value that would have the defensive cd's in it. Maybe it is not accurate for bosses who have spikes. But as far as i can see kbn calculated his passive mitgation on a "reverse dummie". Pure numbers. Boss does 3k dtps on a target without armor with 0 def, 0 shield. Now he filled in the defstats the tanks have and calculated it, which is a very legal way. Why not treating def cd's the same way? Jugger mitgation 72.93 ( pure phantasy atm dont know the actual number), jugger + invincible = lets say 75.64mitgation for 10 seconds. Or you could just summarize all the def cd's the jugger had to one actual mitgation = Jugger + all def cd's 30sec all 2min = x mitgation. It would be as you say a reverse dummie calculation, but it would in my eyes be more realisticly showing the true tankranklist better. Atm jugger have the lowest passive mitgation, but with their def cd's calculated they would be far closer to the other 2 tanks. In my eyes Kbn only showed one side of mitgation but not the other half, which leads to the conclusion that juggers would be bad tanks.

Quote:
You could create a top-to-bottom list of "reverse dummy" efficiency (e.g. instead of beating on a static target, having a static set of attacks hitting you), but it wouldn't be reflective of any actual content, so would be worse than useless - it would generate preconceived notions about which tank/spec is "best" even when the terms used to define "best" do not align with what you'll actually see participating in content.
Kbn didnt do anything else with his calculations of the passive mitgation. He took the dmg ratios and dtps from here: https://docs.google.com/spreadsheet/...sharing#gid=18
And calculated the overall mitgation of the tanks against these dmg ratios and i guess he also calculated the sustained tdtps av tank would get from each boss. You can calculate defensive cd's into the passive mitgation by calculating their effect and divide their cd by their uptime.

Again in my opinion this would be a more accurate and complete view regarding the tanks than just comparing their passive mitgation. But again it takes much time and effort to get these calculated. I hoped to give kbn a little feedback about his work on the mitgation model, which has its flaws. Comparing only a tanks passive mitgation is a one-sided view. Nevertheless Kbn did great work on all this publication like his Ideal tank distribution was one of the most helpful threads in my entire gaming career not to mention his threads he offered help and tips. But the mitgation publiations seemed to be half finished when i read it, so i hoped he would add the active mitgation and summarize that to an overall mitgation which was done for many mmorpgs btw ( the reverse dummie thing has been done also uncountable times). But until today i never saw an updated and i hope to motivate kbn to work on it to take it to perfection.

Btw. sorry for my bad english especially when it comes to discussion about formulas and maths the terms i am looking for might not be the choice of a native english/american speaker/writer.
Conquerer of the Dread Fortress Methoxa - Gate Crasher - Black Bantha - Vanjervalis Chain EU

Kuciwalker's Avatar


Kuciwalker
02.24.2014 , 11:08 AM | #6
Methoxa: there are two different purposes of theorycrafting:

1. Comparing classes

For this purpose, there is possibly some gain from incorporating cooldowns into the calculation. However, the proper way to account for each cooldown varies with each fight and can even vary within a fight based on a group's approach or composition. There is a clear tradeoff between effort and accuracy, and it is hard to make the case that attempting to account for cooldowns is worth the effort required.

This doesn't mean we should ignore cooldowns, but the current approach generally looks at them qualitatively alongside the theorycrafting numbers for DtPS and spikiness.

2. Determining optimal stat weights

For this purpose, we have all of the problems of fight-to-fight and group-to-group variation. On top of that, we have the fact that in many cases cooldowns will have only a small effect on the optimal stat distribution (in some cases, none at all). On top of that, most people aren't going to carry around an individually customized gear set for each boss. (It's already a small fraction that carry separate gear sets for each ops as a whole.) As such, any accuracy gained by incorporating cooldowns would be swamped by boss-to-boss and group-to-group variation in cooldown use.

Omophorus's Avatar


Omophorus
02.24.2014 , 11:43 AM | #7
Quote: Originally Posted by Methoxa View Post
It reduces the damage another person would get, same does sonic wall. I do it as much as i can do when nefra's scream comes. That means my sonic wall shrugs off the first tick of the dot ( in 16hm, the 2 first dots in 8hm) of 15 other ppl every second time Nefra does her scream. That means i can use sonic wall as often as a sin can use his force shroud. Force shroud saves the gcd of 1 healer. Sonic wall absorbs damage therefore healers might have not to heal saving eventually casttime + gcd. 1gcd = 1 dottick. Meaning Force shroud "absorbs" 1 tick while sonic wall absorbs 15. Now you have to find out the damage of the dot and you can calculate the effeciency of force shroud and sonic wall. I am on the train atm therefore i cant access my logs.
You missed the point. Do we include Sonic Wall as a CD and incorporate it into the overall mitigation profile for Juggernaut because on one fight you can use it to great effect?

What about in other situations where you need to gather adds, or where you can't reliably hit most of the group? How do you account for the wildly varying value of Sonic Wall in those situations?

What I'm getting at is that you can't just roll all the CDs in and get an accurate picture, because some CDs have a straightforward impact on damage taken, while others have secondary effects that are decidedly non-trivial and often extremely fight-specific, plus you can't expect to use them exactly to CD 100% of the time.

You'd literally have to go boss-by-boss with both 8 and 16 man damage profiles and even then you'd have to come to some agreed-upon "best use" for every CD for every tank, which then presupposes absolutely flawless, robotic execution and no surprises.

In other words, it simply isn't worth the effort and the results won't be accurate to try to incorporate CDs into the mitigation profile of each tank AC.

Quote: Originally Posted by Methoxa View Post
Of course you should use your cd's when you know there will be a big hit by a boss ( e.g. Raptus Force execution followed by his other big attack ( forgot its name it does 20k+). But bosses have also sustained damage. If you would calculate the sustained dps a boss does + the passive mitgation ( done so far by kbn) + adding the formulas of the defensive cd's you would get another sustained dtps value that would have the defensive cd's in it. Maybe it is not accurate for bosses who have spikes. But as far as i can see kbn calculated his passive mitgation on a "reverse dummie". Pure numbers. Boss does 3k dtps on a target without armor with 0 def, 0 shield. Now he filled in the defstats the tanks have and calculated it, which is a very legal way. Why not treating def cd's the same way? Jugger mitgation 72.93 ( pure phantasy atm dont know the actual number), jugger + invincible = lets say 75.64mitgation for 10 seconds. Or you could just summarize all the def cd's the jugger had to one actual mitgation = Jugger + all def cd's 30sec all 2min = x mitgation. It would be as you say a reverse dummie calculation, but it would in my eyes be more realisticly showing the true tankranklist better. Atm jugger have the lowest passive mitgation, but with their def cd's calculated they would be far closer to the other 2 tanks. In my eyes Kbn only showed one side of mitgation but not the other half, which leads to the conclusion that juggers would be bad tanks.
You're making a contradictory statement here - on one hand you should align CD usage with boss spike damage, bu then you want to calculate the impact on mitigation as though you were using the same CDs as often as possible. The two are completely incompatible.

And to further the point - even if you were to take a naive approach of finding its uptime-weighted impact on average DTPS for a fight, you're underselling the value of the CDs, since if used properly they disproportionately clip the peaks in the DTPS graph, which means a greater impact than simply fiddling with averages.

This is literally a boss-by-boss thing, so what you'd wind up presenting is "Assassin has the best mitigation for bosses A, B, and C", "Juggernaut has the best mitigation for bosses G, H, and I", and "Powertech has the best mitigation for bosses X, Y, and Z". Most groups, outside of initial world/server-first sprints of NiM content, aren't going to swap their group composition around on a per-boss basis, so it's not a meaningful chart as you're not going to choose your tanks purely based on a boss-by-boss analysis of DTPS.

I can understand wanting to close the on-paper gap in mitigation between Juggy and PT/Sin, but quite frankly right now it's not the deciding factor for any raid group. The entire thing would be a massive exercise in pedantry and the outcome would be basically useless.

Quote: Originally Posted by Methoxa View Post
Kbn didnt do anything else with his calculations of the passive mitgation. He took the dmg ratios and dtps from here: https://docs.google.com/spreadsheet/...sharing#gid=18
And calculated the overall mitgation of the tanks against these dmg ratios and i guess he also calculated the sustained tdtps av tank would get from each boss. You can calculate defensive cd's into the passive mitgation by calculating their effect and divide their cd by their uptime.
Except, to reiterate one more time... you can't gain maximum value from defensive CDs and also assume perfect uptime. You can have one or the other. Either way, you'll get a different impact on overall DTPS, and using everything to CD is naive and foolish, and thus not representative of any actual in-raid behavior from a competent tank.

Quote: Originally Posted by Methoxa View Post
Again in my opinion this would be a more accurate and complete view regarding the tanks than just comparing their passive mitgation. But again it takes much time and effort to get these calculated. I hoped to give kbn a little feedback about his work on the mitgation model, which has its flaws. Comparing only a tanks passive mitgation is a one-sided view. Nevertheless Kbn did great work on all this publication like his Ideal tank distribution was one of the most helpful threads in my entire gaming career not to mention his threads he offered help and tips. But the mitgation publiations seemed to be half finished when i read it, so i hoped he would add the active mitgation and summarize that to an overall mitgation which was done for many mmorpgs btw ( the reverse dummie thing has been done also uncountable times). But until today i never saw an updated and i hope to motivate kbn to work on it to take it to perfection.
The point of the theorycrafting is not to show which tank is best. That's going to depend on the content, the player, and the group's tactics. It says right in the OP that the goal isn't to try to figure out which tank is best.

The main benefit of theorycrafting is to help players min/max the main factor that is under their control - how they slot mods, enhancements, and augments into their gear to gain maximum benefit. None of that is dependent on CDs (you'll use them the same way regardless), and none of it is universal across all tanking ACs as the differing talents mean that stats have different values.

So yeah, dipstik, KBN, and others are not taking their time to try to mathematically model the best tank (a hugely time-consuming and ultimately pointless exercise). They're trying to help provide guidance in optimal gearing, and ask the rest of us for help in sanity-checking their efforts to ensure that their own methodology and assumptions are sound, so that a mistake on their part doesn't lead people to gearing sub-optimally out of ignorance.
Srs'bsns, GM of <Proper Villains> of The Ebon Hawk
5/5 Nightmare Power DF & DP
"This is why we don't bring Assassin tanks"

dipstik's Avatar


dipstik
02.24.2014 , 03:21 PM | #8
great post!

in regards to cd maths: i have tried to take those into account in the past, but getting people to agree on when to use which in a contextless setting seemed like a fools errand. i think the tanking leaderboard is a great place to look at overall tanking performance, including trading tips on cooldown usage. if your log shows you took 300 more dps than another tank in the same gear, and you see use of one cd for a particular mechanic that you use somsewhere else in the fight, then you can adjust your play. there is also healing performance measures that can be gleened from the tanking leaderboards.

Methoxa's Avatar


Methoxa
02.25.2014 , 10:28 AM | #9
The tanking leaderboard calculation shows the passive overall mitgation over a whole fight in percentage e.g. 76.68%. This is also variable. You can be unlucky and get 3 full hits in a row, meaning your mitgation would be lower. These (un)luckfactors havent been implemented into the calculations, as it is not possible. In your opinion def cd's are situational. This is right, but nevertheless it does add a certain factor to the mitgation, whether the tank is hit or not at that moment is not important for the calculation of the mitgation ( for calculations how much dtps a tank would get it is important). There are ofc Def cd's that do not give more mitgation but other beneficial buffs i.e. force shroud. Cleansing yourself is good but in calculations regarding purely passive + active mitgation that def cd's is not to be calculated. Only the def cd's that would add mitgation should be taken into account, and that is possible. Take a fighturation of 5min ( again dtps income is not important on calculating the mitgation) and calculate the overall uptime of the def cd's + their effect ( again only def cd's that have an effect on the mitgation are taken into account) and add the passive mitgation of that tank to it and youll have the passive + active mitgation together.

People who've written maybe didnt understand me ( might be my foreign language skill's fault). I dont want to calculate the dtps a tank gets nor how much dmg are absorbed by each def cd or whatsover. I purely want that not only the passive mitgation of each tank is shown ( kbn's Tank mitgation calculation) but also the mitgation calculation considering def cd's. Mitgation is an overall value even when you take def cd's into account you can calculate the overall mitgation of each def 'cd. On the field you should use def cd's when big hits come, but we are nevertheless ina theoretical field here. So we are not interested in bossmechanics or big hits, we just want a percentual number of the mitgation each tank has while considering their def cd's to be able to compare each tank better. This has nothing to do with ideal tank distribution or whatsover, but there might be new insights when we get the results.
Conquerer of the Dread Fortress Methoxa - Gate Crasher - Black Bantha - Vanjervalis Chain EU

KnightTyler's Avatar


KnightTyler
02.25.2014 , 12:57 PM | #10
This is a very informative post and I appreciate you taking the time to lay out the formulae like this so that more of us can contribute to the community as well. The good thing about this is that it allows the community to contribute to making this game better, especially now that we have a class representative system in place. I consistently read the forums and have been following your posts as well as Dipstik's and others who contribute all that they do to the community.

I was thrown off mostly under the Healing section where you said: "The first such case is that some tanks (Guardians/Juggernauts and Vanguards/Powertechs) have self-healing mechanics which allow them to periodically recover a small, fixed amount of health."

I have 16 characters (one of each advanced class) right now on The Shadowlands server. I am a tank guy . With that said, my main is my Guardian tank but I also have a Shadow and Vanguard tank that I rotate playing frequently. I have good experience on all of them and I even wanted to try stacking defense augments on my Sentinel just to see if I can make him a semi-tank monster lol.

To my understanding, the self healing mechanics you were referring to were Guardian's Blade Barrier proc from Blade Storm(doesn't truly heal but the end result is calculated the same) and Vanguards passive talent Into the Fray which heals them by 2.5% of their total health every 3 seconds when suffering AoE damage.
  • Vanguards have access to Shoulder Cannon heals and Adrenaline Rush heals.
  • (Guardian's are getting a new reworked Focused Defense in 2.7 so I cant include its effectiveness as a self-heal while tanking (PvE) since the current Focused Defense drops threat.)

I was trying to see why you didn't include Shadow's Battle Readiness instant 15% heal and additional healing from Combat Technique procs for those 15s as a self-healing variable. And also if you include Guardian's Enure as a self-healing variable since its not exactly a true self-heal (the health is lost when the effect ends.) My first guess is that you didn't include Shoulder Cannon, Adrenaline Rush, Focused Defense, Enure and Battle Readiness since they are DCD's. Did you only include Blade Barrier and Into the Fray as self-healing mechanics since they happen more frequently during the course of a fight?