/**
 * 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 Gradient Descent.
// 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)
};

// multiplication by a number:
macro mult ( a, X ) {
  select ( a*x, i, j )
    from (x,i,j) in X
};

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

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

a = 0.002;
b = 0.02;

// Matrix Factorization using Gradient Descent
macro factorize ( R, Pinit, Qinit ) {
  repeat (E,P,Q) = (R,Pinit,Qinit)
    step ( Csub(R,multiply(P,transpose(Q))),
           Cadd(P,mult(a,Csub(mult(2,multiply(E,transpose(Q))),mult(b,P)))),
           Cadd(Q,mult(a,Csub(mult(2,multiply(E,transpose(P))),mult(b,Q)))) )
   limit 4
};

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