blob: 0e0021ded03f08a082cc89cb561d400c6fec2bfb [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.controlprogram.caching;
import org.apache.hadoop.io.Writable;
import org.apache.sysds.runtime.meta.DataCharacteristics;
/**
* Interface for all blocks handled by lazy write buffer. This abstraction
* allows us to keep the buffer pool independent of matrix and frame blocks.
*
*/
public interface CacheBlock extends Writable
{
public int getNumRows();
public int getNumColumns();
public DataCharacteristics getDataCharacteristics();
/**
* Get the in-memory size in bytes of the cache block.
*
* @return in-memory size in bytes of cache block
*/
public long getInMemorySize();
/**
* Get the exact serialized size in bytes of the cache block.
*
* @return exact serialized size in bytes of cache block
*/
public long getExactSerializedSize();
/**
* Indicates if the cache block is subject to shallow serialized,
* which is generally true if in-memory size and serialized size
* are almost identical allowing to avoid unnecessary deep serialize.
*
* @return true if shallow serialized
*/
public boolean isShallowSerialize();
/**
* Indicates if the cache block is subject to shallow serialized,
* which is generally true if in-memory size and serialized size
* are almost identical allowing to avoid unnecessary deep serialize.
*
* @param inclConvert if true report blocks as shallow serialize that are
* currently not amenable but can be brought into an amenable form
* via {@link #toShallowSerializeBlock() toShallowSerializeBlock}.
*
* @return true if shallow serialized
*/
public boolean isShallowSerialize(boolean inclConvert);
/**
* Converts a cache block that is not shallow serializable into
* a form that is shallow serializable. This methods has no affect
* if the given cache block is not amenable.
*/
public void toShallowSerializeBlock();
/**
* Free unnecessarily allocated empty block.
*/
public void compactEmptyBlock();
/**
* Slice a sub block out of the current block and write into the given output block.
* This method returns the passed instance if not null.
*
* @param rl row lower
* @param ru row upper
* @param cl column lower
* @param cu column upper
* @param block cache block
* @return sub-block of cache block
*/
public CacheBlock slice(int rl, int ru, int cl, int cu, CacheBlock block);
/**
* Slice a sub block out of the current block and write into the given output block.
* This method returns the passed instance if not null.
*
* @param rl row lower
* @param ru row upper
* @param cl column lower
* @param cu column upper
* @param deep enforce deep-copy
* @param block cache block
* @return sub-block of cache block
*/
public CacheBlock slice(int rl, int ru, int cl, int cu, boolean deep, CacheBlock block);
/**
* Merge the given block into the current block. Both blocks needs to be of equal
* dimensions and contain disjoint non-zero cells.
*
* @param that cache block
* @param appendOnly ?
*/
public void merge(CacheBlock that, boolean appendOnly);
/**
* Returns the double value at the passed row and column.
* If the value is missing 0 is returned.
* @param r row of the value
* @param c column of the value
* @return double value at the passed row and column
*/
double getDouble(int r, int c);
/**
* Returns the double value at the passed row and column.
* If the value is missing NaN is returned.
* @param r row of the value
* @param c column of the value
* @return double value at the passed row and column
*/
double getDoubleNaN(int r, int c);
/**
* Returns the string of the value at the passed row and column.
* If the value is missing or NaN, null is returned.
* @param r row of the value
* @param c column of the value
* @return string of the value at the passed row and column
*/
String getString(int r, int c);
}