/* * Copyright 2015 Ben Manes. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.github.benmanes.caffeine.cache.simulator; import static com.google.common.base.Preconditions.checkState; import static java.util.Objects.requireNonNull; import static java.util.stream.Collectors.toSet; import java.util.List; import java.util.Set; import com.github.benmanes.caffeine.cache.simulator.admission.Admission; import com.github.benmanes.caffeine.cache.simulator.membership.FilterType; import com.github.benmanes.caffeine.cache.simulator.parser.TraceFormat; import com.github.benmanes.caffeine.cache.simulator.report.ReportFormat; import com.typesafe.config.Config; /** * The simulator's configuration. A policy can extend this class as a convenient way to extract * its own settings. * * @author ben.manes@gmail.com (Ben Manes) */ public class BasicSettings { private final Config config; public BasicSettings(Config config) { this.config = requireNonNull(config); } public ReportSettings report() { return new ReportSettings(); } public int randomSeed() { return config().getInt("random-seed"); } public int batchSize() { return config().getInt("batch-size"); } public Set<String> policies() { return config().getStringList("policies").stream() .map(String::toLowerCase) .collect(toSet()); } public Set<Admission> admission() { return config().getStringList("admission").stream() .map(String::toUpperCase) .map(Admission::valueOf) .collect(toSet()); } public FilterType membershipFilter() { return FilterType.valueOf(config.getString("membership-filter").toUpperCase()); } public TinyLfuSettings tinyLfu() { return new TinyLfuSettings(); } public int maximumSize() { return config().getInt("maximum-size"); } public boolean isFiles() { return config().getString("source").equals("files"); } public boolean isSynthetic() { return config().getString("source").equals("synthetic"); } public TraceFilesSettings traceFiles() { checkState(isFiles()); return new TraceFilesSettings(); } public SyntheticSettings synthetic() { checkState(isSynthetic()); return new SyntheticSettings(); } /** Returns the config resolved at the simulator's path. */ public Config config() { return config; } public final class ReportSettings { public ReportFormat format() { return ReportFormat.valueOf(config().getString("report.format").toUpperCase()); } public String sortBy() { return config().getString("report.sort-by").trim(); } public boolean ascending() { return config().getBoolean("report.ascending"); } public String output() { return config().getString("report.output").trim(); } } public final class TinyLfuSettings { public String sketch() { return config().getString("tiny-lfu.sketch"); } public boolean conservative() { return config().getBoolean("tiny-lfu.count-min.conservative"); } public CountMin4Settings countMin4() { return new CountMin4Settings(); } public CountMin64Settings countMin64() { return new CountMin64Settings(); } public final class CountMin4Settings { public String reset() { return config().getString("tiny-lfu.count-min-4.reset"); } public double countersMultiplier() { return config().getDouble("tiny-lfu.count-min-4.counters-multiplier"); } public IncrementalSettings incremental() { return new IncrementalSettings(); } public PeriodicSettings periodic() { return new PeriodicSettings(); } public final class IncrementalSettings { public int interval() { return config().getInt("tiny-lfu.count-min-4.incremental.interval"); } } public final class PeriodicSettings { public DoorkeeperSettings doorkeeper() { return new DoorkeeperSettings(); } } } public final class CountMin64Settings { public double eps() { return config().getDouble("tiny-lfu.count-min-64.eps"); } public double confidence() { return config().getDouble("tiny-lfu.count-min-64.confidence"); } } public final class DoorkeeperSettings { private static final String basePath = "tiny-lfu.count-min-4.periodic"; public boolean enabled() { return config().getBoolean(basePath + ".doorkeeper.enabled"); } public double fpp() { return config().getDouble(basePath + ".doorkeeper.fpp"); } public double expectedInsertionsMultiplier() { return config().getDouble(basePath + ".doorkeeper.expected-insertions-multiplier"); } } } public final class TraceFilesSettings { public List<String> paths() { return config().getStringList("files.paths"); } public TraceFormat format() { String format = config().getString("files.format").replace('-', '_').toUpperCase(); return TraceFormat.valueOf(format); } } public final class SyntheticSettings { public String distribution() { return config().getString("synthetic.distribution"); } public int events() { return config().getInt("synthetic.events"); } public CounterSettings counter() { return new CounterSettings(); } public UniformSettings uniform() { return new UniformSettings(); } public ExponentialSettings exponential() { return new ExponentialSettings(); } public HotspotSettings hotspot() { return new HotspotSettings(); } public ZipfianSettings zipfian() { return new ZipfianSettings(); } public final class CounterSettings { public int start() { return config().getInt("synthetic.counter.start"); } } public final class UniformSettings { public int lowerBound() { return config().getInt("synthetic.uniform.lower-bound"); } public int upperBound() { return config().getInt("synthetic.uniform.upper-bound"); } } public final class ExponentialSettings { public double mean() { return config().getDouble("synthetic.exponential.mean"); } } public final class HotspotSettings { public int lowerBound() { return config().getInt("synthetic.hotspot.lower-bound"); } public int upperBound() { return config().getInt("synthetic.hotspot.upper-bound"); } public double hotsetFraction() { return config().getDouble("synthetic.hotspot.hotset-fraction"); } public double hotOpnFraction() { return config().getDouble("synthetic.hotspot.hot-opn-fraction"); } } public final class ZipfianSettings { public int items() { return config().getInt("synthetic.zipfian.items"); } } } }