// // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // package com.jisuan.Jama; //import Jama.util.Maths; import com.jisuan.Jama.util.Maths; import java.io.Serializable; public class EigenvalueDecomposition implements Serializable { private int n; private boolean issymmetric; private double[] d; private double[] e; private double[][] V; private double[][] H; private double[] ort; private transient double cdivr; private transient double cdivi; private static final long serialVersionUID = 1L; private void tred2() { int var1; for(var1 = 0; var1 < this.n; ++var1) { this.d[var1] = this.V[this.n - 1][var1]; } double var2; double[] var10000; for(var1 = this.n - 1; var1 > 0; --var1) { var2 = 0.0; double var4 = 0.0; int var6; for(var6 = 0; var6 < var1; ++var6) { var2 += Math.abs(this.d[var6]); } if (var2 == 0.0) { this.e[var1] = this.d[var1 - 1]; for(var6 = 0; var6 < var1; ++var6) { this.d[var6] = this.V[var1 - 1][var6]; this.V[var1][var6] = 0.0; this.V[var6][var1] = 0.0; } } else { for(var6 = 0; var6 < var1; ++var6) { var10000 = this.d; var10000[var6] /= var2; var4 += this.d[var6] * this.d[var6]; } double var15 = this.d[var1 - 1]; double var8 = Math.sqrt(var4); if (var15 > 0.0) { var8 = -var8; } this.e[var1] = var2 * var8; var4 -= var15 * var8; this.d[var1 - 1] = var15 - var8; int var10; for(var10 = 0; var10 < var1; ++var10) { this.e[var10] = 0.0; } var10 = 0; label156: while(true) { if (var10 >= var1) { var15 = 0.0; for(var10 = 0; var10 < var1; ++var10) { var10000 = this.e; var10000[var10] /= var4; var15 += this.e[var10] * this.d[var10]; } double var16 = var15 / (var4 + var4); int var12; for(var12 = 0; var12 < var1; ++var12) { var10000 = this.e; var10000[var12] -= var16 * this.d[var12]; } var12 = 0; while(true) { if (var12 >= var1) { break label156; } var15 = this.d[var12]; var8 = this.e[var12]; for(int var13 = var12; var13 <= var1 - 1; ++var13) { var10000 = this.V[var13]; var10000[var12] -= var15 * this.e[var13] + var8 * this.d[var13]; } this.d[var12] = this.V[var1 - 1][var12]; this.V[var1][var12] = 0.0; ++var12; } } var15 = this.d[var10]; this.V[var10][var1] = var15; var8 = this.e[var10] + this.V[var10][var10] * var15; for(int var11 = var10 + 1; var11 <= var1 - 1; ++var11) { var8 += this.V[var11][var10] * this.d[var11]; var10000 = this.e; var10000[var11] += this.V[var11][var10] * var15; } this.e[var10] = var8; ++var10; } } this.d[var1] = var4; } for(var1 = 0; var1 < this.n - 1; ++var1) { this.V[this.n - 1][var1] = this.V[var1][var1]; this.V[var1][var1] = 1.0; var2 = this.d[var1 + 1]; int var14; if (var2 != 0.0) { for(var14 = 0; var14 <= var1; ++var14) { this.d[var14] = this.V[var14][var1 + 1] / var2; } for(var14 = 0; var14 <= var1; ++var14) { double var5 = 0.0; int var7; for(var7 = 0; var7 <= var1; ++var7) { var5 += this.V[var7][var1 + 1] * this.V[var7][var14]; } for(var7 = 0; var7 <= var1; ++var7) { var10000 = this.V[var7]; var10000[var14] -= var5 * this.d[var7]; } } } for(var14 = 0; var14 <= var1; ++var14) { this.V[var14][var1 + 1] = 0.0; } } for(var1 = 0; var1 < this.n; ++var1) { this.d[var1] = this.V[this.n - 1][var1]; this.V[this.n - 1][var1] = 0.0; } this.V[this.n - 1][this.n - 1] = 1.0; this.e[0] = 0.0; } private void tql2() { for(int var1 = 1; var1 < this.n; ++var1) { this.e[var1 - 1] = this.e[var1]; } this.e[this.n - 1] = 0.0; double var34 = 0.0; double var3 = 0.0; double var5 = Math.pow(2.0, -52.0); int var7; int var8; for(var7 = 0; var7 < this.n; ++var7) { var3 = Math.max(var3, Math.abs(this.d[var7]) + Math.abs(this.e[var7])); for(var8 = var7; var8 < this.n && !(Math.abs(this.e[var8]) <= var5 * var3); ++var8) { } if (var8 > var7) { int var9 = 0; do { ++var9; double var10 = this.d[var7]; double var12 = (this.d[var7 + 1] - var10) / (2.0 * this.e[var7]); double var14 = Maths.hypot(var12, 1.0); if (var12 < 0.0) { var14 = -var14; } this.d[var7] = this.e[var7] / (var12 + var14); this.d[var7 + 1] = this.e[var7] * (var12 + var14); double var16 = this.d[var7 + 1]; double var18 = var10 - this.d[var7]; for(int var20 = var7 + 2; var20 < this.n; ++var20) { double[] var10000 = this.d; var10000[var20] -= var18; } var34 += var18; var12 = this.d[var8]; double var36 = 1.0; double var22 = var36; double var24 = var36; double var26 = this.e[var7 + 1]; double var28 = 0.0; double var30 = 0.0; for(int var32 = var8 - 1; var32 >= var7; --var32) { var24 = var22; var22 = var36; var30 = var28; var10 = var36 * this.e[var32]; var18 = var36 * var12; var14 = Maths.hypot(var12, this.e[var32]); this.e[var32 + 1] = var28 * var14; var28 = this.e[var32] / var14; var36 = var12 / var14; var12 = var36 * this.d[var32] - var28 * var10; this.d[var32 + 1] = var18 + var28 * (var36 * var10 + var28 * this.d[var32]); for(int var33 = 0; var33 < this.n; ++var33) { var18 = this.V[var33][var32 + 1]; this.V[var33][var32 + 1] = var28 * this.V[var33][var32] + var36 * var18; this.V[var33][var32] = var36 * this.V[var33][var32] - var28 * var18; } } var12 = -var28 * var30 * var24 * var26 * this.e[var7] / var16; this.e[var7] = var28 * var12; this.d[var7] = var36 * var12; } while(Math.abs(this.e[var7]) > var5 * var3); } this.d[var7] += var34; this.e[var7] = 0.0; } for(var7 = 0; var7 < this.n - 1; ++var7) { var8 = var7; double var35 = this.d[var7]; int var11; for(var11 = var7 + 1; var11 < this.n; ++var11) { if (this.d[var11] < var35) { var8 = var11; var35 = this.d[var11]; } } if (var8 != var7) { this.d[var8] = this.d[var7]; this.d[var7] = var35; for(var11 = 0; var11 < this.n; ++var11) { var35 = this.V[var11][var7]; this.V[var11][var7] = this.V[var11][var8]; this.V[var11][var8] = var35; } } } } private void orthes() { byte var1 = 0; int var2 = this.n - 1; int var3; double[] var10000; for(var3 = var1 + 1; var3 <= var2 - 1; ++var3) { double var4 = 0.0; for(int var6 = var3; var6 <= var2; ++var6) { var4 += Math.abs(this.H[var6][var3 - 1]); } if (var4 != 0.0) { double var15 = 0.0; for(int var8 = var2; var8 >= var3; --var8) { this.ort[var8] = this.H[var8][var3 - 1] / var4; var15 += this.ort[var8] * this.ort[var8]; } double var16 = Math.sqrt(var15); if (this.ort[var3] > 0.0) { var16 = -var16; } var15 -= this.ort[var3] * var16; this.ort[var3] -= var16; int var10; double var11; int var13; for(var10 = var3; var10 < this.n; ++var10) { var11 = 0.0; for(var13 = var2; var13 >= var3; --var13) { var11 += this.ort[var13] * this.H[var13][var10]; } var11 /= var15; for(var13 = var3; var13 <= var2; ++var13) { var10000 = this.H[var13]; var10000[var10] -= var11 * this.ort[var13]; } } for(var10 = 0; var10 <= var2; ++var10) { var11 = 0.0; for(var13 = var2; var13 >= var3; --var13) { var11 += this.ort[var13] * this.H[var10][var13]; } var11 /= var15; for(var13 = var3; var13 <= var2; ++var13) { var10000 = this.H[var10]; var10000[var13] -= var11 * this.ort[var13]; } } this.ort[var3] = var4 * this.ort[var3]; this.H[var3][var3 - 1] = var4 * var16; } } int var14; for(var3 = 0; var3 < this.n; ++var3) { for(var14 = 0; var14 < this.n; ++var14) { this.V[var3][var14] = var3 == var14 ? 1.0 : 0.0; } } for(var3 = var2 - 1; var3 >= var1 + 1; --var3) { if (this.H[var3][var3 - 1] != 0.0) { for(var14 = var3 + 1; var14 <= var2; ++var14) { this.ort[var14] = this.H[var14][var3 - 1]; } for(var14 = var3; var14 <= var2; ++var14) { double var5 = 0.0; int var7; for(var7 = var3; var7 <= var2; ++var7) { var5 += this.ort[var7] * this.V[var7][var14]; } var5 = var5 / this.ort[var3] / this.H[var3][var3 - 1]; for(var7 = var3; var7 <= var2; ++var7) { var10000 = this.V[var7]; var10000[var14] += var5 * this.ort[var7]; } } } } } private void cdiv(double var1, double var3, double var5, double var7) { double var9; double var11; if (Math.abs(var5) > Math.abs(var7)) { var9 = var7 / var5; var11 = var5 + var9 * var7; this.cdivr = (var1 + var9 * var3) / var11; this.cdivi = (var3 - var9 * var1) / var11; } else { var9 = var5 / var7; var11 = var7 + var9 * var5; this.cdivr = (var9 * var1 + var3) / var11; this.cdivi = (var9 * var3 - var1) / var11; } } private void hqr2() { int var1 = this.n; int var2 = var1 - 1; byte var3 = 0; int var4 = var1 - 1; double var5 = Math.pow(2.0, -52.0); double var7 = 0.0; double var9 = 0.0; double var11 = 0.0; double var13 = 0.0; double var15 = 0.0; double var17 = 0.0; double var27 = 0.0; int var29; int var30; for(var29 = 0; var29 < var1; ++var29) { if (var29 < var3 | var29 > var4) { this.d[var29] = this.H[var29][var29]; this.e[var29] = 0.0; } for(var30 = Math.max(var29 - 1, 0); var30 < var1; ++var30) { var27 += Math.abs(this.H[var29][var30]); } } var29 = 0; while(true) { double var21; double var23; double var25; int var31; int var32; while(var2 >= var3) { for(var30 = var2; var30 > var3; --var30) { var15 = Math.abs(this.H[var30 - 1][var30 - 1]) + Math.abs(this.H[var30][var30]); if (var15 == 0.0) { var15 = var27; } if (Math.abs(this.H[var30][var30 - 1]) < var5 * var15) { break; } } if (var30 == var2) { this.H[var2][var2] += var7; this.d[var2] = this.H[var2][var2]; this.e[var2] = 0.0; --var2; var29 = 0; } else if (var30 == var2 - 1) { var21 = this.H[var2][var2 - 1] * this.H[var2 - 1][var2]; var9 = (this.H[var2 - 1][var2 - 1] - this.H[var2][var2]) / 2.0; var11 = var9 * var9 + var21; var17 = Math.sqrt(Math.abs(var11)); this.H[var2][var2] += var7; this.H[var2 - 1][var2 - 1] += var7; var23 = this.H[var2][var2]; if (var11 >= 0.0) { if (var9 >= 0.0) { var17 += var9; } else { var17 = var9 - var17; } this.d[var2 - 1] = var23 + var17; this.d[var2] = this.d[var2 - 1]; if (var17 != 0.0) { this.d[var2] = var23 - var21 / var17; } this.e[var2 - 1] = 0.0; this.e[var2] = 0.0; var23 = this.H[var2][var2 - 1]; var15 = Math.abs(var23) + Math.abs(var17); var9 = var23 / var15; var11 = var17 / var15; var13 = Math.sqrt(var9 * var9 + var11 * var11); var9 /= var13; var11 /= var13; for(var31 = var2 - 1; var31 < var1; ++var31) { var17 = this.H[var2 - 1][var31]; this.H[var2 - 1][var31] = var11 * var17 + var9 * this.H[var2][var31]; this.H[var2][var31] = var11 * this.H[var2][var31] - var9 * var17; } for(var31 = 0; var31 <= var2; ++var31) { var17 = this.H[var31][var2 - 1]; this.H[var31][var2 - 1] = var11 * var17 + var9 * this.H[var31][var2]; this.H[var31][var2] = var11 * this.H[var31][var2] - var9 * var17; } for(var31 = var3; var31 <= var4; ++var31) { var17 = this.V[var31][var2 - 1]; this.V[var31][var2 - 1] = var11 * var17 + var9 * this.V[var31][var2]; this.V[var31][var2] = var11 * this.V[var31][var2] - var9 * var17; } } else { this.d[var2 - 1] = var23 + var9; this.d[var2] = var23 + var9; this.e[var2 - 1] = var17; this.e[var2] = -var17; } var2 -= 2; var29 = 0; } else { var23 = this.H[var2][var2]; var25 = 0.0; var21 = 0.0; if (var30 < var2) { var25 = this.H[var2 - 1][var2 - 1]; var21 = this.H[var2][var2 - 1] * this.H[var2 - 1][var2]; } double[] var10000; if (var29 == 10) { var7 += var23; for(var31 = var3; var31 <= var2; ++var31) { var10000 = this.H[var31]; var10000[var31] -= var23; } var15 = Math.abs(this.H[var2][var2 - 1]) + Math.abs(this.H[var2 - 1][var2 - 2]); var23 = var25 = 0.75 * var15; var21 = -0.4375 * var15 * var15; } if (var29 == 30) { var15 = (var25 - var23) / 2.0; var15 = var15 * var15 + var21; if (var15 > 0.0) { var15 = Math.sqrt(var15); if (var25 < var23) { var15 = -var15; } var15 = var23 - var21 / ((var25 - var23) / 2.0 + var15); for(var31 = var3; var31 <= var2; ++var31) { var10000 = this.H[var31]; var10000[var31] -= var15; } var7 += var15; var21 = 0.964; var25 = 0.964; var23 = 0.964; } } ++var29; for(var31 = var2 - 2; var31 >= var30; --var31) { var17 = this.H[var31][var31]; var13 = var23 - var17; var15 = var25 - var17; var9 = (var13 * var15 - var21) / this.H[var31 + 1][var31] + this.H[var31][var31 + 1]; var11 = this.H[var31 + 1][var31 + 1] - var17 - var13 - var15; var13 = this.H[var31 + 2][var31 + 1]; var15 = Math.abs(var9) + Math.abs(var11) + Math.abs(var13); var9 /= var15; var11 /= var15; var13 /= var15; if (var31 == var30 || Math.abs(this.H[var31][var31 - 1]) * (Math.abs(var11) + Math.abs(var13)) < var5 * Math.abs(var9) * (Math.abs(this.H[var31 - 1][var31 - 1]) + Math.abs(var17) + Math.abs(this.H[var31 + 1][var31 + 1]))) { break; } } for(var32 = var31 + 2; var32 <= var2; ++var32) { this.H[var32][var32 - 2] = 0.0; if (var32 > var31 + 2) { this.H[var32][var32 - 3] = 0.0; } } for(var32 = var31; var32 <= var2 - 1; ++var32) { boolean var33 = var32 != var2 - 1; if (var32 != var31) { var9 = this.H[var32][var32 - 1]; var11 = this.H[var32 + 1][var32 - 1]; var13 = var33 ? this.H[var32 + 2][var32 - 1] : 0.0; var23 = Math.abs(var9) + Math.abs(var11) + Math.abs(var13); if (var23 == 0.0) { continue; } var9 /= var23; var11 /= var23; var13 /= var23; } var15 = Math.sqrt(var9 * var9 + var11 * var11 + var13 * var13); if (var9 < 0.0) { var15 = -var15; } if (var15 != 0.0) { if (var32 != var31) { this.H[var32][var32 - 1] = -var15 * var23; } else if (var30 != var31) { this.H[var32][var32 - 1] = -this.H[var32][var32 - 1]; } var9 += var15; var23 = var9 / var15; var25 = var11 / var15; var17 = var13 / var15; var11 /= var9; var13 /= var9; int var34; for(var34 = var32; var34 < var1; ++var34) { var9 = this.H[var32][var34] + var11 * this.H[var32 + 1][var34]; if (var33) { var9 += var13 * this.H[var32 + 2][var34]; this.H[var32 + 2][var34] -= var9 * var17; } this.H[var32][var34] -= var9 * var23; this.H[var32 + 1][var34] -= var9 * var25; } for(var34 = 0; var34 <= Math.min(var2, var32 + 3); ++var34) { var9 = var23 * this.H[var34][var32] + var25 * this.H[var34][var32 + 1]; if (var33) { var9 += var17 * this.H[var34][var32 + 2]; this.H[var34][var32 + 2] -= var9 * var13; } this.H[var34][var32] -= var9; this.H[var34][var32 + 1] -= var9 * var11; } for(var34 = var3; var34 <= var4; ++var34) { var9 = var23 * this.V[var34][var32] + var25 * this.V[var34][var32 + 1]; if (var33) { var9 += var17 * this.V[var34][var32 + 2]; this.V[var34][var32 + 2] -= var9 * var13; } this.V[var34][var32] -= var9; this.V[var34][var32 + 1] -= var9 * var11; } } } } } if (var27 == 0.0) { return; } for(var2 = var1 - 1; var2 >= 0; --var2) { var9 = this.d[var2]; var11 = this.e[var2]; double var19; if (var11 == 0.0) { var30 = var2; this.H[var2][var2] = 1.0; for(var31 = var2 - 1; var31 >= 0; --var31) { var21 = this.H[var31][var31] - var9; var13 = 0.0; for(var32 = var30; var32 <= var2; ++var32) { var13 += this.H[var31][var32] * this.H[var32][var2]; } if (this.e[var31] < 0.0) { var17 = var21; var15 = var13; } else { var30 = var31; if (this.e[var31] == 0.0) { if (var21 != 0.0) { this.H[var31][var2] = -var13 / var21; } else { this.H[var31][var2] = -var13 / (var5 * var27); } } else { var23 = this.H[var31][var31 + 1]; var25 = this.H[var31 + 1][var31]; var11 = (this.d[var31] - var9) * (this.d[var31] - var9) + this.e[var31] * this.e[var31]; var19 = (var23 * var15 - var17 * var13) / var11; this.H[var31][var2] = var19; if (Math.abs(var23) > Math.abs(var17)) { this.H[var31 + 1][var2] = (-var13 - var21 * var19) / var23; } else { this.H[var31 + 1][var2] = (-var15 - var25 * var19) / var17; } } var19 = Math.abs(this.H[var31][var2]); if (var5 * var19 * var19 > 1.0) { for(var32 = var31; var32 <= var2; ++var32) { this.H[var32][var2] /= var19; } } } } } else if (var11 < 0.0) { var30 = var2 - 1; if (Math.abs(this.H[var2][var2 - 1]) > Math.abs(this.H[var2 - 1][var2])) { this.H[var2 - 1][var2 - 1] = var11 / this.H[var2][var2 - 1]; this.H[var2 - 1][var2] = -(this.H[var2][var2] - var9) / this.H[var2][var2 - 1]; } else { this.cdiv(0.0, -this.H[var2 - 1][var2], this.H[var2 - 1][var2 - 1] - var9, var11); this.H[var2 - 1][var2 - 1] = this.cdivr; this.H[var2 - 1][var2] = this.cdivi; } this.H[var2][var2 - 1] = 0.0; this.H[var2][var2] = 1.0; for(var31 = var2 - 2; var31 >= 0; --var31) { double var41 = 0.0; double var42 = 0.0; int var40; for(var40 = var30; var40 <= var2; ++var40) { var41 += this.H[var31][var40] * this.H[var40][var2 - 1]; var42 += this.H[var31][var40] * this.H[var40][var2]; } var21 = this.H[var31][var31] - var9; if (this.e[var31] < 0.0) { var17 = var21; var13 = var41; var15 = var42; } else { var30 = var31; if (this.e[var31] == 0.0) { this.cdiv(-var41, -var42, var21, var11); this.H[var31][var2 - 1] = this.cdivr; this.H[var31][var2] = this.cdivi; } else { var23 = this.H[var31][var31 + 1]; var25 = this.H[var31 + 1][var31]; double var36 = (this.d[var31] - var9) * (this.d[var31] - var9) + this.e[var31] * this.e[var31] - var11 * var11; double var38 = (this.d[var31] - var9) * 2.0 * var11; if (var36 == 0.0 & var38 == 0.0) { var36 = var5 * var27 * (Math.abs(var21) + Math.abs(var11) + Math.abs(var23) + Math.abs(var25) + Math.abs(var17)); } this.cdiv(var23 * var13 - var17 * var41 + var11 * var42, var23 * var15 - var17 * var42 - var11 * var41, var36, var38); this.H[var31][var2 - 1] = this.cdivr; this.H[var31][var2] = this.cdivi; if (Math.abs(var23) > Math.abs(var17) + Math.abs(var11)) { this.H[var31 + 1][var2 - 1] = (-var41 - var21 * this.H[var31][var2 - 1] + var11 * this.H[var31][var2]) / var23; this.H[var31 + 1][var2] = (-var42 - var21 * this.H[var31][var2] - var11 * this.H[var31][var2 - 1]) / var23; } else { this.cdiv(-var13 - var25 * this.H[var31][var2 - 1], -var15 - var25 * this.H[var31][var2], var17, var11); this.H[var31 + 1][var2 - 1] = this.cdivr; this.H[var31 + 1][var2] = this.cdivi; } } var19 = Math.max(Math.abs(this.H[var31][var2 - 1]), Math.abs(this.H[var31][var2])); if (var5 * var19 * var19 > 1.0) { for(var40 = var31; var40 <= var2; ++var40) { this.H[var40][var2 - 1] /= var19; this.H[var40][var2] /= var19; } } } } } } for(var30 = 0; var30 < var1; ++var30) { if (var30 < var3 | var30 > var4) { for(var31 = var30; var31 < var1; ++var31) { this.V[var30][var31] = this.H[var30][var31]; } } } for(var30 = var1 - 1; var30 >= var3; --var30) { for(var31 = var3; var31 <= var4; ++var31) { var17 = 0.0; for(var32 = var3; var32 <= Math.min(var30, var4); ++var32) { var17 += this.V[var31][var32] * this.H[var32][var30]; } this.V[var31][var30] = var17; } } return; } } public EigenvalueDecomposition(Matrix var1) { double[][] var2 = var1.getArray(); this.n = var1.getColumnDimension(); this.V = new double[this.n][this.n]; this.d = new double[this.n]; this.e = new double[this.n]; this.issymmetric = true; int var3; int var4; for(var3 = 0; var3 < this.n & this.issymmetric; ++var3) { for(var4 = 0; var4 < this.n & this.issymmetric; ++var4) { this.issymmetric = var2[var4][var3] == var2[var3][var4]; } } if (this.issymmetric) { for(var3 = 0; var3 < this.n; ++var3) { for(var4 = 0; var4 < this.n; ++var4) { this.V[var3][var4] = var2[var3][var4]; } } this.tred2(); this.tql2(); } else { this.H = new double[this.n][this.n]; this.ort = new double[this.n]; for(var3 = 0; var3 < this.n; ++var3) { for(var4 = 0; var4 < this.n; ++var4) { this.H[var4][var3] = var2[var4][var3]; } } this.orthes(); this.hqr2(); } } public Matrix getV() { return new Matrix(this.V, this.n, this.n); } public double[] getRealEigenvalues() { return this.d; } public double[] getImagEigenvalues() { return this.e; } public Matrix getD() { Matrix var1 = new Matrix(this.n, this.n); double[][] var2 = var1.getArray(); for(int var3 = 0; var3 < this.n; ++var3) { for(int var4 = 0; var4 < this.n; ++var4) { var2[var3][var4] = 0.0; } var2[var3][var3] = this.d[var3]; if (this.e[var3] > 0.0) { var2[var3][var3 + 1] = this.e[var3]; } else if (this.e[var3] < 0.0) { var2[var3][var3 - 1] = this.e[var3]; } } return var1; } }