A Call to Arms - MoP Mechanics Testing

Warning: Theorycraft inside.

Moderators: Fridmarr, Worldie, Aergis, theckhd

Re: A Call to Arms - MoP Mechanics Testing

Postby Klaudandus » Thu Jun 28, 2012 2:05 pm

Naked BE
Health: 151051
Mana: 60000
Str 176
Agi 107
Sta 332
Int 117
Spi 121
Dodge 3.01
Parry 3.19

And one last parry set.
Str 11568
Parry chance 15.97%
Parry of 0 adds 0.00%
The Element of Forum Hyperbole
Image
---
Flüttershy - Draenei Protection Paladin, Aerie Peak
Klaudandus - BE Protection Paladin, Feathermoon (Semi-retired)
User avatar
Klaudandus
 
Posts: 11223
Joined: Thu Apr 02, 2009 7:08 am
Location: Texas' Armpit

Re: A Call to Arms - MoP Mechanics Testing

Postby theckhd » Fri Jun 29, 2012 3:48 am

Klaudandus wrote:Dodge 3.01
Parry 3.19

"Poifect!"

DR formula post incoming.
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
Simcraft 6.x, Call to Arms 6.0, Talent Spec & Glyph Guide 6.x, Blog: Sacred Duty
User avatar
theckhd
Moderator
 
Posts: 8003
Joined: Thu Jul 31, 2008 3:06 pm
Location: Harrisburg, PA

Re: A Call to Arms - MoP Mechanics Testing

Postby KysenMurrin » Fri Jun 29, 2012 3:58 am

They just gave all plate tanks 2% dodge through passives. Doubt that changes any formulae other then sticking a +2 on there, though?
Temporarily playing WoW again.
Donnan - Nangun - Kysen - Kysen - Mardun - Timkins

Mostly-Book Blog.
KysenMurrin
 
Posts: 6984
Joined: Thu Jun 26, 2008 6:37 am
Location: UK

Re: A Call to Arms - MoP Mechanics Testing

Postby theckhd » Fri Jun 29, 2012 4:03 am

KysenMurrin wrote:They just gave all plate tanks 2% dodge through passives. Doubt that changes any formulae other then sticking a +2 on there, though?

Nope, since it's through a talent, it shouldn't be affected by DR, so it's just increasing base dodge from 3.01 to 5.01.
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
Simcraft 6.x, Call to Arms 6.0, Talent Spec & Glyph Guide 6.x, Blog: Sacred Duty
User avatar
theckhd
Moderator
 
Posts: 8003
Joined: Thu Jul 31, 2008 3:06 pm
Location: Harrisburg, PA

Re: A Call to Arms - MoP Mechanics Testing

Postby theckhd » Fri Jun 29, 2012 8:28 am

As mentioned earlier, I had trouble getting anything conclusive out of Klaud's parry data. Part of the problem was that the data only covers a limited range of parry, and part of it was based on an assumption I made early on. Initially, I assumed that the parry cap would be reasonably close to what it is now. But the near-linearity of the data set contradicted that - either some portion of it wasn't affected by DR (i.e. str->parry), or the cap was a lot higher than I was expecting.

It turned out to be the latter. The dodge cap is, as far as I can tell, unchanged from Cata (around 65.5%). The parry cap is around 235%. Since that sounds sort of crazy, I'll provide the methodology and data. All of the data and curve fitting calculations are available here, for those with MATLAB: dr_eqn_data_L85.m I have not tested this file with Octave/FreeMat, but I didn't use anything fancier than fit() calls.

The first thing I did was hop onto beta and make a new pre-made 85 human paladin. The problem with doing all of this at 90 is that we don't have enough gear to climb the parry curve very far. But the relative gear level is much higher on an 85 pre-made, which lets us push the boundaries further. If I had been thinking clearly, I'd have transferred another copy of Theck to push things even higher. Oops. In any event, the 85 pre-made managed to do the job.

The procedure was as follows. I first stripped the pre-made of all gear and recorded all of the base values of interest: strength, agi, dodge, and parry. I then equipped one piece of gear at a time, recording the new strength, agi, total dodge percentage, total parry percentage, dodge rating, pre-DR dodge percentage due to that rating (from the tooltip), parry rating, and pre-DR parry percentage due to that rating. After equipping all gear, I started to gem and enchant it one piece at a time, using STR and/or dodge enchants and parry gems. I then stripped the character again and repeated the process with ret gear to test strength scaling independently, this time using STR gems/enchants to keep parry/dodge rating at 0. At no point during this process did I cast any spells - all of these values are completely unbuffed. The data from this test is summarized in the table below:

Code: Select all
Level 85 human paladin
baseStr=164;
baseDodge=3.01;
baseParry=3.67;
baseAgi=97;

Protection gear:
                  Total %      pre-DR Dodge  pre-DR Parry
    STR    AGI  Dodge  Parry  Rating    Pct  Rating    Pct
