code: public void subtractCosts(Costs other) {
  		if (this.networkCost != UNKNOWN && other.networkCost != UNKNOWN) {
  			this.networkCost -= other.networkCost;
  			if (this.networkCost < 0) {
  				throw new IllegalArgumentException("Cannot subtract more cost then there is.");
  			}
  		}
  		if (this.diskCost != UNKNOWN && other.diskCost != UNKNOWN) {
  			this.diskCost -= other.diskCost;
  			if (this.diskCost < 0) {
  				throw new IllegalArgumentException("Cannot subtract more cost then there is.");
  			}
  		}
  		if (this.cpuCost != UNKNOWN && other.cpuCost != UNKNOWN) {
  			this.cpuCost -= other.cpuCost;
  			if (this.cpuCost < 0) {
  				throw new IllegalArgumentException("Cannot subtract more cost then there is.");
  			}
  		}
  		
  		// ---------- relative costs ----------
  		
  		this.heuristicNetworkCost -= other.heuristicNetworkCost;
  		if (this.heuristicNetworkCost < 0) {
  			throw new IllegalArgumentException("Cannot subtract more cost then there is.");
  		}
  		this.heuristicDiskCost -= other.heuristicDiskCost;
  		if (this.heuristicDiskCost < 0) {
  			throw new IllegalArgumentException("Cannot subtract more cost then there is.");
  		}
  		this.heuristicCpuCost -= other.heuristicCpuCost;
  		if (this.heuristicCpuCost < 0) {
  			throw new IllegalArgumentException("Cannot subtract more cost then there is.");
  		}
  	}
docs: Subtracts the given costs from these costs. If the given costs are unknown, then these costs are remain unchanged.
  
  @param other The costs to subtract.