/*-
* Copyright 2016 Diamond Light Source Ltd.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.dawnsci.surfacescatter;
import org.eclipse.january.dataset.Dataset;
import org.eclipse.january.dataset.DatasetFactory;
import org.eclipse.january.dataset.Maths;
import org.eclipse.january.dataset.SliceND;
public class LinearLeastSquaresServicesForDialog {
public static Dataset polynomial2DLinearLeastSquaresMatrixGenerator (int degree, Dataset xValues, Dataset yValues){
int noParams = (int) Math.pow(degree+1, 2);
int datasize = xValues.getShape()[0];
Dataset testMatrix = DatasetFactory.ones(new int[] {datasize, noParams}, Dataset.FLOAT64);
int[] pos = new int[]{0,0};
for (int i = 0; i < datasize; i++) {
testMatrix.set(xValues.getObject(i), pos);
pos[0]++;
}
int p = 0;
double check = (degree+1)*(degree+1);
for (int k =0; k<datasize; k++){
double x = xValues.getDouble(k);
double y = yValues.getDouble(k);
for (int i =0; i<degree+1 ; i++){
double xFunc = Math.pow(x, i);
for (int j=0; j<degree+1; j++){
double yFunc = Math.pow(y, j);
testMatrix.set(xFunc*yFunc, k, p);
p++;
if(p == check){
p=0;
}
}
}
}
return testMatrix;
}
public static Dataset polynomial2DLinearLeastSquaresSigmaGenerator (Dataset Z){
int datasize = Z.getShape()[0];
Dataset sigmaMatrix = DatasetFactory.ones(new int[] {datasize}, Dataset.FLOAT64);
for (int k =0; k<datasize; k++){
double z = Z.getDouble(k);
double zSigma = Math.pow(z, 0.5);
sigmaMatrix.set(zSigma, k);
}
return sigmaMatrix;
}
public static Dataset exponential2DLinearLeastSquaresMatrixGenerator (Dataset xValues,
Dataset yValues,
Dataset zValues){
int noParams = 4;
int datasize = xValues.getShape()[0];
Dataset testMatrix = DatasetFactory.ones(new int[] {datasize, noParams}, Dataset.FLOAT64);
int[] pos = new int[]{0,0};
for (int i = 0; i < datasize; i++) {
testMatrix.set(xValues.getObject(i), pos);
pos[0]++;
}
// int p = 0;
// double check = (degree+1)*(degree+1);
for (int k =0; k<datasize; k++){
if (zValues.get1DIndex(k) > 1){
double w = - Math.log(1-1/zValues.get1DIndex(k));
if (Double.isInfinite(w)){
System.out.println("error at k: " + k);
}
testMatrix.set(w, k, 0);
}
else{
testMatrix.set(1, k, 0);
}
}
for (int k =0; k<datasize; k++){
testMatrix.set(1, k, 1);
}
for (int k =0; k<datasize; k++){
double x = xValues.getDouble(k);
testMatrix.set(x, k, 2);
}
for (int k =0; k<datasize; k++){
double y = yValues.getDouble(k);
testMatrix.set(y, k, 3);
}
return testMatrix;
}
public static Dataset exponential2DLinearLeastSquaresSigmaGenerator (Dataset Z){
int datasize = Z.getShape()[0];
Dataset sigmaMatrix = DatasetFactory.ones(new int[] {datasize}, Dataset.FLOAT64);
for (int k =0; k<datasize; k++){
double z = Z.getDouble(k);
double zSigma = Math.pow(z, 0.5);
sigmaMatrix.set(zSigma, k);
}
return sigmaMatrix;
}
public static Dataset refinedExponential2DLinearLeastSquaresMatrixGenerator (Dataset xValues,
Dataset yValues,
Dataset zValues,
double[] paramsPoly,
double[] paramsExp){
int noParams = 2;
int datasize = xValues.getShape()[0];
double[] a = paramsExp;
double[] b = paramsPoly;
Dataset testMatrix = DatasetFactory.ones(new int[] {datasize, noParams}, Dataset.FLOAT64);
int[] pos = new int[]{0,0};
for (int i = 0; i < datasize; i++) {
testMatrix.set(xValues.getObject(i), pos);
pos[0]++;
}
for (int k =0; k<datasize; k++){
double w = b[0]
+ b[1]*xValues.getDouble(k)
+ b[2]*yValues.getDouble(k)
+ b[3]*xValues.getDouble(k)*yValues.getDouble(k);
if (Double.isInfinite(w)){
// System.out.println("error at k0: " + k);
w = -1000000000;
}
testMatrix.set(w, k, 0);
double w1 = -Math.exp(a[0]) + Math.exp(a[1])*Math.exp(a[2]* xValues.getDouble(k) + a[3]* yValues.getDouble(k));
if (Double.isInfinite(w1)){
// System.out.println("error at k1: " + k);
w1 = -1000000000;
}
else if (Double.isNaN(w1)){
// System.out.println("error at k1: " + k);
w1 = 0;
}
testMatrix.set(w1, k, 1);
}
return testMatrix;
}
public static Dataset refinedExponential2DLinearLeastSquaresSigmaGenerator (Dataset Z){
int datasize = Z.getShape()[0];
Dataset sigmaMatrix = DatasetFactory.ones(new int[] {datasize}, Dataset.FLOAT64);
for (int k =0; k<datasize; k++){
double z = Z.getDouble(k);
double zSigma = Math.pow(z, 0.5);
sigmaMatrix.set(zSigma, k);
}
return sigmaMatrix;
}
}
//TEST