510.00  97.00   3.01   6.35    0.00   0.00  260.00   0.98
737.00  97.00   3.01   7.91    0.00   0.00  389.00   1.47
1018.00  97.00   3.72   9.99  169.00   0.64  595.00   2.24
1244.00  97.00   3.72  11.64  169.00   0.64  760.00   2.87
1610.00  97.00   4.78  13.21  427.00   1.61  760.00   2.87
1817.00  97.00   4.78  14.67  427.00   1.61  909.00   3.43
2098.00  97.00   5.62  15.85  638.00   2.41  909.00   3.43
2308.00  97.00   5.62  16.72  638.00   2.41  909.00   3.43
2674.00  97.00   6.51  19.20  868.00   3.27 1172.00   4.42
2884.00  97.00   7.57  20.05 1150.00   4.34 1172.00   4.42
3057.00  97.00   8.40  20.74 1377.00   5.19 1172.00   4.42
3284.00  97.00   8.93  21.65 1525.00   5.75 1172.00   4.42
3459.00  97.00   9.37  22.34 1651.00   6.23 1172.00   4.42
3606.00  97.00   9.88  23.46 1799.00   6.79 1326.00   5.00
3606.00  97.00   9.88  23.70 1799.00   6.79 1393.00   5.26
3606.00  97.00   9.88  23.94 1799.00   6.79 1460.00   5.51
3606.00  97.00   9.88  24.18 1799.00   6.79 1527.00   5.76
3606.00  97.00   9.88  24.32 1799.00   6.79 1567.00   5.91
3606.00  97.00   9.88  24.47 1799.00   6.79 1607.00   6.06
3606.00  97.00   9.88  24.61 1799.00   6.79 1647.00   6.21
3606.00  97.00   9.88  24.75 1799.00   6.79 1687.00   6.36
3606.00  97.00   9.88  24.89 1799.00   6.79 1727.00   6.52
3606.00  97.00   9.88  25.03 1799.00   6.79 1767.00   6.67
3606.00  97.00   9.88  25.17 1799.00   6.79 1807.00   6.82
3606.00  97.00   9.88  25.31 1799.00   6.79 1847.00   6.97
3606.00  97.00   9.88  25.45 1799.00   6.79 1887.00   7.12
3989.00  97.00   9.88  26.91 1799.00   6.79 1887.00   7.12
3989.00  97.00   9.96  26.91 1824.00   6.88 1887.00   7.12
3989.00  97.00  10.13  26.91 1874.00   7.07 1887.00   7.12
4039.00  97.00  10.13  27.10 1874.00   7.07 1887.00   7.12
4039.00  97.00  10.43  27.10 1960.00   7.39 1887.00   7.12
4039.00  97.00  10.65  27.10 2026.00   7.64 1887.00   7.12
4039.00  97.00  10.82  27.10 2077.00   7.84 1887.00   7.12
4039.00  97.00  10.82  27.43 2077.00   7.84 1984.00   7.48
4039.00  97.00  10.99  27.43 2130.00   8.04 1984.00   7.48
4039.00  97.00  10.99  27.64 2130.00   8.04 2046.00   7.72
4039.00  97.00  10.99  27.83 2130.00   8.04 2099.00   7.92
4039.00  97.00  10.99  28.04 2130.00   8.04 2160.00   8.15
4039.00  97.00  10.99  28.19 2130.00   8.04 2206.00   8.32
4039.00  97.00  10.99  28.40 2130.00   8.04 2267.00   8.55
4039.00  97.00  10.99  28.53 2130.00   8.04 2306.00   8.70

Retribution Gear:
                  Total %     pre-DR Dodge  pre-DR Parry
    STR    AGI  Dodge  Parry  Rating   Pct  Rating   Pct
510.00  97.00   3.01   5.27   0.00   0.00   0.00   0.00
737.00  97.00   3.01   6.30   0.00   0.00   0.00   0.00
1018.00  97.00   3.01   7.57   0.00   0.00   0.00   0.00
1244.00  97.00   3.01   8.57   0.00   0.00   0.00   0.00
1610.00  97.00   3.01  10.19   0.00   0.00   0.00   0.00
1837.00  97.00   3.01  11.18   0.00   0.00   0.00   0.00
2118.00  97.00   3.01  12.39   0.00   0.00   0.00   0.00
2399.00  97.00   3.01  13.60   0.00   0.00   0.00   0.00
2765.00  97.00   3.01  15.14   0.00   0.00   0.00   0.00
3047.00  97.00   3.01  16.32   0.00   0.00   0.00   0.00
3274.00  97.00   3.01  17.26   0.00   0.00   0.00   0.00
3501.00  97.00   3.01  18.19   0.00   0.00   0.00   0.00
3884.00  97.00   3.01  19.74   0.00   0.00   0.00   0.00
4292.00  97.00   3.01  21.37   0.00   0.00   0.00   0.00
4359.00  97.00   3.01  21.64   0.00   0.00   0.00   0.00
4426.00  97.00   3.01  21.90   0.00   0.00   0.00   0.00
4493.00  97.00   3.01  22.17   0.00   0.00   0.00   0.00
4533.00  97.00   3.01  22.32   0.00   0.00   0.00   0.00
4573.00  97.00   3.01  22.48   0.00   0.00   0.00   0.00
4613.00  97.00   3.01  22.64   0.00   0.00   0.00   0.00
4653.00  97.00   3.01  22.79   0.00   0.00   0.00   0.00
4693.00  97.00   3.01  22.95   0.00   0.00   0.00   0.00
4743.00  97.00   3.01  23.15   0.00   0.00   0.00   0.00
4793.00  97.00   3.01  23.33   0.00   0.00   0.00   0.00
4843.00  97.00   3.01  23.54   0.00   0.00   0.00   0.00
4893.00  97.00   3.01  23.73   0.00   0.00   0.00   0.00


