[ 
https://issues.apache.org/jira/browse/FLINK-3920?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15444739#comment-15444739
 ] 

ASF GitHub Bot commented on FLINK-3920:
---------------------------------------

Github user chiwanpark commented on a diff in the pull request:

    https://github.com/apache/flink/pull/2152#discussion_r76551085
  
    --- Diff: 
flink-libraries/flink-ml/src/main/scala/org/apache/flink/ml/math/distributed/BlockMapper.scala
 ---
    @@ -0,0 +1,107 @@
    +/*
    + * 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.flink.ml.math.distributed
    +
    +import 
org.apache.flink.ml.math.distributed.DistributedMatrix.{MatrixColIndex, 
MatrixRowIndex}
    +
    +/**
    +  * This class is in charge of handling all the spatial logic required by 
BlockMatrix.
    +  * It introduces a new space of zero-indexed coordinates (i,j), called 
"mapped coordinates".
    +  * This is a space where blocks are indexed (starting from zero).
    +  *
    +  * So every coordinate in the original space can be mapped to this space 
and to the
    +  * corrisponding block.  A block have a row and a column coordinate that 
explicits
    +  * its position. Every set of coordinates in the mapped space corresponds 
to a square
    +  * of size rowPerBlock x colsPerBlock.
    +  *
    +  */
    +case class BlockMapper( //original matrix size
    +                       numRows: Int,
    +                       numCols: Int,
    +                       //block size
    +                       rowsPerBlock: Int,
    +                       colsPerBlock: Int) {
    +
    +  require(numRows >= rowsPerBlock && numCols >= colsPerBlock)
    +  val numBlockRows: Int = math.ceil(numRows * 1.0 / rowsPerBlock).toInt
    +  val numBlockCols: Int = math.ceil(numCols * 1.0 / colsPerBlock).toInt
    +  val numBlocks = numBlockCols * numBlockRows
    +
    +  /**
    +    * Translates absolute coordinates to the mapped coordinates of the 
block
    +    * these coordinates belong to.
    +    * @param i
    +    * @param j
    +    * @return
    +    */
    +  def absCoordToMappedCoord(i: MatrixRowIndex, j: MatrixColIndex): (Int, 
Int) =
    +    getBlockMappedCoordinates(getBlockIdByCoordinates(i, j))
    +
    +  /**
    +    * Retrieves a block id from original coordinates
    +    * @param i Original row
    +    * @param j Original column
    +    * @return Block ID
    +    */
    +  def getBlockIdByCoordinates(i: MatrixRowIndex, j: MatrixColIndex): Int = 
{
    +
    +    if (i < 0 || j < 0 || i >= numRows || j >= numCols) {
    +      throw new IllegalArgumentException(s"Invalid coordinates ($i,$j).")
    +    } else {
    +      val mappedRow = i / rowsPerBlock
    +      val mappedColumn = j / colsPerBlock
    +      val res = mappedRow * numBlockCols + mappedColumn
    +
    +      assert(res <= numBlocks)
    +      res
    +    }
    +  }
    +
    +  /**
    +    * Retrieves mapped coordinates for a given block.
    +    * @param blockId
    +    * @return
    +    */
    +  def getBlockMappedCoordinates(blockId: Int): (Int, Int) = {
    +    if (blockId < 0 || blockId > numBlockCols * numBlockRows) {
    +      throw new IllegalArgumentException(
    +          s"BlockId numeration starts from 0. $blockId is not a valid Id"
    +      )
    +    } else {
    +      val i = blockId / numBlockCols
    +      val j = blockId % numBlockCols
    +      (i, j)
    +    }
    +  }
    +
    +  /**
    +    * Retrieves the ID of the block at the given coordinates
    +    * @param i
    +    * @param j
    +    * @return
    +    */
    +  def getBlockIdByMappedCoord(i: Int, j: Int): Int = {
    +
    +    if (i < 0 || j < 0 || i >= numBlockRows || j >= numBlockCols) {
    +      throw new IllegalArgumentException(s"Invalid coordinates ($i,$j).")
    --- End diff --
    
    Please use `require`.


> Distributed Linear Algebra: block-based matrix
> ----------------------------------------------
>
>                 Key: FLINK-3920
>                 URL: https://issues.apache.org/jira/browse/FLINK-3920
>             Project: Flink
>          Issue Type: New Feature
>          Components: Machine Learning Library
>            Reporter: Simone Robutti
>            Assignee: Simone Robutti
>




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to