/**
 * 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.
 */

// Matrix factorization using functions (slower than factorization.mrql).
// Build the matrices first using the build_matrix.mrql query

Mmatrix = source(binary,"tmp/Xmatrix.bin");
Hmatrix = source(binary,"tmp/Ymatrix.bin");
Wmatrix = source(binary,"tmp/Zmatrix.bin");

type matrix = !{(double,long,long)};

function transpose ( X: matrix ): matrix {
  select (x,j,i)
    from (x,i,j) in X
};

// matrix multiplication:
function multiply ( X: matrix, Y: matrix ): matrix {
  select (sum(z),i,j)
    from (x,i,k) in X, (y,k,j) in Y, z = x*y
   group by (i,j)
};

// cell-wise multiplication:
function Cmult ( X: matrix, Y: matrix ): matrix {
  select ( x*y, i, j )
    from (x,i,j) in X, (y,i,j) in Y
};

// cell-wise division:
function Cdiv ( X: matrix, Y: matrix ): matrix {
  select ( x/y, i, j )
    from (x,i,j) in X, (y,i,j) in Y
};

// Gaussian non-negative matrix factorization (from SystemML paper)
function factorize ( V: matrix, Hinit: matrix, Winit: matrix ): (matrix,matrix) {
  repeat (H,W) = (Hinit,Winit)
    step ( Cmult(H,Cdiv(multiply(transpose(W),V),multiply(transpose(W),multiply(W,H)))),
           Cmult(W,Cdiv(multiply(V,transpose(H)),multiply(W,multiply(H,transpose(H))))) )
   limit 4
};

factorize(Mmatrix,Hmatrix,Wmatrix);