First, I analyzed the dodge data, since that's the simplest. I already knew that it was pretty close to what we have on live based on Klaud's L90 data. I used the usual DR formula:
Code: Select all
totalDodge = baseDodge + 1/(1/C+k/preDodge)

Where totalDodge and preDodge are the values from the table, baseDodge is the 3.01% recorded initially, and C and k are the dodge cap and scale factor, respectively. C and k are the variables we're trying to find, of course. Using MATLAB's nonlinear least squares fitting algorithm to fit
Code: Select all
netDodge=totalDodge-baseDodge,
I get the following results:
Code: Select all
d2_try1_fit =

     General model:
     d2_try1_fit(x) = 1./(1./C+k./x)
     Coefficients (with 95% confidence bounds):
       C =       66.01  (65.28, 66.74)
       k =      0.8854  (0.8842, 0.8866)

d2_try1_gof =

           sse: 4.7067e-004
       rsquare: 1.0000
           dfe: 39
    adjrsquare: 1.0000
          rmse: 0.0035

You can see that the fit is very good - R squared value of one, very small SSE (sum of squares due to error) and RMSE (root mean squared error). One curious note is that the 95% confidence interval for C includes the current value (65.631440). Based on this, I guessed that the dodge cap is in fact unchanged from Cataclysm. So I decided to try fixing that parameter to just fit k:
Code: Select all
d2_try2_fit =

     General model:
     d2_try2_fit(x) = 1./(1./65.631440+k./x)
     Coefficients (with 95% confidence bounds):
       k =      0.8848  (0.8846, 0.885)

d2_try2_gof =

           sse: 4.8415e-004
       rsquare: 1.0000
           dfe: 40
    adjrsquare: 1.0000
          rmse: 0.0035

Or, graphically
Image

It's not surprising that this works just as well, but it nails down our C and k for dodge very nicely: C=65.631440, k=0.885. To summarize our conclusions and assumptions from this part:
Conclusion #1: The dodge cap ("C_d") at 85 is very close to the Cataclysm value, but the scale factor ("k_d") has changed slightly.
Assumption #1: The dodge cap at 85 is identical to the Cataclysm value, since it falls within experimental error of the value measured. C_d is 65.631440.
Conclusion #2: The scale factor has been reduced slightly from the Cataclysm value (k_d was 0.956, is now 0.885).


Next, I decided to fit the ret data. Since we're scaling only with strength, this should tell us very clearly whether the parry granted through strength is affected by diminishing returns, and if so, what the formula looks like. Traditionally the effects granted by base stats aren't affected by DR, so we're actually going to fit the following values:
Code: Select all
netParry = totalParry-baseParry
netStr = totalStr-baseStr

using the form
Code: Select all
netParry = 1/(1/C+k/(netStr/a))

In other words, we're using the usual DR equation, but this time with an additional scale factor a representing the strength-to-parry conversion. You may note that there's a redundancy in this formula - k and a aren't independently measurable. From the data though, it's clear that it takes between ~216 and ~236 strength to add 1% parry post-DR, so that gives us a rough starting point for a. Note that since k is less than one, the actual value of a will be a little higher (smaller k makes rating/strength more effective than the usual pre-DR conversion rate). If we fit the data with this in mind, we get:
Code: Select all
p1_try1_fit =

     General model:
     p1_try1_fit(x) = 1./(1./C+k./(x./a))
     Coefficients (with 95% confidence bounds):
       C =       235.1  (233.1, 237.1)
       a =       259.8  (-3.907e+006, 3.908e+006)
       k =        0.83  (-1.248e+004, 1.248e+004)

p1_try1_gof =

           sse: 3.6086e-004
       rsquare: 1.0000
           dfe: 23
    adjrsquare: 1.0000
          rmse: 0.0040

