//#define SVD using System.Diagnostics; using System.Windows.Controls; using miew.Matrix; namespace agree.Wpf.Util { /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public partial class DagLayoutPanel : Panel { /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class DagLayoutCalc { DagLayoutPanel panel; public DagLayoutCalc(DagLayoutPanel panel) { this.panel = panel; } #if SVD public Matrix B; public void ComputeSingularValueDecomposition(int n_reduce_dims) { Matrix A = new double[panel._dag.Count, panel._dag.Count]; int i = 0; foreach (var node in panel._dag) { double[] v = new double[panel._dag.Count]; foreach (var pnode in node.Parents) { v[pnode.Index] = 1;// panel.dag.MaxLevel - (li.level - li2.level); } v[node.Index] = 2;// panel.dag.MaxLevel; foreach (var cnode in node.Children) { v[cnode.Index] = 1;// panel.dag.MaxLevel - (li2.level - li.level); } A.SetColumnValues(i, v); i++; } Debug.Print("Starting Singular Value Decomposition for matrix A[{0},{1}]", A.RowCount, A.ColumnCount); Stopwatch stopwatch = Stopwatch.StartNew(); double[] w; Matrix VV; { Matrix V; Matrix.SingularValueDecomposition(A, out w, out V); Debug.Print("SVD complete in {0} ms.", stopwatch.Elapsed.TotalMilliseconds); VV = n_reduce_dims < V.RowCount ? V.TakeKRows(n_reduce_dims) : V; } /// populate w (the singular values) to the diagonal of a new square matrix and multiply by the first n rows of V. B = new Matrix(w, n_reduce_dims) * VV; Debug.Print("Dimensionality reduction to B[{0},{1}] complete.", B.RowCount, B.ColumnCount); } #endif }; } }