/* * 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.sysml.runtime.matrix.data; import org.apache.sysml.api.DMLException; import org.apache.sysml.runtime.util.UtilFunctions; public class BinaryBlockToRowBlockConverter implements Converter<MatrixIndexes, MatrixBlock, MatrixIndexes, MatrixBlock> { private MatrixBlock _srcBlock = null; private int _srcRlen = -1; private int _srcBrlen = -1; private int _pos = -1; private long _startRowID = -1; private long _colID = -1; //output blocks for reuse private MatrixIndexes _destIx = null; private MatrixBlock _destBlock = null; private Pair<MatrixIndexes, MatrixBlock> _pair = null; public BinaryBlockToRowBlockConverter() { _destIx = new MatrixIndexes(); _destBlock = new MatrixBlock(); _pair=new Pair<MatrixIndexes, MatrixBlock>(_destIx, _destBlock); } private void reset() { _srcBlock = null; _pos = -1; _startRowID =-1; _colID = -1; } @Override public void convert(MatrixIndexes k1, MatrixBlock v1) { reset(); _startRowID = UtilFunctions.computeCellIndex(k1.getRowIndex(), _srcBrlen, 0); _colID = k1.getColumnIndex(); _destBlock.reset(1, v1.getNumColumns()); _srcRlen = v1.getNumRows(); _srcBlock = v1; _pos = 0; } @Override public boolean hasNext() { //reached end of block if( _pos >= _srcRlen ) return false; return true; } @Override public Pair<MatrixIndexes, MatrixBlock> next() { //check for valid next call if( _pos >= _srcRlen ) return null; //prepare partial rowblock key _destIx.setIndexes(_startRowID+_pos, _colID); //slice next row try { //rowlow, rowup, collow, colup (1-based specification) _srcBlock.sliceOperations( _pos, _pos, 0, _srcBlock.getNumColumns()-1, _destBlock ); } catch(DMLException ex) { throw new RuntimeException("Failed to slice matrix block into row blocks.", ex); } //increment current pos _pos++; return _pair; } @Override public void setBlockSize(int nr, int nc) { _srcBrlen = nr; } }