Again, excellent agreement. The huge ranges on a and k reflect the fact that those two values can't be determined independently this way (more on that in a second though). However, I noted that the fit puts k very close to the value found in the dodge fit. We also know that k is the same for dodge and parry in Cataclysm, and was the same for both in Wrath even when the two had different caps. It's not much of a stretch to guess that k_p = k_d in Mists as well. To confirm this, we try the fit again fixing k_p=k_d=0.885:
Code: Select all
p1_try2_fit =

     General model:
     p1_try2_fit(x) = 1./(1./C+0.885./(x./a))
     Coefficients (with 95% confidence bounds):
       C =       235.1  (233.4, 236.8)
       a =       243.7  (243.5, 243.8)

p1_try2_gof =

           sse: 3.6086e-004
       rsquare: 1.0000
           dfe: 24
    adjrsquare: 1.0000
          rmse: 0.0039

That seems reasonable, but how do we convince ourselves that this combination of k and a is any more valid than another combination? The answer is base parry. While naked, we should have about 3% parry plus the parry generated from base strength. A quick calculation shows:
Code: Select all
baseStr/243.7 = 0.6730

which is 0.67 when rounded, consistent with our baseParry value of 3.67. The baseParry calculation is only so accurate though - due to rounding, baseStr gives 0.67% for any value of a between 243 and 246.6. But the curve fitting puts a tighter bound on a (243.5 to 243.8). If we perform one final fit to this data, fixing a=243.7, we get a slightly tighter range of values for C:
Code: Select all
p1_try3_fit =

     General model:
     p1_try3_fit(x) = 1./(1./C+0.885./(x./243.7))
     Coefficients (with 95% confidence bounds):
       C =       235.5  (235.2, 235.9)

p1_try3_gof =

           sse: 3.6493e-004
       rsquare: 1.0000
           dfe: 25
    adjrsquare: 1.0000
          rmse: 0.0038

Or again, graphically:
Image

At this point I stopped looking at the level 85 data and returned to Klaud's L90 data set. I could of course try to perform a multi-dimensional fit to the level 85 parry data from prot gear, which has both strength and parry rating, but I decided this wasn't necessary. I had gotten what I needed from the 85 data, which was information about C_d, k_d, C_p, k_p, and the fact that parry gained through strength is definitely affected by diminishing returns. What remained was to determine whether any of those values changed with character level, and that would only be determined by looking at the L90 data.

To summarize the assumptions and conclusions in this part:
Assumption #1: k_d=k_p.
Conclusion #1: Assuming k_d=k_p gives us a good fit with a value of a that is consistent with the amount of parry gained from base strength.
Conclusion #2: Under this assumption, C_p is around 235.
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
Simcraft 6.x, Call to Arms 6.0, Talent Spec & Glyph Guide 6.x, Blog: Sacred Duty
User avatar
theckhd
Moderator
 
Posts: 8003
Joined: Thu Jul 31, 2008 3:06 pm
Location: Harrisburg, PA

Re: A Call to Arms - MoP Mechanics Testing

Postby theckhd » Fri Jun 29, 2012 8:28 am

The file containing the data and calculations for this section is here: dr_eqn_data_L90.m

First, let's start with what we already know. From Simcraft's datamining, we know the rating conversion factors for dodge and parry are both 1035. Klaud's naked data set tells us that:
Code: Select all
baseStr=176
baseDodge=3.01
baseParry=3.19


Klaud's data set is fairly extensive, but very scattered. Rather than try to reproduce it all in a table, I'm just going to give the portions that are relevant to each section. First, we'll look at dodge since that's easy:
Code: Select all
Dodge data, in %
    pre-DR   post-DR
    2.8000    6.0300
    2.9700    6.2100
    3.3000    6.5400
    2.2400    5.4500
    3.0200    6.2600
    2.5800    5.8000
    3.3600    6.6000
    3.1900    6.4300
    0.8000    3.9100
    1.1200    4.2500
    1.4100    4.5600
    1.6800    4.8500
    1.8600    5.0400
    2.0800    5.2800
    2.1800    5.3900
    2.4700    5.6800
    2.7600    5.9800
    3.0800    6.3100
    3.3400    6.5800
    3.6200    6.8600
    3.8300    7.0700

Remember that the post-DR values have base dodge built-in, which is why they're so much higher. The pre-DR values are read directly from the parry tooltip. If we pretend we don't know anything about the constants, and just try to fit with the old DR formula plus base dodge b, we get this:
Code: Select all
d1_fit =

     General model:
     d1_fit(x) = b+1./(1./C+k./x)
     Coefficients (with 95% confidence bounds):
       C =       72.31  (58.09, 86.53)
       b =       3.017  (2.999, 3.035)
       k =      0.8914  (0.8781, 0.9047)

d1_gof =

           sse: 4.1960e-004
       rsquare: 1.0000
           dfe: 18
    adjrsquare: 1.0000
          rmse: 0.0048

Not bad, though the ranges for K, b, and C are all pretty wide. We again note that the Cataclysm/MoP level 85 value for C falls within the confidence interval. In addition, we know that b=3.01, so let's try and fit again with those two constraints:
Code: Select all
d2_fit =

     General model:
     d2_fit(x) = 3.01+1./(1./65.631440+k./x)
     Coefficients (with 95% confidence bounds):
       k =       0.885  (0.8843, 0.8857)

