private void HotStreakUtilization_Click(object sender, RoutedEventArgs e) { string armor = "Molten Armor"; CalculationOptionsMage calculationOptions = Character.CalculationOptions as CalculationOptionsMage; CalculationsMage calculations = (CalculationsMage)Calculations.Instance; Solver solver = new Solver(Character, calculationOptions, false, false, false, 0, armor, false, false, true, false); solver.Initialize(null); CastingState baseState = new CastingState(solver, 0, false, 0); FireCycleGenerator generator = new FireCycleGenerator(baseState); GenericCycle c1 = new GenericCycle("test", baseState, generator.StateList, true); Cycle c2 = baseState.GetCycle(CycleId.FBLBPyro); Dictionary <string, SpellContribution> dict1 = new Dictionary <string, SpellContribution>(); Dictionary <string, SpellContribution> dict2 = new Dictionary <string, SpellContribution>(); c1.AddDamageContribution(dict1, 1.0f); c2.AddDamageContribution(dict2, 1.0f); float predicted = dict2["Pyroblast"].Hits / dict2["Fireball"].Hits; float actual = dict1["Pyroblast"].Hits / dict1["Fireball"].Hits; StringBuilder sb = new StringBuilder(); sb.AppendLine("Pyro/Nuke Ratio:"); sb.AppendLine(); sb.AppendLine("Approximation Model: " + predicted); sb.AppendLine("Exact Model: " + actual); sb.AppendLine(); // predicted = raw * (1 - wastedold) // actual = raw * (1 - wasted) // wasted = 1 - actual / predicted * (1 - wastedold) sb.AppendLine("Predicted Wasted Hot Streaks: " + (1 - actual / predicted)); MessageBox.Show(sb.ToString()); }
private void HotStreakUtilization_Click(object sender, RoutedEventArgs e) { string armor = "Molten Armor"; CalculationOptionsMage calculationOptions = Character.CalculationOptions as CalculationOptionsMage; CalculationsMage calculations = (CalculationsMage)Calculations.Instance; Solver solver = new Solver(Character, calculationOptions, false, false, false, 0, armor, false, false, true, false, true, false, false); solver.Initialize(null); CastingState baseState = new CastingState(solver, 0, false, 0); FireCycleGenerator generator = new FireCycleGenerator(baseState); GenericCycle c1 = new GenericCycle("test", baseState, generator.StateList, true); Cycle c2 = baseState.GetCycle(CycleId.FBLBPyro); Dictionary<string, SpellContribution> dict1 = new Dictionary<string, SpellContribution>(); Dictionary<string, SpellContribution> dict2 = new Dictionary<string, SpellContribution>(); c1.AddDamageContribution(dict1, 1.0f, 0); c2.AddDamageContribution(dict2, 1.0f, 0); float predicted = dict2["Pyroblast"].Hits / dict2["Fireball"].Hits; float actual = dict1["Pyroblast"].Hits / dict1["Fireball"].Hits; StringBuilder sb = new StringBuilder(); sb.AppendLine("Pyro/Nuke Ratio:"); sb.AppendLine(); sb.AppendLine("Approximation Model: " + predicted); sb.AppendLine("Exact Model: " + actual); sb.AppendLine(); // predicted = raw * (1 - wastedold) // actual = raw * (1 - wasted) // wasted = 1 - actual / predicted * (1 - wastedold) sb.AppendLine("Predicted Wasted Hot Streaks: " + (1 - actual / predicted)); MessageBox.Show(sb.ToString()); }
public static Cycle GetCycle(bool needsDisplayCalculations, CastingState castingState) { CycleId[] cycleIds = castingState.Solver.UseIncrementalOptimizations ? castingState.CalculationOptions.IncrementalSetManaNeutralMix : globalCycleIds; List<Cycle> cycles = new List<Cycle>(); foreach (var cid in cycleIds) { cycles.Add(castingState.GetCycle(cid)); } cycles.Sort((c1, c2) => c1.ManaPerSecond.CompareTo(c2.ManaPerSecond)); if (cycles[0].ManaPerSecond > 0) { //return cycles[0]; Cycle cycle = Cycle.New(needsDisplayCalculations, castingState); cycle.Name = "ArcaneManaNeutral"; if (needsDisplayCalculations) { cycle.Note = string.Format("Mix {0:F}% {1}", 100, cycles[0].Name); } cycle.Mix1 = cycles[0].CycleId; cycle.Mix2 = CycleId.None; cycle.AddCycle(needsDisplayCalculations, cycles[0], 1); cycle.DpmConversion = 0; cycle.Calculate(); return cycle; } int i = 0; while (i < cycles.Count) { double maxDpm = 0; int maxj = -1; for (int j = i + 1; j < cycles.Count; j++) { double dpm = (cycles[j].DamagePerSecond - cycles[i].DamagePerSecond) / (cycles[j].ManaPerSecond - cycles[i].ManaPerSecond); if (dpm > maxDpm) { maxDpm = dpm; maxj = j; } } if (maxj != -1) { if (cycles[maxj].ManaPerSecond >= 0) { // mps1 + k * (mps2 - mps1) double k = -cycles[i].ManaPerSecond / (cycles[maxj].ManaPerSecond - cycles[i].ManaPerSecond); Cycle cycle = Cycle.New(needsDisplayCalculations, castingState); cycle.Name = "ArcaneManaNeutral"; if (needsDisplayCalculations) { cycle.Note = string.Format("Mix {0:F}% {1} and {2:F}% {3}", 100 * (1 - k), cycles[i].Name, 100 * k, cycles[maxj].Name); } cycle.Mix1 = cycles[i].CycleId; cycle.Mix2 = cycles[maxj].CycleId; cycle.AddCycle(needsDisplayCalculations, cycles[i], (1 - k) / cycles[i].CastTime); cycle.AddCycle(needsDisplayCalculations, cycles[maxj], k / cycles[maxj].CastTime); cycle.DpmConversion = maxDpm; cycle.Calculate(); return cycle; } i = maxj; } else { // we've run out of cycles //return cycles[i]; Cycle cycle = Cycle.New(needsDisplayCalculations, castingState); cycle.Name = "ArcaneManaNeutral"; if (needsDisplayCalculations) { cycle.Note = string.Format("Mix {0:F}% {1}", 100, cycles[i].Name); } cycle.Mix1 = cycles[i].CycleId; cycle.Mix2 = CycleId.None; cycle.AddCycle(needsDisplayCalculations, cycles[i], 1); cycle.DpmConversion = 0; cycle.Calculate(); return cycle; } } return null; }