blob: 87d436094420746ee624639de8c0805d33872bb8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.wayang.core.optimizer.costs;
import org.apache.wayang.core.optimizer.ProbabilisticIntervalEstimate;
import org.apache.wayang.core.util.JsonSerializable;
import org.apache.wayang.core.util.JsonSerializables;
import org.apache.wayang.core.util.json.JSONObject;
/**
* An estimate of costs of some executable code expressed as a {@link ProbabilisticIntervalEstimate}.
*/
public class LoadEstimate extends ProbabilisticIntervalEstimate implements JsonSerializable {
public LoadEstimate(long exactValue) {
this(exactValue, exactValue, 1d);
}
public LoadEstimate(long lowerEstimate, long upperEstimate, double correctnessProb) {
super(lowerEstimate, upperEstimate, correctnessProb);
}
/**
* Multiplies the estimated load. The correctness probability is not altered.
*
* @param n scalar to multiply with
* @return the product
*/
public LoadEstimate times(int n) {
return new LoadEstimate(this.getLowerEstimate() * n, this.getUpperEstimate() * n, this.getCorrectnessProbability());
}
/**
* Adds a this and the given instance.
*
* @param that the other summand
* @return a new instance representing the sum
*/
public LoadEstimate plus(LoadEstimate that) {
return new LoadEstimate(
this.getLowerEstimate() + that.getLowerEstimate(),
this.getUpperEstimate() + that.getUpperEstimate(),
this.getCorrectnessProbability() * that.getCorrectnessProbability()
);
}
/**
* Adds a the and the given instances.
*
* @param estimate1 the one summand or {@code null}
* @param estimate2 the other summand or {@code null}
* @return a new instance representing the sum or {@code null} if both summands are {@code null}
*/
public static LoadEstimate add(LoadEstimate estimate1, LoadEstimate estimate2) {
return estimate1 == null ?
estimate2 :
(estimate2 == null ? estimate1 : estimate1.plus(estimate2));
}
@Override
public JSONObject toJson() {
JSONObject json = new JSONObject();
json.put("lower", JsonSerializables.serialize(this.getLowerEstimate(), false));
json.put("upper", JsonSerializables.serialize(this.getUpperEstimate(), false));
json.put("prob", JsonSerializables.serialize(this.getCorrectnessProbability(), false));
return json;
}
@SuppressWarnings("unused")
public static LoadEstimate fromJson(JSONObject jsonObject) {
return new LoadEstimate(
jsonObject.getLong("lower"),
jsonObject.getLong("upper"),
jsonObject.getDouble("prob")
);
}
}