d2_gof =

           sse: 4.4994e-004
       rsquare: 1.0000
           dfe: 20
    adjrsquare: 1.0000
          rmse: 0.0047

In other words, exactly like the L85 data. From this we can conclude that the formulas do not change with character level.

Conclusion: The combination of this data and the L85 data suggests that the dodge equation is exactly:
Code: Select all
totalDodge = baseDodge + 1/(1/C_d + k/bonusDodge)
baseDodge = 3.01
C_d = 65.631440
k = 0.885

with bonusDodge being the dodge from all other sources. For us, this is just dodge rating. Presumably for bears/monks, this will include the dodge gained from (totalAgi-baseAgi).

--------------

Onward to parry. Klaud has provided us with a number of parry data sets that cover a pretty broad range of strength and parry rating. First, we'll look at a subset of that data that keeps parry rating fixed. There are actually two data sets like this, at different parry ratings:
Code: Select all
Set 1: fixed at 2.10% parry from rating
Str      post-DR parry
3638.00   9.50
4242.00  10.17
4752.00  10.74
5477.00  11.55
6115.00  12.25
6606.00  12.79
7210.00  13.44
7935.00  14.23
8779.00  15.13

Set 2: fixed at 1.15% parry from rating
Str        post-DR parry
1350.00    5.85
2236.00    6.87
2870.00    7.60
3631.00    8.46
4602.00    9.56
5236.00   10.27
5870.00   10.98
6389.00   11.55
7056.00   12.28
7817.00   13.12
8578.00   13.94
9548.00   14.99
10309.00   15.80


I attempted to fit these sets of data two different ways: once with a linear fit totalParry = b + Str./a, and once with the full DR equation:
Code: Select all
b+baseStr./a+1./(1./235.5+0.885./(2.1+(x-baseStr)./a))

Here, I've used the L85 values of k and C_p, since the L90 dodge data suggests that the constants don't change. While it is possible, of course, that C_p changes with level while C_d does not, that seems very unlikely. What we ideally want to nail down with this data set is a, the strength-to-parry conversion factor, which is level-dependent. If we perform these fits on the first data set, these are the results:

Code: Select all
ps1_fit =
     General model:
     ps1_fit(x) = b+x./a
     Coefficients (with 95% confidence bounds):
       a =       911.9  (905.3, 918.6)
       b =       5.529  (5.478, 5.579)

ps1_gof =
           sse: 0.0019
       rsquare: 0.9999
           dfe: 7
    adjrsquare: 0.9999
          rmse: 0.0164

Code: Select all
ps2_fit =
     General model:
     ps2_fit(x) = b+176./a+1./(1./235.5+0.885./(2.1+(x-176)./a))
     Coefficients (with 95% confidence bounds):
       a =       952.3  (950.6, 954)
       b =       3.006  (2.994, 3.018)

ps2_gof =
           sse: 1.0177e-004
       rsquare: 1.0000
           dfe: 7
    adjrsquare: 1.0000
          rmse: 0.0038

As you can see, both fits are pretty good. But the proper DR version is better than the linear approximation. This does explain why I had so much trouble fitting the L90 data initially though - we're so low on the DR curve that everything still looks pretty linear.

Nonetheless, the second fit gives us a pretty good estimate of a, roughly 952. b is also consistent with what we expect for baseParry, which should be 3.00 or 3.01 (unclear, since baseDodge=3.01 despite not having any other sources of dodge). Fitting the second data set gives similar results:
Code: Select all
ps3_fit =
     General model:
     ps3_fit(x) = b+x./a
     Coefficients (with 95% confidence bounds):
       a =       900.3  (893, 907.7)
       b =       4.417  (4.359, 4.475)

ps3_gof =
           sse: 0.0177
       rsquare: 0.9998
           dfe: 11
    adjrsquare: 0.9998
          rmse: 0.0402

Code: Select all
ps4_fit =
     General model:
     ps4_fit(x) = b+176./a+1./(1./235.5+0.885./(1.15+(x-176)./a))
     Coefficients (with 95% confidence bounds):
       a =       951.9  (951.2, 952.5)
       b =           3  (2.995, 3.004)

ps4_gof =
           sse: 1.0299e-004
       rsquare: 1.0000
           dfe: 11
    adjrsquare: 1.0000
          rmse: 0.0031

At this point, my best estimate of the two parameters are b=3.00 and a=952.

At this point, we can try to tackle the entire parry data set, given below:
Code: Select all
     Str  pre-DR  post-DR
