[sdpb] 89/233: Fixed bug in constraintMatrixWeightedSum whereby old data wasn't overwritten
Tobias Hansen
thansen at moszumanska.debian.org
Thu Mar 9 04:06:23 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 0e91817876e69f1662a5b55205165707a4491d8a
Author: David Simmons-Duffin <dsd at minerva.sns.ias.edu>
Date: Sat Oct 11 16:09:03 2014 -0400
Fixed bug in constraintMatrixWeightedSum whereby old data wasn't overwritten
---
src/SDPSolver.cpp | 34 +++++++++++++++++++++++-----------
1 file changed, 23 insertions(+), 11 deletions(-)
diff --git a/src/SDPSolver.cpp b/src/SDPSolver.cpp
index 4ad463a..ff8847c 100644
--- a/src/SDPSolver.cpp
+++ b/src/SDPSolver.cpp
@@ -343,7 +343,7 @@ void computeDualResidues(const SDP &sdp,
Vector &dualResidues) {
#pragma omp parallel for schedule(dynamic)
for (unsigned int j = 0; j < sdp.dimensions.size(); j++) {
- const int ej = sdp.degrees[j] +1;
+ const int ej = sdp.degrees[j] + 1;
for (vector<IndexTuple>::const_iterator t = sdp.constraintIndices[j].begin();
t != sdp.constraintIndices[j].end();
@@ -367,19 +367,31 @@ void computeDualResidues(const SDP &sdp,
void constraintMatrixWeightedSum(const SDP &sdp, const Vector x, BlockDiagonalMatrix &result) {
#pragma omp parallel for schedule(dynamic)
for (unsigned int j = 0; j < sdp.dimensions.size(); j++) {
- const int dj = sdp.degrees[j];
- int p = sdp.constraintIndices[j][0].p;
-
- 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++)
- diagonalCongruence(&x[p], sdp.bilinearBases[*b], r, s, result.blocks[*b]);
- p += dj + 1;
+ const int ej = sdp.degrees[j] + 1;
+
+ for (vector<IndexTuple>::const_iterator t = sdp.constraintIndices[j].begin();
+ t != sdp.constraintIndices[j].end();
+ t += ej) {
+ const int p = t->p;
+ const int r = t->r;
+ const int s = t->s;
+ assert(t->k == 0);
+
+ for (vector<int>::const_iterator b = sdp.blocks[j].begin(); b != sdp.blocks[j].end(); b++) {
+ diagonalCongruence(&x[p], sdp.bilinearBases[*b], r, s, result.blocks[*b]);
+
+ if (r != s) {
+ const int u = sdp.bilinearBases[*b].rows;
+ for (int m = r*u; m < (r+1)*u; m++) {
+ for (int n = s*u; n < (s+1)*u; n++) {
+ result.blocks[*b].elt(m, n) /= 2;
+ result.blocks[*b].elt(n, m) = result.blocks[*b].elt(m, n);
+ }
+ }
+ }
}
}
}
-
- result.symmetrize();
}
void computeSchurRHS(const SDP &sdp,
--
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