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());
        }
Esempio n. 3
0
        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;
        }