4914.00    1.41   10.19
5308.00    1.51   10.73
5483.00    1.27   10.68
5956.00    1.26   11.19
6123.00    1.38   11.50
6371.00    1.28   11.67
6589.00    0.80   11.40
6751.00    0.80   11.58
6430.00    0.55   10.96
6430.00    0.81   11.24
6430.00    1.09   11.53
6430.00    1.33   11.79
6430.00    1.67   12.14
6430.00    1.93   12.41
6430.00    2.27   12.76
6430.00    2.57   13.07
6430.00    2.75   13.26
9354.00    0.76   14.38
9354.00    1.21   14.84
9354.00    1.46   15.10
9354.00    1.66   15.29
9354.00    1.84   15.48
9354.00    2.13   15.77
9354.00    2.34   15.98
9354.00    2.63   16.28
9354.00    3.00   16.65
3638.00    2.10    9.50
4242.00    2.10   10.17
4752.00    2.10   10.74
5477.00    2.10   11.55
6115.00    2.10   12.25
6606.00    2.10   12.79
7210.00    2.10   13.44
7935.00    2.10   14.23
8779.00    2.10   15.13
1350.00    1.15    5.85
2236.00    1.15    6.87
2870.00    1.15    7.60
3631.00    1.15    8.46
4602.00    1.15    9.56
5236.00    1.15   10.27
5870.00    1.15   10.98
6389.00    1.15   11.55
7056.00    1.15   12.28
7817.00    1.15   13.12
8578.00    1.15   13.94
9548.00    1.15   14.99
10309.00    1.15   15.80

Again, pre-DR is just the component of pre-DR parry provided by parry rating. We start with a very open expression, leaving all of the parameters free:
Code: Select all
     General model:
     p1_fit(x,y) = b+176./a+1./(1./C+k./((x-176)./a+y))
     Coefficients (with 95% confidence bounds):
       C =         234  (226.3, 241.6)
       a =       951.7  (949.6, 953.8)
       b =       3.001  (2.989, 3.013)
       k =       0.885  (0.8819, 0.8882)

p1_gof =
           sse: 7.5968e-004
       rsquare: 1.0000
           dfe: 44
    adjrsquare: 1.0000
          rmse: 0.0042

Not bad at all. All four parameters ended up very close to the expected values. The range on C and a are still pretty broad, however. To tighten those up, we fix k=0.885 and b=3.00, since we're pretty sure about those two. That gives us:
Code: Select all
     General model:
     p2_fit(x,y) = 3.00+176./a+1./(1./C+0.885./((x-176)./a+y))
     Coefficients (with 95% confidence bounds):
       C =       233.5  (230.4, 236.6)
       a =       951.5  (950.8, 952.2)

p2_gof =
           sse: 7.6093e-004
       rsquare: 1.0000
           dfe: 46
    adjrsquare: 1.0000
          rmse: 0.0041

We're getting closer. At this point, I decided to assume that our C_p from the L85 data was exact. This seems pretty reasonable given that we don't think it changes with level, and our L85 data was much better-suited to giving us an accurate value for C_p. So we set C=235.5 and see what the algorithm spits out for a:
Code: Select all
     General model:
     p3_fit(x,y) = 3.00+176./a+1./(1./235.5+0.885./((x-176)./a+y))
     Coefficients (with 95% confidence bounds):
       a =         952  (951.8, 952.1)

p3_gof =
           sse: 7.8737e-004
       rsquare: 1.0000
           dfe: 47
    adjrsquare: 1.0000
          rmse: 0.0041

Which is exactly what we expected based on our str data subset.

For the visually-inclined, here's a surface plot showing the fit and the data:
Image

And the residuals:
Image

Conclusion: this data suggests that the parry equation at level 90 is:
Code: Select all
totalParry=baseParry+baseStr./a+1./(1./C_p+k./((totalStr-baseStr)./a+bonusParry))
baseParry=3.00
baseStr=176
a=952
C_p=235.5
k=0.885

with bonusParry being the pre-DR parry granted by parry rating.
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
Simcraft 6.x, Call to Arms 6.0, Talent Spec & Glyph Guide 6.x, Blog: Sacred Duty
User avatar
theckhd
Moderator
 
Posts: 8003
Joined: Thu Jul 31, 2008 3:06 pm
Location: Harrisburg, PA

Re: A Call to Arms - MoP Mechanics Testing

Postby theckhd » Fri Jun 29, 2012 8:28 am

The new build today added 2% dodge to Sanctuary, and while I haven't tested it yet, it's very likely that it will not be affected by diminishing returns. So to summarize the last two posts, the new dodge and parry DR equations are:

Code: Select all
Dodge = baseDodge + sancDodge + 1/(1/C_d + k/bonusDodge)

Parry = baseParry + baseStr/Q + 1/(1/C_p + k/(bonusParry+(Str-baseStr)/Q))


with the following constants:
Code: Select all
baseDodge = 3.01
sancDodge = 2
baseParry = 3.00
baseStr = varies per race
C_d = 65.631440
C_p = 235.5
k = 0.885
Q = 952

bonusDodge is the pre-DR dodge from dodge rating (shown in the tooltip) and bonusParry is the pre-DR parry from parry rating (shown in the tooltip). I chose Q to represent the Strength-to-Parry conversion factor because it takes us from "S" to "P" in "PQRS", and Q is more fun than R.

