diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/gregtech/api/util/GT_OverclockCalculator.java | 19 | ||||
-rw-r--r-- | src/test/java/gregtech/overclock/GT_OverclockCalculator_UnitTest.java | 32 |
2 files changed, 47 insertions, 4 deletions
diff --git a/src/main/java/gregtech/api/util/GT_OverclockCalculator.java b/src/main/java/gregtech/api/util/GT_OverclockCalculator.java index f721ffc225..582b65e7ec 100644 --- a/src/main/java/gregtech/api/util/GT_OverclockCalculator.java +++ b/src/main/java/gregtech/api/util/GT_OverclockCalculator.java @@ -398,7 +398,7 @@ public class GT_OverclockCalculator { double recipePowerTier = calculateRecipePowerTier(heatDiscountMultiplier); double machinePowerTier = calculateMachinePowerTier(); - // Math.log(a) / Math.log(b) equals to log_b (a) + overclockCount = calculateAmountOfNeededOverclocks(machinePowerTier, recipePowerTier); if (recipeVoltage <= GT_Values.V[0]) { overclockCount = Math.min(overclockCount, calculateRecipeToMachineVoltageDifference()); @@ -470,11 +470,26 @@ public class GT_OverclockCalculator { /** * Calculates the amount of overclocks needed to reach 1 ticking + * + * Here we limit "the tier difference overclock" amount to a number + * of overclocks needed to reach 1 tick duration, for example: + * + * recipe initial duration = 250 ticks (12,5 seconds LV(1)) + * we have LCR with IV(5) energy hatch, which overclocks at 4/4 rate + * + * log_4 (250) ~ 3,98 is the number of overclocks needed to reach 1 tick + * + * to calculate log_a(b) we can use the log property: + * log_a(b) = log_c(b) / log_c(a) + * in our case we use natural log base as 'c' + * + * as a final step we apply Math.ceil(), + * otherwise for fractional nums like 3,98 we will never reach 1 tick */ private int calculateAmountOfNeededOverclocks(double machinePowerTier, double recipePowerTier) { return (int) Math.min( calculateAmountOfOverclocks(machinePowerTier, recipePowerTier), - Math.log(duration) / Math.log(1 << durationDecreasePerOC)); + Math.ceil(Math.log(duration) / Math.log(1 << durationDecreasePerOC))); } private double calculateHeatDiscountMultiplier() { diff --git a/src/test/java/gregtech/overclock/GT_OverclockCalculator_UnitTest.java b/src/test/java/gregtech/overclock/GT_OverclockCalculator_UnitTest.java index d9343a9273..7aab323d7e 100644 --- a/src/test/java/gregtech/overclock/GT_OverclockCalculator_UnitTest.java +++ b/src/test/java/gregtech/overclock/GT_OverclockCalculator_UnitTest.java @@ -301,7 +301,21 @@ class GT_OverclockCalculator_UnitTest { .setOneTickDiscount(true) .calculate(); assertEquals(1, calculator.getDuration(), messageDuration); - assertEquals(480 >> 3, calculator.getConsumption(), messageEUt); + + /** + * duration with speedboost = 5 + * log_2(5) ~ 2.3; + * round up to 3 to reach one tick duration + */ + int overclocksTillOneTick = 3; + int overclocksBeyondOneTick = 2; + + // 3 overclocks, each gives 4x consumption growth per tick (1920) + long targetEUt = VP[1] << 2 * overclocksTillOneTick; + // 2 remaining overclocks are beyond 1 tick, each provides 2x comsumption discount (480) + targetEUt >>= overclocksBeyondOneTick; + + assertEquals(targetEUt, calculator.getConsumption(), messageEUt); } @Test @@ -313,8 +327,22 @@ class GT_OverclockCalculator_UnitTest { .enablePerfectOC() .setOneTickDiscount(true) .calculate(); + + /** + * duration with speedboost = 18 + * log_4(18) ~ 2.08; + * round up to 3 to reach one tick duration + */ + int overclocksTillOneTick = 3; + int overclocksBeyondOneTick = 2; + + // 3 overclocks, each gives 4x consumption growth per tick (1920) + long targetEUt = VP[1] << 2 * overclocksTillOneTick; + // 2 remaining overclocks are beyond 1 tick, each provides 4x comsumption discount (120) + targetEUt >>= 2 * overclocksBeyondOneTick; + + assertEquals(targetEUt, calculator.getConsumption(), messageEUt); assertEquals(1, calculator.getDuration(), messageDuration); - assertEquals(480 >> 6, calculator.getConsumption(), messageEUt); } @Test |