blob: 6e77e3466c8ad898d1c912469c974f6d88b8e044 [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.sysds.runtime.privacy.finegrained;
import java.util.Arrays;
/**
* A DataRange instance marks a part of a CachableData data object.
* The beginDims marks the beginning for all dimensions and
* the endDims marks the end for all dimensions.
* DataRange is very similar to org.apache.sysds.runtime.util.IndexRange,
* except that DataRange supports more than two dimensions.
*/
public class DataRange {
private long[] _beginDims;
private long[] _endDims;
public DataRange(long[] beginDims, long[] endDims){
_beginDims = beginDims;
_endDims = endDims;
}
public long[] getBeginDims(){
return _beginDims;
}
public long[] getEndDims(){
return _endDims;
}
/**
* Returns true if this data range overlaps with the given data range.
* An overlap means that the data ranges have some overlap in all dimension.
* @param dataRange for which the overlap is checked
* @return true if the data ranges overlap or false if not
*/
public boolean overlaps(DataRange dataRange){
long[] dataRangeBegin = dataRange.getBeginDims();
long[] dataRangeEnd = dataRange.getEndDims();
if (_beginDims.length != dataRangeBegin.length
|| _endDims.length != dataRangeEnd.length)
{
return false;
}
for ( int i = 0; i < _beginDims.length; i++ )
if ( dimensionOutOfRange(dataRangeBegin, dataRangeEnd, i) )
return false;
return true;
}
/**
* Returns true if the given index is in the data range.
* Being in the data range means that the index has to be in the range for all dimensions.
* @param index of an element for which it is checked if it is in the range
* @return true if the index is in the range and false otherwise
*/
public boolean contains(long[] index){
if ( _beginDims.length != index.length )
return false;
for ( int i = 0; i < _beginDims.length; i++ )
if ( _beginDims[i] > index[i] || _endDims[i] < index[i] )
return false;
return true;
}
/**
* Returns true if the given DataRange is not overlapping in the given dimension
* @param dataRangeBegin begin dimensions
* @param dataRangeEnd end dimensions
* @param i dimension
* @return true if out of range
*/
private boolean dimensionOutOfRange(long[] dataRangeBegin, long[] dataRangeEnd, int i){
return (_beginDims[i] < dataRangeBegin[i] && _endDims[i] < dataRangeBegin[i])
|| (_beginDims[i] > dataRangeBegin[i] && _beginDims[i] > dataRangeEnd[i] );
}
@Override
public String toString(){
return Arrays.toString(new String[]{
Arrays.toString(_beginDims), Arrays.toString(_endDims)});
}
@Override
public boolean equals(Object other){
if ( other instanceof DataRange ) {
DataRange otherRange = (DataRange)other;
return Arrays.equals(_beginDims,otherRange.getBeginDims())
&& Arrays.equals(_endDims,otherRange.getEndDims());
}
return false;
}
}