This commit is contained in:
Mark Wolters 2024-03-19 14:06:30 -04:00 committed by Jonathan Shook
parent 33483ad2d7
commit fc574eceb2
3 changed files with 40 additions and 50 deletions

View File

@ -25,23 +25,16 @@ import io.nosqlbench.engine.core.lifecycle.scenario.container.NBCommandParams;
import io.nosqlbench.engine.core.lifecycle.scenario.execution.NBBaseCommand;
import io.nosqlbench.nb.api.components.events.ParamChange;
import io.nosqlbench.scenarios.simframe.SimFrameUtils;
import io.nosqlbench.scenarios.simframe.capture.JournalView;
import io.nosqlbench.scenarios.simframe.capture.SimFrameCapture;
import io.nosqlbench.scenarios.simframe.capture.SimFrameJournal;
import io.nosqlbench.scenarios.simframe.capture.SimFrameValueData;
import io.nosqlbench.scenarios.simframe.optimizers.CMD_optimize;
import io.nosqlbench.scenarios.simframe.planning.HoldAndSample;
import io.nosqlbench.scenarios.simframe.planning.SimFrame;
import io.nosqlbench.scenarios.simframe.planning.SimFrameFunction;
import org.apache.commons.math4.legacy.exception.MathIllegalStateException;
import org.apache.commons.math4.legacy.optim.OptimizationData;
import org.apache.commons.math4.legacy.optim.PointValuePair;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.PrintWriter;
import java.io.Reader;
import java.util.Comparator;
public class CMD_findmax extends NBBaseCommand {
private final static Logger logger = LogManager.getLogger(CMD_optimize.class);
@ -62,8 +55,8 @@ public class CMD_findmax extends NBBaseCommand {
FindmaxConfig findmaxConfig = new FindmaxConfig(params);
model.add("rate",
findmaxConfig.rate_base(), // min
findmaxConfig.rate_base(), // initial
findmaxConfig.base_value(), // min
findmaxConfig.base_value(), // initial
findmaxConfig.sample_max(), // max
rate -> flywheel.onEvent(ParamChange.of(new CycleRateSpec(
rate,
@ -72,15 +65,15 @@ public class CMD_findmax extends NBBaseCommand {
);
SimFrameCapture capture = new SimFrameValueData(flywheel);
SimFrameFunction frameFunction = new FindmaxFrameFunction(controller, findmaxConfig, flywheel, capture, journal, model);
double[] initialPoint = {findmaxConfig.rate_base()};
FindmaxFrameFunction frameFunction = new FindmaxFrameFunction(controller, findmaxConfig, flywheel, capture, journal, model);
double[] initialPoint = {findmaxConfig.base_value()};
double result = frameFunction.value(initialPoint);
while (result != 0.0d) {
result = ((FindmaxFrameFunction) frameFunction).nextStep();
result = frameFunction.nextStep();
}
SimFrame<FindmaxFrameParams> best = ((FindmaxFrameFunction)frameFunction).journal().bestRun();
stdout.println("bestrun:\n" + best);
SimFrame<FindmaxFrameParams> best = frameFunction.journal().bestRun();
stdout.println("Best Run:\n" + best);
return best.params();
}

View File

@ -21,9 +21,9 @@ import io.nosqlbench.engine.core.lifecycle.scenario.container.NBCommandParams;
public class FindmaxConfig {
private double sample_time_ms;
private double sample_max;
private double rate_base;
private double rate_step;
private double rate_incr;
private double base_value;
private double step_value;
private double value_incr;
private double sample_incr;
private long min_settling_ms;
@ -35,16 +35,16 @@ public class FindmaxConfig {
return sample_max;
}
public double rate_base() {
return rate_base;
public double base_value() {
return base_value;
}
public double rate_step() {
return rate_step;
public double step_value() {
return step_value;
}
public double rate_incr() {
return rate_incr;
public double value_incr() {
return value_incr;
}
public double sample_incr() {
@ -63,20 +63,20 @@ public class FindmaxConfig {
this.sample_max = sample_max;
}
public void setRate_base(double rate_base) {
this.rate_base = rate_base;
public void setBase_value(double base_value) {
this.base_value = base_value;
}
public void setRate_step(double rate_step) {
this.rate_step = rate_step;
public void setStep_value(double step_value) {
this.step_value = step_value;
}
public void setSample_incr(double sample_incr) {
this.sample_incr = sample_incr;
}
public void setRate_incr(double rate_incr) {
this.rate_incr = rate_incr;
public void setValue_incr(double value_incr) {
this.value_incr = value_incr;
}
public void setMin_settling_ms(long min_settling_ms) {
@ -84,12 +84,12 @@ public class FindmaxConfig {
}
public FindmaxConfig(NBCommandParams params) {
params.maybeGet("sample_time_ms").map(Double::parseDouble).orElse(4000d);
params.maybeGet("sample_max").map(Double::parseDouble).orElse(10000d);
params.maybeGet("rate_base").map(Double::parseDouble).orElse(10d);
params.maybeGet("rate_step").map(Double::parseDouble).orElse(100d);
params.maybeGet("rate_incr").map(Double::parseDouble).orElse(2d);
params.maybeGet("sample_incr").map(Double::parseDouble).orElse(1.2d);
params.maybeGet("min_settling_ms").map(Long::parseLong).orElse(4000L);
setSample_time_ms(params.maybeGet("sample_time_ms").map(Double::parseDouble).orElse(4000d));
setSample_max(params.maybeGet("sample_max").map(Double::parseDouble).orElse(10000d));
setBase_value(params.maybeGet("base_value").map(Double::parseDouble).orElse(10d));
setStep_value(params.maybeGet("step_value").map(Double::parseDouble).orElse(100d));
setValue_incr(params.maybeGet("value_incr").map(Double::parseDouble).orElse(2d));
setSample_incr(params.maybeGet("sample_incr").map(Double::parseDouble).orElse(1.2d));
setMin_settling_ms(params.maybeGet("min_settling_ms").map(Long::parseLong).orElse(4000L));
}
}

View File

@ -19,14 +19,11 @@ package io.nosqlbench.scenarios.simframe.optimizers.findmax;
import io.nosqlbench.engine.api.activityapi.core.Activity;
import io.nosqlbench.engine.api.activityapi.core.RunState;
import io.nosqlbench.engine.core.lifecycle.scenario.container.ContainerActivitiesController;
import io.nosqlbench.scenarios.simframe.capture.JournalView;
import io.nosqlbench.scenarios.simframe.capture.SimFrameCapture;
import io.nosqlbench.scenarios.simframe.capture.SimFrameJournal;
import io.nosqlbench.scenarios.simframe.planning.HoldAndSample;
import io.nosqlbench.scenarios.simframe.planning.SimFrame;
import io.nosqlbench.scenarios.simframe.planning.SimFrameFunction;
import java.io.PrintWriter;
import java.util.Comparator;
import static io.nosqlbench.virtdata.core.bindings.VirtDataLibrary.logger;
@ -78,20 +75,20 @@ public class FindmaxFrameFunction implements SimFrameFunction {
}
public double nextStep() {
double newRate = 0.0d;
double newRate;
SimFrame<FindmaxFrameParams> last = journal.last();
SimFrame<FindmaxFrameParams> best = journal.bestRun();
if (best.index() == last.index()) { // got better consecutively
newRate = last.params().paramValues()[0] + settings.rate_step();
settings.setRate_step(settings.rate_step() * settings.rate_incr());
newRate = last.params().paramValues()[0] + settings.step_value();
settings.setStep_value(settings.step_value() * settings.value_incr());
} else if (best.index() == last.index() - 1) {
// got worse consecutively, this may be collapsed out since the general case below covers it (test first)
if (((last.params().paramValues()[0] + settings.rate_step()) -
(best.params().paramValues()[0] + settings.rate_step())) <= settings.rate_step()) {
if (((last.params().paramValues()[0] + settings.step_value()) -
(best.params().paramValues()[0] + settings.step_value())) <= settings.step_value()) {
logger.info("could not divide search space further, stop condition met");
return 0;
} else {
newRate = best.params().paramValues()[0] + settings.rate_step();
newRate = best.params().paramValues()[0] + settings.step_value();
settings.setSample_time_ms(settings.sample_time_ms() * settings.sample_incr());
settings.setMin_settling_ms(settings.min_settling_ms() * 4);
}
@ -99,12 +96,12 @@ public class FindmaxFrameFunction implements SimFrameFunction {
// find next frame with higher rate but lower value, the closest one by rate
SimFrame<FindmaxFrameParams> nextWorseFrameWithHigherRate = journal.frames().stream()
.filter(f -> f.value() < best.value())
.filter(f -> f.params().paramValues()[0] + settings.rate_step() > (best.params().paramValues()[0] + settings.rate_step()))
.min(Comparator.comparingDouble(f -> f.params().paramValues()[0] + settings.rate_step()))
.filter(f -> f.params().paramValues()[0] + settings.step_value() > (best.params().paramValues()[0] + settings.step_value()))
.min(Comparator.comparingDouble(f -> f.params().paramValues()[0] + settings.step_value()))
.orElseThrow(() -> new RuntimeException("inconsistent samples"));
if ((nextWorseFrameWithHigherRate.params().paramValues()[0] + settings.rate_step() -
best.params().paramValues()[0] + settings.rate_step()) > settings.rate_step()) {
newRate = best.params().paramValues()[0] + settings.rate_step();
if ((nextWorseFrameWithHigherRate.params().paramValues()[0] + settings.step_value() -
best.params().paramValues()[0] + settings.step_value()) > settings.step_value()) {
newRate = best.params().paramValues()[0] + settings.step_value();
settings.setSample_time_ms(settings.sample_time_ms() * settings.sample_incr());
settings.setMin_settling_ms(settings.min_settling_ms() * 2);
} else {