Now that we have the formulas, let's look at what they mean. First of all, here are the DR curves plotted for you:
Image
It's clear that by 10% worth of dodge rating, we're already seeing the effects of diminishing returns (which is why the L90 dodge data was easy to fit). But it takes 2-3 times as much parry to start seeing distinct curvature. What this means for tanks is that our gearing is going to be very lopsided - we're going to want a lot more parry than we have dodge.

To illustrate that more clearly, let's look at the differential gain in avoidance. The following plot shows how much avoidance you gain by adding 1% pre-DR avoidance, plotted as a function of your post-DR avoidance level. To put that in less technical terms: if you already have X% post-DR dodge, then adding another 1% pre-DR dodge will give you Y% post-DR dodge, where X and Y are the values on the plot. The dotted lines are guides to help us see how much parry we should have at 10%, 15%, and 20% dodge - in other words, to keep dodge and parry balanced such that adding Z parry rating is equivalent to adding Z dodge rating. Note that I've already included base dodge and parry in this plot, so that's accounted for.
Image

This plot tells us exactly how bad the discrepancy between dodge and parry is. If we have 10% total dodge on our character sheet, we'd want to stack up to 21% parry to make sure that we're not being inefficient with our diminishing returns. And it gets worse as we go higher - at 15% total dodge, we'd want 39% parry, and at 20% dodge we'd want 57% parry. The ideal ratio of parry:dodge gets larger as we stack more dodge (though to be fair, this is only because of base dodge and parry - the ideal ratio of pre-DR parry and dodge is a constant).

We can express this mathematically as follows. The differential gain in post-DR dodge and parry dA_d and dA_p due to a small amount of pre-DR dodge and parry da_d and da_p are:
Code: Select all
dA_d = (1/k)(1-A_d/C_d)^2 da_d
dA_p = (1/k)(1-A_p/C_p)^2 da_p

If we set dA_d = dA_p and da_d = da_p, we can solve for A_p in terms of A_d:
Code: Select all
A_p = (C_p/C_d)*A_d

Note that A_p and A_d are the post-DR values ignoring base dodge and parry, i.e. T_p = B_p + A_p and T_d = B_d + A_d, where T_i and B_i are the total and base values of dodge and parry (i is d or p). If we want to compare total parry T_p to total dodge T_d, we get:
Code: Select all
T_p = B_p + (C_p/C_d)(T_d-B_d)

which we could plot if we wanted to know exactly how much parry we should aim for at a given dodge level. If you're interested, here is that plot.

We can also consider the ideal parry-to-dodge ratio, R_pd = T_p/T_d. That's simply:
Code: Select all
R_pd = T_p/T_d = C_p/C_d - ((C_p/C_d)B_d-B_p)/T_d

which looks like this when plotted:
Image
As you can see, the ideal parry-to-dodge ratio quickly jumps up to 2:1 and then slowly increases to 3:1 and higher as you stack more dodge. It saturates at C_p/C_d = 3.588.

In summary, we're going to value parry a lot more than dodge at level 90.

Note that while I have only tested this with a paladin, it's a reasonable assumption that these formulas will work for warriors and DKs. And likely for Monks as well, if they can parry (I think they can, but I haven't been paying much attention to them). Since druids can't parry, their DR formula is likely to have a different(i.e. much higher) value of C_d, otherwise they'll be severely disadvantaged compared to tanks that can parry.
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
Simcraft 6.x, Call to Arms 6.0, Talent Spec & Glyph Guide 6.x, Blog: Sacred Duty
User avatar
theckhd
Moderator
 
Posts: 8003
Joined: Thu Jul 31, 2008 3:06 pm
Location: Harrisburg, PA

Re: A Call to Arms - MoP Mechanics Testing

Postby KysenMurrin » Fri Jun 29, 2012 9:39 am

Your first set of data up there, you've labelled "Rating" above Dodge/Parry columns, then "Pre-DR %" above Dodge/Parry columns, but looks like the numbers go rating, %, rating, %.
Temporarily playing WoW again.
Donnan - Nangun - Kysen - Kysen - Mardun - Timkins

Mostly-Book Blog.
KysenMurrin
 
Posts: 6984
Joined: Thu Jun 26, 2008 6:37 am
Location: UK

Re: A Call to Arms - MoP Mechanics Testing

Postby theckhd » Fri Jun 29, 2012 9:43 am

KysenMurrin wrote:Your first set of data up there, you've labelled "Rating" above Dodge/Parry columns, then "Pre-DR %" above Dodge/Parry columns, but looks like the numbers go rating, %, rating, %.

Thanks, fixed.
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
Simcraft 6.x, Call to Arms 6.0, Talent Spec & Glyph Guide 6.x, Blog: Sacred Duty
User avatar
theckhd
Moderator
 
Posts: 8003
Joined: Thu Jul 31, 2008 3:06 pm
Location: Harrisburg, PA

Re: A Call to Arms - MoP Mechanics Testing

