/**
* 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.falcon.regression.core.util;
import org.apache.commons.lang.ArrayUtils;
import org.testng.Assert;
import java.util.Arrays;
/**
* Util class for matrix operations.
*/
public final class MatrixUtil {
private MatrixUtil() {
throw new AssertionError("Instantiating utility class...");
}
/**
* Cross product many arrays.
* @param firstArray first array that you want to cross product
* @param otherArrays other arrays that you want to cross product
* @return cross product
*/
public static Object[][] crossProduct(Object[] firstArray, Object[]... otherArrays) {
if (otherArrays == null || otherArrays.length == 0) {
Object[][] result = new Object[firstArray.length][1];
for (int i = 0; i < firstArray.length; ++i) {
result[i][0] = firstArray[i];
}
return result;
}
// computing cross product for the rest of the arrays
Object[][] restArray = new Object[otherArrays.length-1][];
System.arraycopy(otherArrays, 1, restArray, 0, otherArrays.length - 1);
Object[][] restCrossProduct = crossProduct(otherArrays[0], restArray);
//creating and initializing result array
Object[][] result = new Object[firstArray.length * restCrossProduct.length][];
for(int i = 0; i < result.length; ++i) {
result[i] = new Object[otherArrays.length + 1];
}
//doing the final cross product
for (int i = 0; i < firstArray.length; ++i) {
for (int j = 0; j < restCrossProduct.length; ++j) {
//computing one row of result
final int rowIdx = i * restCrossProduct.length + j;
result[rowIdx][0] = firstArray[i];
System.arraycopy(restCrossProduct[j], 0, result[rowIdx], 1, otherArrays.length);
}
}
return result;
}
public static Object[][] append(Object[][] arr1, Object[][] arr2) {
Assert.assertFalse(ArrayUtils.isEmpty(arr1), "arr1 can't be empty:"
+ Arrays.deepToString(arr1));
Assert.assertFalse(ArrayUtils.isEmpty(arr2), "arr2 can't be empty:"
+ Arrays.deepToString(arr2));
Assert.assertEquals(arr1[0].length, arr2[0].length, "Array rows are not compatible. "
+ "row of first array: " + Arrays.deepToString(arr1[0])
+ "row of second array: " + Arrays.deepToString(arr2[0]));
return (Object[][]) ArrayUtils.addAll(arr1, arr2);
}
/**
* Cross product many arrays.
* @param firstArray first array that you want to cross product
* @param otherArrays other arrays that you want to cross product
* @return cross product
*/
public static Object[][] crossProductNew(Object[] firstArray, Object[][]... otherArrays) {
return crossProduct(firstArray, otherArrays);
}
}