[sdpb] 11/233: wrote constraint matrix weighted sum

Tobias Hansen thansen at moszumanska.debian.org
Thu Mar 9 04:06:12 UTC 2017


This is an automated email from the git hooks/post-receive script.

thansen pushed a commit to branch master
in repository sdpb.

commit 06b647f1283215182739f3af39cbc4e81b9dbdd3
Author: David Simmons-Duffin <dsd at athena.sns.ias.edu>
Date:   Mon Jul 7 07:29:48 2014 -0400

    wrote constraint matrix weighted sum
---
 main.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 43 insertions(+), 15 deletions(-)

diff --git a/main.cpp b/main.cpp
index dc3bd0d..436d4b5 100644
--- a/main.cpp
+++ b/main.cpp
@@ -114,6 +114,8 @@ void matrixMultiply(Matrix &A, Matrix &B, Matrix &result) {
         &result.elements[0], result.rows);
 }
 
+//void matrixSubtractInplace(Matrix &A, Matrix &B) {
+
 Real dotProduct(const vector<Real> &u, const vector<Real> v) {
   Real result = 0;
   for (unsigned int i = 0; i < u.size(); i++)
@@ -822,20 +824,42 @@ void componentProduct(const vector<Real> &u, const vector<Real> &v, vector<Real>
 
 // result = V^T D V, where D=diag(d) is a diagonal matrix
 //
-void diagonalCongruence(const vector<Real> &d,
+void diagonalCongruence(Real const *d,
                         const Matrix &V,
                         const int blockRow,
                         const int blockCol,
                         Matrix &result) {
-  int dim = d.size();
-  assert(dim == V.cols);
+  int dim = V.cols;
 
   for (int p = 0; p < V.rows; p++) {
     for (int q = 0; q <= p; q++) {
       Real tmp = 0;
 
       for (int n = 0; n < V.cols; n++)
-        tmp += d[n]*V.get(p, n)*V.get(q, n);
+        tmp += *(d+n) * V.get(p, n)*V.get(q, n);
+      
+      result.set(blockRow*dim + p,blockCol*dim + q, tmp);
+      if (p != q)
+        result.set(blockRow*dim + q,blockCol*dim + p, tmp);
+    }
+  }
+}
+
+// result = V D V^T, where D=diag(d) is a diagonal matrix
+//
+void diagonalCongruenceTranspose(Real const *d,
+                                 const Matrix &V,
+                                 const int blockRow,
+                                 const int blockCol,
+                                 Matrix &result) {
+  int dim = V.rows;
+
+  for (int p = 0; p < V.cols; p++) {
+    for (int q = 0; q <= p; q++) {
+      Real tmp = 0;
+
+      for (int n = 0; n < V.rows; n++)
+        tmp += *(d+n) * V.get(n, p)*V.get(n, q);
       
       result.set(blockRow*dim + p,blockCol*dim + q, tmp);
       if (p != q)
@@ -920,9 +944,7 @@ void computeDVector(const SDP &sdp,
   }
 }
 
-void weightedConstraintMatrixSum(const SDP &sdp,
-                                 const vector<Real> x,
-                                 BlockDiagonalMatrix &result)  {
+void constraintMatrixWeightedSum(const SDP &sdp, const vector<Real> x, BlockDiagonalMatrix &result)  {
 
   for (unsigned int n = 0; n < result.diagonalPart.size(); n++) {
     result.diagonalPart[n] = 0;
@@ -930,18 +952,21 @@ void weightedConstraintMatrixSum(const SDP &sdp,
       result.diagonalPart[n] += x[p]*sdp.polMatrixValues.get(p, n);
   }
 
+  int p = 0;
   for (unsigned int j = 0; j < sdp.dimensions.size(); j++) {
-    const int mj = sdp.dimensions[j];
+    const int dj = sdp.degrees[j];
 
-    for (vector<int>::const_iterator b = sdp.blocks[j].begin(); b != sdp.blocks[j].end(); b++) {
-      for (int s = 0; s < mj; s++) {
-        for (int r = 0; r <= s; r++) {
-          // diagonalCongruence(&x[p0], 
-        }
+    for (int s = 0; s < sdp.dimensions[j]; s++) {
+      for (int r = 0; r <= s; r++) {
+        for (vector<int>::const_iterator b = sdp.blocks[j].begin(); b != sdp.blocks[j].end(); b++)
+          diagonalCongruenceTranspose(&x[p], sdp.bilinearBases[*b], r, s, result.blocks[*b]);
+        p += dj;
       }
-      result.symmetrize();
     }
   }
+  assert(p == (int)x.size() - 1);
+
+  result.symmetrize();
 }
 
 void SDPSolver::computeSearchDirection() {
@@ -957,11 +982,14 @@ void SDPSolver::computeSearchDirection() {
 
   componentProduct(XInv.diagonalPart, Y.diagonalPart, XInvYDiag);
 
-  diagonalCongruence(XInvYDiag, sdp.polMatrixValues, 0, 0, schurComplement);
+  diagonalCongruence(&XInvYDiag[0], sdp.polMatrixValues, 0, 0, schurComplement);
   addSchurBlocks(sdp, S, T, constraintIndexTuples, schurComplement);
 
   computeRc(X, Y, parameters.beta, mu, Rc);
   computeDVector(sdp, T, constraintIndexTuples, d);
+
+  constraintMatrixWeightedSum(sdp, x, Rp);
+  //subtractInplace(Rp, X);
 }
 
 void testSDPSolver() {

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/sdpb.git



More information about the debian-science-commits mailing list