Postby KysenMurrin » Sat Jun 30, 2012 6:55 am

It's such a tiny thing it shouldn't make a difference, but I noticed this:
baseParry, which should be 3.00 or 3.01 (unclear, since baseDodge=3.01 despite not having any other sources of dodge).

And I thought it might be helpful to look at other classes, so I did. And it didn't really help.

Naked, 85 unspecced dwarf Paladin: 3.01 dodge, 3.69 parry

Agi classes:
Naked 86 Pandaren Windwalker Monk: 3.33 dodge, 8.01 parry (5% from Sparring passive)
Naked 87 Dwarf Enhancement Shaman: 3.15 dodge, 3.01 parry

Caster:
85 Gnome Mage: 3.00 dodge, can't parry.

I was thinking I'd see 3.01% everywhere until I tried that last one...
Temporarily playing WoW again.
Donnan - Nangun - Kysen - Kysen - Mardun - Timkins

Mostly-Book Blog.
KysenMurrin
 
Posts: 6984
Joined: Thu Jun 26, 2008 6:37 am
Location: UK

Re: A Call to Arms - MoP Mechanics Testing

Postby theckhd » Mon Jul 02, 2012 9:59 am

It is fairly odd, and I don't have a good guess as to why they vary. The Agi classes get agi->dodge conversions, so those aren't surprising.

I'm going to try and crank through Klaud's spell data today and tomorrow, which should make it clear whether we need more data or not. In the meantime, I have a question about how Sanctified Wrath works. I'm assuming that during Avenging Wrath, Judgment's cooldown simply starts at 3s instead of 6s. But what happens if J is already on cooldown when you cast AW? Does it halve the remaining cooldown, chop 3 seconds off of the remaining cooldown, or do nothing at all?
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
Simcraft 6.x, Call to Arms 6.0, Talent Spec & Glyph Guide 6.x, Blog: Sacred Duty
User avatar
theckhd
Moderator
 
Posts: 8003
Joined: Thu Jul 31, 2008 3:06 pm
Location: Harrisburg, PA

Re: A Call to Arms - MoP Mechanics Testing

Postby KysenMurrin » Mon Jul 02, 2012 10:30 am

Asnwer: The cooldown continues as normal if you cast Avenging Wrath while it is on cooldown. Several tries and I only ever got the full 6 seconds.

At the other end, if Judgment is on cooldown when Avenging Wrath expires, the cooldown stays at 3 seconds until the current cooldown is complete. (Again, tried this more than once: the tooltip doesn't update when AW expires, it updates when the 3 second cooldown finishes.)
Temporarily playing WoW again.
Donnan - Nangun - Kysen - Kysen - Mardun - Timkins

Mostly-Book Blog.
KysenMurrin
 
Posts: 6984
Joined: Thu Jun 26, 2008 6:37 am
Location: UK

Re: A Call to Arms - MoP Mechanics Testing

Postby theckhd » Mon Jul 02, 2012 10:39 am

Thanks
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
Simcraft 6.x, Call to Arms 6.0, Talent Spec & Glyph Guide 6.x, Blog: Sacred Duty
User avatar
theckhd
Moderator
 
Posts: 8003
Joined: Thu Jul 31, 2008 3:06 pm
Location: Harrisburg, PA

Re: A Call to Arms - MoP Mechanics Testing

Postby theckhd » Tue Jul 03, 2012 11:25 am

Klaud: for your #28 tests, do you have the details of the weapon you used? Ideally I'd like character sheet information in addition to the weapon itself.
"Theck, Bringer of Numbers and Pounding Headaches," courtesy of Grehn|Skipjack.
Simcraft 6.x, Call to Arms 6.0, Talent Spec & Glyph Guide 6.x, Blog: Sacred Duty
User avatar
theckhd
Moderator
 
Posts: 8003
Joined: Thu Jul 31, 2008 3:06 pm
Location: Harrisburg, PA

Re: A Call to Arms - MoP Mechanics Testing

Postby Klaudandus » Tue Jul 03, 2012 12:11 pm

for #28, I used the club. The original text tilpt had was asking to use the club. If you need me to do it with a different weapon, I'll have to do that tomorrow.

http://mop.wowhead.com/item=2130
The Element of Forum Hyperbole
Image
---
Flüttershy - Draenei Protection Paladin, Aerie Peak
Klaudandus - BE Protection Paladin, Feathermoon (Semi-retired)
User avatar
Klaudandus
 
Posts: 11223
Joined: Thu Apr 02, 2009 7:08 am
Location: Texas' Armpit

PreviousNext

Return to Advanced Theorycraft and Calculations

Who is online

Users browsing this forum: Minkus, Schroom and 1 guest

Who is online

In total there are 3 users online :: 2 registered, 0 hidden and 1 guest (based on users active over the past 5 minutes)
Most users ever online was 380 on Tue Oct 14, 2008 6:28 pm

Users browsing this forum: Minkus, Schroom and 1 guest