/**
 * 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 macros.
// 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");


macro transpose ( X ) {
  select (x,j,i)
    from (x,i,j) in X
};

// matrix multiplication:
macro multiply ( X, Y ) {
  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:
macro Cmult ( X, Y ) {
  select ( x*y, i, j )
    from (x,i,j) in X, (y,i,j) in Y
};

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

// Gaussian non-negative matrix factorization (from SystemML paper)
macro factorize ( V, Hinit, Winit ) {
  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
};

let (X1,X2) = factorize(Mmatrix,Hmatrix,Wmatrix)
 in multiply(X1,transpose(X2));
