/*
* 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 gobblin.util.request_allocation;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* Represents a requirement of resources in a {@link ResourcePool}. Essentially a vector of doubles of the same dimension
* as that in the {@link ResourcePool}. See {@link ResourcePool}.
*/
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class ResourceRequirement {
public static class Builder {
private final double[] requirement;
private final ResourcePool pool;
public Builder(ResourcePool pool) {
this.pool = pool;
this.requirement = pool.getDefaultResourceUse(null);
}
/**
* Set all resource requirements to 0. Overrides defaults.
*/
public Builder zero() {
for (int i = 0; i < this.requirement.length; i++) {
this.requirement[i] = 0;
}
return this;
}
/**
* Specify the resource requirement along a dimension.
*/
public Builder setRequirement(String dimension, double value) {
if (!this.pool.getDimensionIndex().containsKey(dimension)) {
throw new IllegalArgumentException(String.format("No dimension %s in this resource pool.", dimension));
}
int idx = this.pool.getDimensionIndex().get(dimension);
this.requirement[idx] = value;
return this;
}
public ResourceRequirement build() {
return new ResourceRequirement(this.requirement);
}
}
@Getter
private final double[] resourceVector;
public ResourceRequirement(ResourceRequirement other) {
this.resourceVector = other.resourceVector.clone();
}
/**
* Vector addition of this and other {@link ResourceRequirement}.
*/
public void add(ResourceRequirement other) {
VectorAlgebra.addVector(this.resourceVector, other.resourceVector, 1., this.resourceVector);
}
/**
* Vector addition of this and other {@link ResourceRequirement}.
*/
public void subtract(ResourceRequirement other) {
VectorAlgebra.addVector(this.resourceVector, other.resourceVector, -1., this.resourceVector);
}
void entryWiseMax(ResourceRequirement other) {
for (int i = 0; i < this.resourceVector.length; i ++) {
this.resourceVector[i] = Math.max(this.resourceVector[i], other.resourceVector[i]);
}
}
ResourceRequirement copyInto(ResourceRequirement reuse) {
if (reuse == null) {
return new ResourceRequirement(this.resourceVector.clone());
} else {
System.arraycopy(this.resourceVector, 0, reuse.getResourceVector(), 0, this.resourceVector.length);
return reuse;
}
}
public static ResourceRequirement add(ResourceRequirement r1, ResourceRequirement r2, ResourceRequirement reuse) {
if (reuse == null) {
reuse = new ResourceRequirement(r1.resourceVector.clone());
}
VectorAlgebra.addVector(r1.resourceVector, r2.resourceVector, 1., reuse.resourceVector);
return reuse;
}
}