From 2eec647a789c3782cafb804d466a71a56e7ee9b1 Mon Sep 17 00:00:00 2001 From: Jack Poulson Date: Sun, 27 Nov 2016 18:08:41 -0800 Subject: [PATCH] Updating python interface --- cmake/configure_files/environment.py.in | 4 - examples/interface/AlgebraicRelationSearch.py | 16 +- examples/interface/BP.py | 9 +- examples/interface/BPComplex.py | 9 +- examples/interface/BPComplexDense.py | 9 +- examples/interface/BPDN.py | 11 +- examples/interface/BPDNDense.py | 11 +- examples/interface/BPDense.py | 9 +- examples/interface/CP.py | 19 +-- examples/interface/CPDense.py | 19 +-- examples/interface/DS.py | 15 +- examples/interface/DSDense.py | 15 +- examples/interface/DruinskyToledo.py | 4 - examples/interface/DynamicRegCounter.py | 4 - examples/interface/EN.py | 15 +- examples/interface/ENDense.py | 13 +- examples/interface/Eig.py | 2 + examples/interface/Fourier.py | 5 - examples/interface/FoxLi.ipynb | 141 ----------------- examples/interface/FoxLi.py | 52 +++++-- examples/interface/GEPPGrowth.py | 4 - examples/interface/GLM.py | 16 +- examples/interface/JordanCholesky.py | 4 - examples/interface/LAV.py | 19 +-- examples/interface/LAVDense.py | 19 +-- examples/interface/LCF.py | 4 - examples/interface/LLL.py | 26 ++-- examples/interface/LLLSingular.py | 24 +-- examples/interface/LPAffine.py | 11 +- examples/interface/LPAffineDense.py | 11 +- examples/interface/LPDirect.py | 11 +- examples/interface/LPDirectDense.py | 15 +- examples/interface/LSE.py | 17 +-- examples/interface/LatticeImageAndKernel.py | 10 +- examples/interface/LeastSquares.py | 12 +- examples/interface/LinearSolve.py | 13 +- examples/interface/LongOnlyPortfolio.py | 14 +- examples/interface/Multiply.py | 7 +- examples/interface/NNLS.py | 13 +- examples/interface/NNLSDense.py | 11 +- examples/interface/ProductLanczos.py | 5 +- examples/interface/QPAffine.py | 11 +- examples/interface/QPAffineDense.py | 11 +- examples/interface/QPDirect.py | 11 +- examples/interface/QPDirectDense.py | 11 +- examples/interface/RLS.py | 13 +- examples/interface/RNNLS.py | 17 +-- examples/interface/RemoteDistSparse.py | 3 - examples/interface/RemoteUpdate.py | 19 +-- examples/interface/SOC.py | 13 +- examples/interface/SOCP_trivial.py | 1 + examples/interface/SVM.py | 9 +- examples/interface/SVMDense.py | 13 +- examples/interface/SequentialLSE.py | 14 +- examples/interface/SequentialLeastSquares.py | 14 +- examples/interface/SequentialLinearSolve.py | 8 +- examples/interface/SymmetricSolve.py | 9 +- examples/interface/TV.py | 21 ++- examples/interface/Tikhonov.py | 12 +- examples/interface/TriangEig.py | 10 +- examples/interface/ZDependenceSearch.py | 14 +- include/El/lapack_like/spectral.h | 41 ++++- python/__init__.py | 7 + python/core/DistMatrix.py | 17 ++- python/io.py | 44 +++--- python/lapack_like/spectral.py | 143 +++++++++++++----- src/lapack_like/spectral-C.cpp | 43 +++++- 67 files changed, 547 insertions(+), 630 deletions(-) delete mode 100644 examples/interface/FoxLi.ipynb diff --git a/cmake/configure_files/environment.py.in b/cmake/configure_files/environment.py.in index e9f36fda92..184418fd0f 100644 --- a/cmake/configure_files/environment.py.in +++ b/cmake/configure_files/environment.py.in @@ -234,10 +234,6 @@ def Initialize(): pythonapi.Py_GetArgcArgv(ctypes.byref(argc),ctypes.byref(argv)) lib.ElInitialize(pointer(argc),pointer(argv)) -lib.ElFinalize.argtypes = [] -def Finalize(): - lib.ElFinalize() - lib.ElInitialized.argtypes = [POINTER(bType)] def Initialized(): active = bType() diff --git a/examples/interface/AlgebraicRelationSearch.py b/examples/interface/AlgebraicRelationSearch.py index 9770dcbcc9..3eba55271d 100644 --- a/examples/interface/AlgebraicRelationSearch.py +++ b/examples/interface/AlgebraicRelationSearch.py @@ -14,7 +14,7 @@ outputAll=False outputCoeff=False -print "alpha=", alpha +print('alpha = {}'.format(alpha)) ctrl=El.LLLCtrl_d() ctrl.progress = progress @@ -31,8 +31,8 @@ for deltaLower in 0.5, 0.75, 0.95, 0.98, 0.99: for variant in El.LLL_NORMAL, El.LLL_DEEP, El.LLL_DEEP_REDUCE: - print "variant=%d, presort=%r, smallestFirst=%r, deltaLower=%f" % \ - (variant,presort,smallestFirst,deltaLower) + print('variant={}, presort={}, smallestFirst={}, deltaLower={}'.format( \ + variant,presort,smallestFirst,deltaLower)) ctrl.delta = deltaLower ctrl.variant = variant @@ -43,12 +43,14 @@ startTime = El.mpi.Time() numExact, B, U = El.AlgebraicRelationSearch(alpha,n,NSqrt,ctrl) runTime = El.mpi.Time() - startTime - print " runtime: %f seconds" % runTime - print " num \"exact\": ", numExact + print(' runtime: {} seconds'.format(runTime)) + print(' num \"exact\": {}'.format(numExact)) if outputAll: El.Print( B, "B" ) El.Print( U, "U" ) elif outputCoeff: El.Print( U[:,0], "u0" ) - print "approximate zero: %e+%ei" % \ - (B.GetRealPart(n,0)/NSqrt,B.GetImagPart(n,0)/NSqrt) + print('approximate zero: {}+{}i'.format( \ + B.GetRealPart(n,0)/NSqrt,B.GetImagPart(n,0)/NSqrt)) + +El.Finalize() diff --git a/examples/interface/BP.py b/examples/interface/BP.py index dc29f8b9a8..a5d5ff0139 100644 --- a/examples/interface/BP.py +++ b/examples/interface/BP.py @@ -72,7 +72,7 @@ def ConcatFD2D(N0,N1): x = El.BP( A, b, ctrl ) endBP = El.mpi.Time() if worldRank == 0: - print "BP time:", endBP-startBP, "seconds" + print('BP time: {} seconds'.format(endBP-startBP)) if display: El.Display( x, "x" ) @@ -84,10 +84,7 @@ def ConcatFD2D(N0,N1): El.Display( e, "e" ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| x ||_1 =", xOneNorm - print "|| A x - b ||_2 =", eTwoNorm + print('|| x ||_1 = {}'.format(xOneNorm)) + print('|| A x - b ||_2 = {}'.format(eTwoNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/BPComplex.py b/examples/interface/BPComplex.py index f47a14b413..a74c8ba4ab 100644 --- a/examples/interface/BPComplex.py +++ b/examples/interface/BPComplex.py @@ -63,7 +63,7 @@ def ConcatFD2D(N0,N1): x = El.BP( A, b, ctrl ) endBP = El.mpi.Time() if worldRank == 0: - print "BP time:", endBP-startBP, "seconds" + print('BP time: {} seconds'.format(endBP-startBP)) if display: El.Display( x, "x" ) if output: @@ -76,10 +76,7 @@ def ConcatFD2D(N0,N1): ( El.NORMAL, El.ComplexDouble(-1), A, x, El.ComplexDouble(1), e ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| x ||_1 =", xOneNorm - print "|| A x - b ||_2 =", eTwoNorm + print('|| x ||_1 = {}'.format(xOneNorm)) + print('|| A x - b ||_2 = {}'.format(eTwoNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/BPComplexDense.py b/examples/interface/BPComplexDense.py index a5ff1e4ced..0f6f06e3f5 100644 --- a/examples/interface/BPComplexDense.py +++ b/examples/interface/BPComplexDense.py @@ -71,7 +71,7 @@ def ConcatFD2D(N0,N1): x = El.BP( A, b, ctrl ) endBP = El.mpi.Time() if worldRank == 0: - print "BP time:", endBP-startBP, "seconds" + print('BP time: {} seconds'.format(endBP-startBP)) if display: El.Display( x, "x" ) if output: @@ -87,10 +87,7 @@ def ConcatFD2D(N0,N1): El.Print( e, "e" ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| x ||_1 =", xOneNorm - print "|| A x - b ||_2 =", eTwoNorm + print('|| x ||_1 = {}'.format(xOneNorm)) + print('|| A x - b ||_2 = {}'.format(eTwoNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/BPDN.py b/examples/interface/BPDN.py index d042065e3c..b4a864f9d0 100644 --- a/examples/interface/BPDN.py +++ b/examples/interface/BPDN.py @@ -70,13 +70,13 @@ def ConcatFD2D(N0,N1): for j in xrange(0,numLambdas): lambd = startLambda + j*(endLambda-startLambda)/(numLambdas-1.) if worldRank == 0: - print "lambda =", lambd + print('lambda = {}'.format(lambd)) startBPDN = El.mpi.Time() x = El.BPDN( A, b, lambd, ctrl ) endBPDN = El.mpi.Time() if worldRank == 0: - print "BPDN time:", endBPDN-startBPDN, "seconds" + print('BPDN time: {} seconds'.format(endBPDN-startBPDN)) if display: El.Display( x, "x" ) @@ -88,10 +88,7 @@ def ConcatFD2D(N0,N1): El.Display( e, "e" ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| x ||_1 =", xOneNorm - print "|| A x - b ||_2 =", eTwoNorm + print('|| x ||_1 = {}'.format(xOneNorm)) + print('|| A x - b ||_2 = {}'.format(eTwoNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/BPDNDense.py b/examples/interface/BPDNDense.py index b9fb70eb18..351f13cbb9 100644 --- a/examples/interface/BPDNDense.py +++ b/examples/interface/BPDNDense.py @@ -35,13 +35,13 @@ def Rectang(height,width): for j in xrange(0,numLambdas): lambd = startLambda + j*(endLambda-startLambda)/(numLambdas-1.) if worldRank == 0: - print "lambda =", lambd + print('lambda = {}'.format(lambd)) startBPDN = El.mpi.Time() x = El.BPDN( A, b, lambd, ctrl ) endBPDN = El.mpi.Time() if worldRank == 0: - print "BPDN time:", endBPDN-startBPDN, "seconds" + print('BPDN time: {} seconds'.format(endBPDN-startBPDN)) if display: El.Display( x, "x" ) @@ -53,10 +53,7 @@ def Rectang(height,width): El.Display( e, "e" ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| x ||_1 =", xOneNorm - print "|| A x - b ||_2 =", eTwoNorm + print('|| x ||_1 = {}'.format(xOneNorm)) + print('|| A x - b ||_2 = {}'.format(eTwoNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/BPDense.py b/examples/interface/BPDense.py index 5bab2654ff..dd70fa22bc 100644 --- a/examples/interface/BPDense.py +++ b/examples/interface/BPDense.py @@ -32,7 +32,7 @@ def Rectang(height,width): x = El.BP( A, b, ctrl ) endBP = El.mpi.Time() if worldRank == 0: - print "BP time:", endBP-startBP, "seconds" + print('BP time: {} seconds'.format(endBP-startBP)) if display: El.Display( x, "x" ) @@ -44,10 +44,7 @@ def Rectang(height,width): El.Display( e, "e" ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| x ||_1 =", xOneNorm - print "|| A x - b ||_2 =", eTwoNorm + print('|| x ||_1 = {}'.format(xOneNorm)) + print('|| A x - b ||_2 = {}'.format(eTwoNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/CP.py b/examples/interface/CP.py index f7199e3af0..1715fda38a 100644 --- a/examples/interface/CP.py +++ b/examples/interface/CP.py @@ -71,7 +71,7 @@ def StackedFD2D(N0,N1): x = El.CP( A, b, ctrl ) endCP = El.mpi.Time() if worldRank == 0: - print "CP time:", endCP-startCP, "seconds" + print('CP time: {} seconds'.format(endCP-startCP)) if display: El.Display( x, "x" ) @@ -85,16 +85,16 @@ def StackedFD2D(N0,N1): rTwoNorm = El.Nrm2( r ) rInfNorm = El.MaxNorm( r ) if worldRank == 0: - print "|| b ||_2 =", bTwoNorm - print "|| b ||_oo =", bInfNorm - print "|| A x - b ||_2 =", rTwoNorm - print "|| A x - b ||_oo =", rInfNorm + print('|| b ||_2 = {}'.format(bTwoNorm)) + print('|| b ||_oo = {}'.format(bInfNorm)) + print('|| A x - b ||_2 = {}'.format(rTwoNorm)) + print('|| A x - b ||_oo = {}'.format(rInfNorm)) startLS = El.mpi.Time() xLS = El.LeastSquares(A,b) endLS = El.mpi.Time() if worldRank == 0: - print "LS time:", endLS-startLS, "seconds" + print('LS time: {} seconds'.format(endLS-startLS)) if display: El.Display( xLS, "x_{LS}" ) rLS = El.DistMultiVec() @@ -105,10 +105,7 @@ def StackedFD2D(N0,N1): rLSTwoNorm = El.Nrm2(rLS) rLSInfNorm = El.MaxNorm(rLS) if worldRank == 0: - print "|| A x_{LS} - b ||_2 =", rLSTwoNorm - print "|| A x_{LS} - b ||_oo =", rLSInfNorm + print('|| A x_{{LS}} - b ||_2 = {}'.format(rLSTwoNorm)) + print('|| A x_{{LS}} - b ||_oo = {}'.format(rLSInfNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/CPDense.py b/examples/interface/CPDense.py index 30dfe772c0..86f1e1f156 100644 --- a/examples/interface/CPDense.py +++ b/examples/interface/CPDense.py @@ -32,7 +32,7 @@ def Rectang(height,width): x = El.CP( A, b, ctrl ) endCP = El.mpi.Time() if worldRank == 0: - print "CP time:", endCP-startCP, "seconds" + print('CP time: {} seconds'.format(endCP-startCP)) if display: El.Display( x, "x" ) @@ -46,16 +46,16 @@ def Rectang(height,width): rTwoNorm = El.Nrm2( r ) rInfNorm = El.MaxNorm( r ) if worldRank == 0: - print "|| b ||_2 =", bTwoNorm - print "|| b ||_oo =", bInfNorm - print "|| A x - b ||_2 =", rTwoNorm - print "|| A x - b ||_oo =", rInfNorm + print('|| b ||_2 = {}'.format(bTwoNorm)) + print('|| b ||_oo = {}'.format(bInfNorm)) + print('|| A x - b ||_2 = {}'.format(rTwoNorm)) + print('|| A x - b ||_oo = {}'.format(rInfNorm)) startLS = El.mpi.Time() xLS = El.LeastSquares(A,b) endLS = El.mpi.Time() if worldRank == 0: - print "LS time:", endLS-startLS, "seconds" + print('LS time: {} seconds'.format(endLS-startLS)) if display: El.Display( xLS, "x_{LS}" ) rLS = El.DistMatrix() @@ -66,10 +66,7 @@ def Rectang(height,width): rLSTwoNorm = El.Nrm2(rLS) rLSInfNorm = El.MaxNorm(rLS) if worldRank == 0: - print "|| A x_{LS} - b ||_2 =", rLSTwoNorm - print "|| A x_{LS} - b ||_oo =", rLSInfNorm + print('|| A x_{{LS}} - b ||_2 = {}'.format(rLSTwoNorm)) + print('|| A x_{{LS}} - b ||_oo = {}'.format(rLSInfNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/DS.py b/examples/interface/DS.py index f41c6fd517..5662c1767b 100644 --- a/examples/interface/DS.py +++ b/examples/interface/DS.py @@ -66,13 +66,13 @@ def ConcatFD2D(N0,N1): for j in xrange(0,numLambdas): lambd = startLambda + j*(endLambda-startLambda)/(numLambdas-1.) if worldRank == 0: - print "lambda =", lambd + print('lambda = {}'.format(lambd)) startDS = El.mpi.Time() x = El.DS( A, b, lambd, ctrl ) endDS = El.mpi.Time() if worldRank == 0: - print "DS time:", endDS-startDS, "seconds" + print('DS time: {} seconds'.format(endDS-startDS)) if display: El.Display( x, "x" ) @@ -90,12 +90,9 @@ def ConcatFD2D(N0,N1): El.Display( r, "r" ) El.Display( t, "t" ) if worldRank == 0: - print "|| x ||_1 =", xOneNorm - print "|| b - A x ||_2 =", rTwoNorm - print "|| A^T (b - A x) ||_2 =", tTwoNorm - print "|| A^T (b - A x) ||_oo =", tInfNorm + print('|| x ||_1 = {}'.format(xOneNorm)) + print('|| b - A x ||_2 = {}'.format(rTwoNorm)) + print('|| A^T (b - A x) ||_2 = {}'.format(tTwoNorm)) + print('|| A^T (b - A x) ||_oo = {}'.format(tInfNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/DSDense.py b/examples/interface/DSDense.py index aab64075db..2b724a0807 100644 --- a/examples/interface/DSDense.py +++ b/examples/interface/DSDense.py @@ -35,13 +35,13 @@ def Rectang(height,width): for j in xrange(0,numLambdas): lambd = startLambda + j*(endLambda-startLambda)/(numLambdas-1.) if worldRank == 0: - print "lambda =", lambd + print('lambda = {}'.format(lambd)) startDS = El.mpi.Time() x = El.DS( A, b, lambd, ctrl ) endDS = El.mpi.Time() if worldRank == 0: - print "DS time:", endDS-startDS, "seconds" + print('DS time: {} seconds'.format(endDS-startDS)) if display: El.Display( x, "x" ) @@ -59,12 +59,9 @@ def Rectang(height,width): El.Display( r, "r" ) El.Display( t, "t" ) if worldRank == 0: - print "|| x ||_1 =", xOneNorm - print "|| b - A x ||_2 =", rTwoNorm - print "|| A^T (b - A x) ||_2 =", tTwoNorm - print "|| A^T (b - A x) ||_oo =", tInfNorm + print('|| x ||_1 = {}'.format(xOneNorm)) + print('|| b - A x ||_2 = {}'.format(rTwoNorm)) + print('|| A^T (b - A x) ||_2 = {}'.format(tTwoNorm)) + print('|| A^T (b - A x) ||_oo = {}'.format(tInfNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/DruinskyToledo.py b/examples/interface/DruinskyToledo.py index 3d691a7d7d..9bfd7c7027 100644 --- a/examples/interface/DruinskyToledo.py +++ b/examples/interface/DruinskyToledo.py @@ -39,8 +39,4 @@ El.EntrywiseMap(A_LU,lambda x:math.log10(max(abs(x),1))) El.Display(A_LU,"Logarithmically-scaled LU factors") -# Require the user to press a button before the figures are closed -worldSize = El.mpi.WorldSize() El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/DynamicRegCounter.py b/examples/interface/DynamicRegCounter.py index af675eadb4..70077bfc3e 100644 --- a/examples/interface/DynamicRegCounter.py +++ b/examples/interface/DynamicRegCounter.py @@ -14,8 +14,4 @@ El.DynamicRegCounter( A, n ) El.Display( A, "A" ) -# Require the user to press a button before the figures are closed -worldSize = El.mpi.WorldSize() El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/EN.py b/examples/interface/EN.py index 2a43ad79f5..76563bbeb0 100644 --- a/examples/interface/EN.py +++ b/examples/interface/EN.py @@ -67,7 +67,7 @@ def ConcatFD2D(N0,N1): El.Display( b, "b" ) if worldRank == 0: - print "lambda1 =", lambda1, "lambda2 =", lambda2 + print('lambda1 = {}, lambda2 = {}'.format(lambda1,lambda2)) ctrl = El.QPAffineCtrl_d() ctrl.mehrotraCtrl.progress = True @@ -81,7 +81,7 @@ def ConcatFD2D(N0,N1): x = El.EN( A, b, lambda1, lambda2, ctrl ) endEN = El.mpi.Time() if worldRank == 0: - print "EN time (resolve reg.):", endEN-startEN, "seconds" + print('EN time (resolve reg.): {} seconds'.format(endEN-startEN)) if display: El.Display( x, "x" ) @@ -91,7 +91,7 @@ def ConcatFD2D(N0,N1): x = El.EN( A, b, lambda1, lambda2, ctrl ) endEN = El.mpi.Time() if worldRank == 0: - print "EN time (no resolve reg.):", endEN-startEN, "seconds" + print('EN time (no resolve reg.): {} seconds'.format(endEN-startEN)) if display: El.Display( x, "x" ) @@ -104,11 +104,8 @@ def ConcatFD2D(N0,N1): El.Display( e, "e" ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| x ||_1 =", xOneNorm - print "|| x ||_2 =", xTwoNorm - print "|| A x - b ||_2 =", eTwoNorm + print('|| x ||_1 = {}'.format(xOneNorm)) + print('|| x ||_2 = {}'.format(xTwoNorm)) + print('|| A x - b ||_2 = {}'.format(eTwoNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/ENDense.py b/examples/interface/ENDense.py index 15a2177883..5d950ab6de 100644 --- a/examples/interface/ENDense.py +++ b/examples/interface/ENDense.py @@ -33,13 +33,13 @@ def Rectang(height,width): ctrl.mehrotraCtrl.time = True if worldRank == 0: - print "lambda1 =", lambda1, "lambda2 =", lambda2 + print('lambda1 = {}, lambda2 = {}'.format(lambda1,lambda2)) startEN = El.mpi.Time() x = El.EN( A, b, lambda1, lambda2, ctrl ) endEN = El.mpi.Time() if worldRank == 0: - print "EN time:", endEN-startEN, "seconds" + print('EN time: {} seconds'.format(endEN-startEN)) if display: El.Display( x, "x" ) @@ -52,11 +52,8 @@ def Rectang(height,width): El.Display( e, "e" ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| x ||_1 =", xOneNorm - print "|| x ||_2 =", xTwoNorm - print "|| A x - b ||_2 =", eTwoNorm + print('|| x ||_1 = {}'.format(xOneNorm)) + print('|| x ||_2 = {}'.format(xTwoNorm)) + print('|| A x - b ||_2 = {}'.format(eTwoNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/Eig.py b/examples/interface/Eig.py index 21568a38ca..d6c87eff9c 100644 --- a/examples/interface/Eig.py +++ b/examples/interface/Eig.py @@ -14,3 +14,5 @@ El.Print( A, "A" ) El.Print( w, "w" ) El.Print( X, "X" ) + +El.Finalize() diff --git a/examples/interface/Fourier.py b/examples/interface/Fourier.py index 32ac902192..5b5b304ab1 100644 --- a/examples/interface/Fourier.py +++ b/examples/interface/Fourier.py @@ -23,9 +23,4 @@ portrait, box = El.SpectralPortrait(A,realRes,imagRes) El.DisplayPortrait(portrait,box,"spectral portrait of Fourier matrix") -# Require the user to press a button before the figures are closed -worldSize = El.mpi.WorldSize() El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') - diff --git a/examples/interface/FoxLi.ipynb b/examples/interface/FoxLi.ipynb deleted file mode 100644 index 0c162be30c..0000000000 --- a/examples/interface/FoxLi.ipynb +++ /dev/null @@ -1,141 +0,0 @@ -{ - "metadata": { - "name": "" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ - { - "cells": [ - { - "cell_type": "code", - "collapsed": false, - "input": [ - "from IPython.parallel import Client\n", - "c = Client(profile='mpi')\n", - "view = c[:]\n", - "view.activate()\n", - "view.block = True\n", - "%matplotlib inline" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 1 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%%px\n", - "# Initialize Elemental and print the process grid dimensions\n", - "import El\n", - "grid = El.DefaultGrid()\n", - "if El.mpi.WorldRank() == 0:\n", - " print \"Grid is\", grid.Height(), \"x\", grid.Width()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "[stdout:1] Grid is 2 x 3\n" - ] - } - ], - "prompt_number": 2 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%%px\n", - "# Generate and display a Fox-Li/Landau matrix\n", - "n = 200\n", - "A = El.DistMatrix(El.zTag)\n", - "El.FoxLi(A,n)\n", - "El.Display(A,\"Fox-Li/Landau matrix\")" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "display_data", - "text": [ - "[output:1]" - ] - }, - { - "metadata": {}, - "output_type": "display_data", - "png": "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\n", - "text": [ - "" - ] - } - ], - "prompt_number": 5 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%%px\n", - "# Display its spectral portrait\n", - "import math\n", - "realRes = imagRes = 100\n", - "portrait, box = El.SpectralPortrait(A,realRes,imagRes)\n", - "El.DisplayPortrait(portrait,box,\"spectral portrait of Fox-Li/Landau matrix\")" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "display_data", - "text": [ - "[output:1]" - ] - }, - { - "metadata": {}, - "output_type": "display_data", - "png": "iVBORw0KGgoAAAANSUhEUgAAATMAAAERCAYAAAAXPEBjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsfXm8HUWV/7e6+9773kteNkIWSEgIyyAwmCio8YNsI4go\nwogiKBAQwWHUEZcRBsYBRidAxhEddPzpfJBVFB03ZBAdhIiDI6DD8mFUFtmSEAIhy8t7eXfrrt8f\n3efe0+ee6u773k1ISM7n9ef266quqq6u+tb3nDpVbay1Fjtlp+yUnbKdi/dKF2Cn7JSdslN6ITvB\nbKfslJ3yqpCdYLZTdspOeVXITjDbKTtlp7wqZCeY7ZSdslNeFbITzHbKTtkprwrZYcHsiCOOwDXX\nXPNKF6OwfOtb38Lb3va2nqX3wx/+EHPnzsXg4CAefvjhnqXbCznvvPPw+c9//hUtw/LlyzF37txX\ntAy9lAMPPBD33HPPK12MLSt2OxRjjP3Tn/40rjSOOOIIe8011/SoRNmyZMkS+/d///c9TXO8dbBg\nwQJ76623ZqY/YcIEO3HiRDtx4kQ7derUMeelyd13323nzJlTOP7SpUvtRRdd1PV9Y5Wtlc94ZUu0\nre1VtltmZjN8fZvN5lYsSbaEYZgbZ6zlzaqDvPuee+457L///pnxHnnkEWzatAmbNm3CunXrxpRX\nr+T222/HO97xjle0DNujbEt9YUtLT8DsyiuvxJw5czBp0iTst99+uOuuuwAAl156Kd7znvfglFNO\nwaRJk/D6178ejzzySOu+559/HieddBJmzJiBBQsW4Oqrr26FRVGEpUuXYu+998akSZNwyCGHYOXK\nlTjssMMAAK997WsxODiI733ve1i+fDnmzJmDZcuWYfbs2Tj77LOxYcMGvPOd78SMGTMwbdo0HH/8\n8Vi1alWh58kr9x/+8AccccQRmDp1Kg488ED85Cc/aYWdeeaZOO+883Dcccdh4sSJ+OY3v4mbb74Z\ny5Ytw+DgIE444QQAwPz587Fs2TIcdNBBGBwcRBiGuOKKK1rPe8ABB+BHP/pRK93rrrsOb3nLWwBA\nrQMp1lp8/vOfx/z58zFz5kwsWbIEQ0NDqNVqrfxe+9rXYp999ilUJyQbN27EGWecgRkzZmD+/Pn4\np3/6J1hrsW7dOsydOxe33XYbAGB4eBh77703brrppq7Spzr87Gc/2/p//fr1ePzxx7F48eLM+/7z\nP/8TixYtwuTJk7HHHnvgsssua4U988wz8DwPN9xwA+bNm4ddd90VS5cubYWPjo7izDPPxLRp03DA\nAQfggQceSKWd9W4uvfRSnH766R15RVGklnP+/Pn4whe+0Hr3Z599NtasWYO3v/3tmDx5Mo4++mhs\n2LChFf+9730vZs+ejSlTpuDwww/H73//ewDAN77xjcJta/78+a1+edxxx+HTn/50K/1TTjkFZ599\ndmbdbhcyXmr3xz/+0c6dO9euXr3aWmvts88+21J/LrnkElsqlez3v/9922w27Re+8AW755572maz\nacMwtK973evs5z73OdtoNOxTTz1lFyxYYH/2s59Za61dtmyZ/fM//3P7+OOPW2utffjhh+3LL79s\nre1Use6++24bBIG98MILbb1et6Ojo/bll1+2P/jBD+zo6KjdtGmTfe9732tPPPHE1j1ZamZWuev1\nut1rr73s5ZdfbhuNhr3rrrvs4OCgfeyxx6y1Me2fPHmy/fWvf22ttbZardozzzzTfvazn03lMW/e\nPLto0SK7cuVKW61WrbXWfu9732vV4y233GInTJhgX3jhBWuttddee6099NBDW/fnqZnXXHON3Xvv\nve3TTz9th4eH7bvf/W57+umnF77fGGOffPLJjuunn366PfHEE+3w8LB95pln7L777tuqx5///Od2\n1qxZ9sUXX7Qf+tCH7Hvf+15n+llqnKyvb3/72/b9739/7n3Lly+3jz76qLXW2kceecTOnDnT/uhH\nP7LWWvv0009bY4w999xzbbVatQ8//LCtVCr2j3/8o7XW2gsuuMAedthhdv369XbFihX2gAMOsHPn\nzm2lnfVuLr30Unvaaae14lJeYRiq5Zw/f75dvHixffHFF+2qVavsjBkz7KJFi+xDDz1kq9WqPeqo\no+xll13Win/ttdfa4eFhW6/X7fnnn28XLlzorCtr9bY1f/58+4tf/MJaa+0LL7xgZ8yYYe+66y57\n00032b322ssODw+rZd2eZNxg9sQTT9gZM2bYO++809br9VTYJZdcYhcvXtz6P4oiO3v2bPurX/3K\n/uY3v7F77LFHKv7SpUvtWWedZa21dt9993XadDQwK5fLtlarOcv54IMPpuw+eWDmKvc999xjZ82a\nlYp/6qmn2ksvvdRaG4PZkiVLUuFnnnlmh11j/vz59tprr3WW11prFy5caH/84x9ba7sHs6OOOsp+\n7Wtfa/3/2GOP2VKp1OpgRcBs0qRJdsqUKXbKlCn24x//uG02m7ZcLts//OEPrXhf//rX7RFHHNH6\n/2Mf+5g98MAD7Zw5c+y6deuc6eeBGa+v0047zd50002590n5+Mc/bj/xiU9Ya9sAs2rVqlb4G97w\nBnvLLbdYa21qILXW2m984xuZ+SxcuLDVPi+55JKuwezmm29u/X/SSSfZv/7rv279f/XVV6cGXi7r\n16+3xhg7NDRkrS3etjiYWWvt97//fTtnzhw7ffp0e++99zqfc3uScauZe++9N770pS/h0ksvxcyZ\nM3Hqqadi9erVrfA5c+a0zo0xmDNnDp5//nk899xzeP755zF16tTWcfnll+PFF18EAKxcuRJ77bVX\n4XLsuuuuKJfLrf83b96MD3/4w5g/fz4mT56Mww8/HBs3bixsZ3KVe/Xq1R2zXPPmzcPzzz/filt0\nFkzGu+GGG7Bo0aJWfTz66KN4+eWXC6UlZfXq1Zg3b17r/z322APNZhNr1qwpnMaDDz6I9evXY/36\n9fjSl76EtWvXotFodKTL1fdzzjkH//d//4czzzwTU6dOBQA899xzGBwcxODgICZNmtTVc0RRhDvv\nvBPHHntsbtz77rsPRx55JGbMmIEpU6bg61//ekf9zZo1q3U+MDCA4eFhALHJg7+PPfbYI3Wf9m7W\nrl3b1bNwmTlzZuu8v78/9X9fX1+rXGEY4sILL8Tee++NyZMnY8899wSA3Lzz2uA73/lOhGGI/fbb\nD29+85vH+hjblPTEZnbqqafiV7/6FZ599lkYY3DBBRe0wlasWNE6j6IIK1euxO677465c+dizz33\nbHWW9evXY2hoqGVzmTt3Lp588snCZTDGpP7/l3/5Fzz++OO4//77sXHjRvzyl7+EjZloofRc5d5t\nt92wYsWKVDrPPvssdt9998Jl064/++yzOPfcc/HVr34V69atw/r163HggQeO2ci/22674Zlnnmn9\n/9xzzyEIglSn6VamT5+OUqnUkS4BfxiGOPfcc3HGGWfgq1/9Kv70pz8BiIGBJhKGhoYK5UV188AD\nD2DevHnYZZddcu95//vfjxNPPBErV67Ehg0b8Fd/9VdOu5WU2bNn47nnnks9F0neu5k4cSI2b97c\niv/CCy8UypOL6z3ffPPNuPXWW/GLX/wCGzduxNNPP52KX6RtaXLxxRdj//33x+rVq/Gd73yn6/Ju\nizJuMHv88cdx1113oVaroVKpoK+vD77vt8J/97vf4Yc//CGazSa+9KUvoa+vD29605twyCGHYHBw\nEMuWLcPo6CjCMMSjjz6K3/72twCAD33oQ/jsZz+LJ598EtZaPPLII60ZtZkzZ7Y6ikuGh4fR39+P\nyZMnY926dSljMEkWULjK/YY3vAEDAwNYtmwZGo0Gli9fjttuuw2nnHKKM82ZM2fiqaeeyizvyMgI\njDGYPn06oijCtddei0cffdQZP68OTj31VFx11VV45plnMDw8jIsuuginnHIKPG/sr9z3fZx88sm4\n+OKLMTw8jGeffRZXXXUVTjvtNADA0qVL4fs+rr32Wvzt3/4tzjjjjFwwqdVqqFarrQNAatC5/fbb\n8c53vjP3PmsthoeHMXXqVJTLZdx///24+eabczs1ycknn4zLL78cGzZswMqVK1OTUXnvZuHChbjn\nnnuwYsUKbNy4EZdffnmhPIvI8PAwKpUKpk2bhpGREVx00UWp8CJtS8o999yD6667DjfeeCOuu+46\nfOxjH2tpFtuzjBvMarUa/u7v/g677rorZs+ejbVr17ZepjEGJ5xwAm655RZMmzYN3/rWt/CDH/wA\nvu/D933cdttteOihh7BgwQLsuuuuOPfcc1sj9yc/+UmcfPLJOOaYYzB58mScc845rcZ+6aWXYsmS\nJZg6dSr+4z/+A8aYjkZ7/vnnY3R0FNOnT8eb3/xmvP3tb++IkzWqucpdLpfxk5/8BD/96U+x6667\n4qMf/ShuvPFG7Lvvvq17Zbpnn302fv/732Pq1Kl497vfrea5//7741Of+hQWL16MWbNm4dFHH8Wh\nhx6aKhNPV9aBlA9+8IM4/fTTcdhhh2HBggUYGBhIddC8Tu4Kv/rqqzFhwgQsWLAAb3nLW/CBD3wA\nZ511Fn73u9/hqquuwg033NBi58YYXHnllc70V61ahf7+fgwMDGBgYAATJkzAn/70p9Sz3n777Tju\nuONy73v66afxb//2b/iHf/gHTJo0CZ/73Ofwvve9r9AzAcAll1yCefPmYc8998Sxxx6LM844oxU/\n79289a1vxfve9z4cdNBBOOSQQ3D88ccXBlGtbPz5zzjjDMybNw+77747DjzwQCxevDgVt0jb4jI0\nNIQlS5bgq1/9KmbPno1DDz0UZ599Nj74wQ92Vd5tUYwdqx5TQC677DI8+eSTuPHGG7dUFltEttdy\n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\n9FqZVrlWfKth+uqsiS9PS+aS5niKxVaseL48yvKWYTDCZJxe6jKXdL74812nQcjiUjPndaXZnTt3\n4uGHH56v7JdlWZZlDvLLv/zLOHDgQF95VNldicvatWtx9OjRvsosk3kFs2VZlmVZloWSN5NT0rIs\ny7IsiynLYLYsy7IsbwlZBrNlWZZleUvIvIHZgw8+iK1bt+Kss87CnXfeOV/F9C2HDx/Gu9/9bmzf\nvh3nnnsu/vzP/xwAcPToUezatQtnn3023vve92JiYuI411SXNE1x4YUX4uqrrwbw5qn3xMQErr/+\nepxzzjnYtm0bHnvssTdF3ffs2YPt27fjvPPOw4c//GHU6/U3Rb2XgswLmKVpik9+8pN48MEH8cMf\n/hBf/OIX8dRTT81HUX1LrVbDZz7zGfzgBz/Ao48+ir/4i7/AU089hb1792LXrl14+umncfnll2Pv\n3r3Hu6qq3H333di2bVtrdOnNUu9bbrkFV111FZ566ik8+eST2Lp166Kv+6FDh/C5z30OBw8exPe/\n/32kaYr7779/0dd7yYibB3nkkUfcFVdc0Trfs2eP27Nnz3wUNXB5//vf7/71X//Vve1tb3Mvv/yy\nc865l156yb3tbW87zjXrlsOHD7vLL7/cPfTQQ+5973ufc869Keo9MTHhTjvttK7ri73ur776qjv7\n7LPd0aNHXbPZdO973/vcv/zLvyz6ei8VmRdm9uKLL2LLli2t882bN+PFF1+cj6IGKocOHcJ3v/td\nXHrppThy5Ag2bNgAANiwYQOOHDlynGvXLb/3e7+HP/uzP0MYtl/jm6Hezz33HE466STceOONuOii\ni3DzzTdjampq0dd93bp1uO2223DKKafg5JNPxpo1a7Br165FX++lIvMCZr061C0GmZycxHXXXYe7\n774bK1eu7AgLgmDR3dM//dM/Yf369bjwwgvNbe8XY70BIEkSHDx4EL/927+NgwcPYmxsrEs1W4x1\nf/bZZ3HXXXfh0KFD+OlPf4rJyUncd999HXEWY72XiswLmG3atAmHDx9unR8+fBibN2+ej6IGIs1m\nE9dddx1uuOEGXHPNNQDyL+zLL78MAHjppZewfv3641nFLnnkkUfwla98Baeddho+9KEP4aGHHsIN\nN9yw6OsN5Ex98+bNuOSSSwAA119/PQ4ePIiNGzcu6rp/+9vfxjve8Q6ccMIJiOMY1157Lb75zW8u\n+novFZkXMLv44ovxzDPP4NChQ2g0GvjSl76E3bt3z0dRfYtzDjfddBO2bduGW2+9tXV99+7d2Ldv\nHwBg3759LZBbLHLHHXfg8OHDeO6553D//ffjPe95D/72b/920dcbADZu3IgtW7bg6aefBgDs378f\n27dvx9VXX72o675161Y8+uijmJmZgXMO+/fvx7Zt2xZ9vZeMzJcx7qtf/ao7++yz3RlnnOHuuOOO\n+Sqmb/n617/ugiBwF1xwgduxY4fbsWOH+9rXvuZeffVVd/nll7uzzjrL7dq1y7322mvHu6qmHDhw\nwF199dXOOfemqff3vvc9d/HFF7vzzz/f/cqv/IqbmJh4U9T9zjvvdNu2bXPnnnuu+8hHPuIajcab\not5LQZbnZi7LsizLW0KWZwAsy7Isy1tClsFsWZZlWd4Ssgxmy7Isy/KWkGUwW5ZlWZa3hCyD2bIs\ny7K8JWQZzJZlWZblLSHLYLYsy7Isbwn5/817wkCmDk8vAAAAAElFTkSuQmCC\n", - "text": [ - "" - ] - } - ], - "prompt_number": "*" - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%%px\n", - "# Display its singular values\n", - "s = El.SVD(A)\n", - "El.EntrywiseMap(s,math.log10)\n", - "El.Display(s,\"log10(svd(A))\")" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": "*" - }, - { - "cell_type": "code", - "collapsed": false, - "input": [], - "language": "python", - "metadata": {}, - "outputs": [] - } - ], - "metadata": {} - } - ] -} diff --git a/examples/interface/FoxLi.py b/examples/interface/FoxLi.py index c424d955ea..60ffd30a90 100644 --- a/examples/interface/FoxLi.py +++ b/examples/interface/FoxLi.py @@ -6,26 +6,48 @@ # which can be found in the LICENSE file in the root directory, or at # http://opensource.org/licenses/BSD-2-Clause # -import math, El -n = 100 # matrix size +import math, time, El +if El.havePyPlot: + El.plt.set_cmap('bone') + # pyplot.set_cmap seems to open an empty figure (which can be detected by + # running pyplot.get_fignums()), and so we manually close it. Unfortunately, + # some versions of pyplot generate a spurious warning of: + # + # can't invoke "event" command: application has been destroyed + # + # when calling pyplot.close(). + El.plt.close(1) + realRes = imagRes = 100 # grid resolution # Display an instance of the Fox-Li/Landau matrix A = El.DistMatrix(El.zTag) -El.FoxLi(A,n) -El.Display(A,"Fox-Li/Landau matrix") -# Display its spectral portrait -portrait, box = El.SpectralPortrait(A,realRes,imagRes) -El.DisplayPortrait(portrait,box,"spectral portrait of Fox-Li/Landau matrix") +nList = (50,100,300) +for n in nList: + El.FoxLi(A,n) + + # Show the Real part of the matrix + AReal = El.DistMatrix(El.dTag) + El.RealPart(A,AReal) + El.Display(AReal,'Real part of Fox-Li matrix (n={})'.format(n)) + + # Compute the Schur decomposition (overwriting A with the Schur factor) + schurStart = time.time() + w = El.Schur(A) + schurStop = time.time() + if A.Grid().Rank() is 0: + print('Schur decomp for n={}: {} [sec]'.format(n,schurStop-schurStart,)) + + # Compute the spectral portrait of the Schur factor + portraitStart = time.time() + portrait, box = El.TriangularSpectralPortrait(A,realRes,imagRes) + portraitStop = time.time() + if A.Grid().Rank() is 0: + print('Portrait for n={}: {} [sec]'.format(n,portraitStop-portraitStart,)) -# Display its singular values -s = El.SingularValues(A) -El.EntrywiseMap(s,math.log10) -El.Display(s,"log10(svd(A))") + # Display the eigenvalues on top of log10 plot of portrait + El.DisplayPortrait(portrait,box,title='Fox-Li portrait (n={})'.format(n), + eigvals=w) -# Require the user to press a button before the figures are closed -worldSize = El.mpi.WorldSize() El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/GEPPGrowth.py b/examples/interface/GEPPGrowth.py index 8869c61c1f..cf1713df67 100644 --- a/examples/interface/GEPPGrowth.py +++ b/examples/interface/GEPPGrowth.py @@ -26,8 +26,4 @@ El.Display(A,"Logarithmically-scaled LU factors") El.Display(A[0:n,n-1],"Last column of logarithmic U") -# Require the user to press a button before the figures are closed -worldSize = El.mpi.WorldSize() El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/GLM.py b/examples/interface/GLM.py index ad4fe23651..6a5d09b708 100644 --- a/examples/interface/GLM.py +++ b/examples/interface/GLM.py @@ -87,7 +87,7 @@ def Constraints(numCols,N0,N1): X,Y = El.GLM(A,B,D,ctrl) endGLM = El.mpi.Time() if worldRank == 0: - print "GLM time:", endGLM-startGLM, "seconds" + print('GLM time: {} seconds'.format(endGLM-startGLM)) if display: El.Display( X, "X" ) El.Display( Y, "Y" ) @@ -97,7 +97,7 @@ def Constraints(numCols,N0,N1): YNorm = El.FrobeniusNorm( Y ) if worldRank == 0: - print "|| Y ||_F =", YNorm + print('|| Y ||_F = {}'.format(YNorm)) E = El.DistMultiVec() El.Copy( D, E ) @@ -109,7 +109,7 @@ def Constraints(numCols,N0,N1): if output: El.Print( E, "D - A X - B Y" ) if worldRank == 0: - print "|| D - A X - B Y ||_F / || D ||_F =", residNorm/DNorm + print('|| D - A X - B Y ||_F / || D ||_F = {}'.format(residNorm/DNorm)) # Now try solving a weighted least squares problem # (as lambda -> infinity, the exact solution converges to that of LSE) @@ -125,7 +125,7 @@ def SolveWeighted(A,B,D,lambd): ctrl.alpha = baseAlpha if worldRank == 0: - print "lambda=", lambd, ": ctrl.alpha=", ctrl.alpha + print('lambda={}: ctrl.alpha={}'.format(lambd,ctrl.alpha)) XEmb=El.LeastSquares(AEmb,D,ctrl) X = XEmb[0:n0*n1,0:numRHS] @@ -134,14 +134,15 @@ def SolveWeighted(A,B,D,lambd): YNorm = El.FrobeniusNorm( Y ) if worldRank == 0: - print "lambda=", lambd, ": || Y ||_F =", YNorm + print('lambda={} : || Y ||_F = {}'.format(lambd,YNorm)) El.Copy( D, E ) El.Multiply( El.NORMAL, -1., A, X, 1., E ) El.Multiply( El.NORMAL, -1., B, Y, 1., E ) residNorm = El.FrobeniusNorm( E ) if worldRank == 0: - print "lambda=", lambd, ": || D - A X - B Y ||_F / || D ||_F =", residNorm/DNorm + print('lambda={}: || D - A X - B Y ||_F / || D ||_F = {}'.format( \ + lambd,residNorm/DNorm)) SolveWeighted(A,B,D,1) SolveWeighted(A,B,D,10) @@ -150,7 +151,4 @@ def SolveWeighted(A,B,D,lambd): SolveWeighted(A,B,D,10000) SolveWeighted(A,B,D,100000) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/JordanCholesky.py b/examples/interface/JordanCholesky.py index ff9db33319..019a7fc0ad 100644 --- a/examples/interface/JordanCholesky.py +++ b/examples/interface/JordanCholesky.py @@ -26,8 +26,4 @@ box.imagWidth = 4 El.DisplayPortrait(portrait,box,"spectral portrait of 2*J_{1/2}(n)") -# Require the user to press a button before the figures are closed -worldSize = El.mpi.WorldSize() El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/LAV.py b/examples/interface/LAV.py index 478e69abfa..88972a2daa 100644 --- a/examples/interface/LAV.py +++ b/examples/interface/LAV.py @@ -73,7 +73,7 @@ def StackedFD2D(N0,N1): x = El.LAV( A, b, ctrl ) endLAV = El.mpi.Time() if worldRank == 0: - print "LAV time:", endLAV-startLAV, "seconds" + print('LAV time: {} seconds'.format(endLAV-startLAV)) if display: El.Display( x, "x" ) @@ -87,16 +87,16 @@ def StackedFD2D(N0,N1): rTwoNorm = El.Nrm2( r ) rOneNorm = El.EntrywiseNorm( r, 1 ) if worldRank == 0: - print "|| b ||_2 =", bTwoNorm - print "|| b ||_oo =", bInfNorm - print "|| A x - b ||_2 =", rTwoNorm - print "|| A x - b ||_1 =", rOneNorm + print('|| b ||_2 = {}'.format(bTwoNorm)) + print('|| b ||_oo = {}'.format(bInfNorm)) + print('|| A x - b ||_2 = {}'.format(rTwoNorm)) + print('|| A x - b ||_1 = {}'.format(rOneNorm)) startLS = El.mpi.Time() xLS = El.LeastSquares(A,b) endLS = El.mpi.Time() if worldRank == 0: - print "LS time:", endLS-startLS, "seconds" + print('LS time: {} seconds'.format(endLS-startLS)) if display: El.Display( xLS, "x_{LS}" ) rLS = El.DistMultiVec() @@ -107,10 +107,7 @@ def StackedFD2D(N0,N1): rLSTwoNorm = El.Nrm2(rLS) rLSOneNorm = El.EntrywiseNorm(rLS,1) if worldRank == 0: - print "|| A x_{LS} - b ||_2 =", rLSTwoNorm - print "|| A x_{LS} - b ||_1 =", rLSOneNorm + print('|| A x_{{LS}} - b ||_2 = {}'.format(rLSTwoNorm)) + print('|| A x_{{LS}} - b ||_1 = {}'.format(rLSOneNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/LAVDense.py b/examples/interface/LAVDense.py index d149e588d8..9afad3c3f3 100644 --- a/examples/interface/LAVDense.py +++ b/examples/interface/LAVDense.py @@ -32,7 +32,7 @@ def Rectang(height,width): x = El.LAV( A, b, ctrl ) endLAV = El.mpi.Time() if worldRank == 0: - print "LAV time:", endLAV-startLAV, "seconds" + print('LAV time: {} seconds'.format(endLAV-startLAV)) if display: El.Display( x, "x" ) @@ -46,16 +46,16 @@ def Rectang(height,width): rTwoNorm = El.Nrm2( r ) rOneNorm = El.EntrywiseNorm( r, 1 ) if worldRank == 0: - print "|| b ||_2 =", bTwoNorm - print "|| b ||_oo =", bInfNorm - print "|| A x - b ||_2 =", rTwoNorm - print "|| A x - b ||_1 =", rOneNorm + print('|| b ||_2 = {}'.format(bTwoNorm)) + print('|| b ||_oo = {}'.format(bInfNorm)) + print('|| A x - b ||_2 = {}'.format(rTwoNorm)) + print('|| A x - b ||_1 = {}'.format(rOneNorm)) startLS = El.mpi.Time() xLS = El.LeastSquares(A,b) endLS = El.mpi.Time() if worldRank == 0: - print "LS time:", endLS-startLS, "seconds" + print('LS time: {} seconds'.format(endLS-startLS)) if display: El.Display( xLS, "x_{LS}" ) rLS = El.DistMatrix() @@ -66,10 +66,7 @@ def Rectang(height,width): rLSTwoNorm = El.Nrm2(rLS) rLSOneNorm = El.EntrywiseNorm(rLS,1) if worldRank == 0: - print "|| A x_{LS} - b ||_2 =", rLSTwoNorm - print "|| A x_{LS} - b ||_1 =", rLSOneNorm + print('|| A x_{{LS}} - b ||_2 = {}'.format(rLSTwoNorm)) + print('|| A x_{{LS}} - b ||_1 = {}'.format(rLSOneNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/LCF.py b/examples/interface/LCF.py index e5505d1e2d..c9ba954e96 100644 --- a/examples/interface/LCF.py +++ b/examples/interface/LCF.py @@ -37,8 +37,4 @@ def LCF(lcf): El.Display( LCF(dodec), "Dodecahedral graph" ) El.Display( LCF(truncOct), "Trunacted octahedral graph" ) -# Require the user to press a button before the figures are closed -worldSize = El.mpi.WorldSize() El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/LLL.py b/examples/interface/LLL.py index c7900b371d..737f603413 100644 --- a/examples/interface/LLL.py +++ b/examples/interface/LLL.py @@ -22,8 +22,8 @@ for deltaLower in 0.5, 0.75, 0.95, 0.98: for variant in El.LLL_WEAK, El.LLL_NORMAL, El.LLL_DEEP, El.LLL_DEEP_REDUCE: - print "variant=%d, presort=%r, smallest1st=%r, deltaLower=%f:" % \ - (variant,presort,smallestFirst,deltaLower) + print('variant={}, presort={}, smallest1st={}, deltaLower={}:'.format( \ + variant,presort,smallestFirst,deltaLower)) El.Copy( BOrig, B ) @@ -37,11 +37,11 @@ mode=El.LLL_FULL U, R, info = El.LLL(B,mode,ctrl) runTime = El.mpi.Time() - startTime - print " runtime: %f seconds" % runTime - print " delta=", info.delta - print " eta =", info.eta - print " nullity: ", info.nullity - print " num swaps: ", info.numSwaps + print(' runtime: {} seconds'.format(runTime)) + print(' delta = {}'.format(info.delta)) + print(' eta = {}'.format(info.eta)) + print(' nullity: {}'.format(info.nullity)) + print(' num swaps: {}'.format(info.numSwaps)) if output: El.Print( U, "U" ); El.Print( B, "BNew" ) @@ -49,7 +49,7 @@ # Test how small the first column is compared to the others b1Norm = El.FrobeniusNorm(B[:,0]) - print " || b_1 ||_2 =", b1Norm + print(' || b_1 ||_2 = {}'.format(b1Norm)) numLower = 0 minInd = 0 minNorm = b1Norm @@ -57,11 +57,13 @@ bjNorm = El.FrobeniusNorm(B[:,j]) if bjNorm < b1Norm: numLower = numLower + 1 - if bjNorm < minNorm: + if bjNorm < minNorm: minNorm = bjNorm minInd = j if numLower == 0: - print " b1 was the smallest column" + print(' b1 was the smallest column') else: - print " %d columns were smaller than b1, with || b_%d ||_2 = %f the smallest" % (numLower,minInd,minNorm) - print "" + print(' {} columns were smaller than b1, with || b_{} ||_2 = {} the smallest'.format(numLower,minInd,minNorm)) + print('') + +El.Finalize() diff --git a/examples/interface/LLLSingular.py b/examples/interface/LLLSingular.py index 2f81eb4a29..2d61f11adb 100644 --- a/examples/interface/LLLSingular.py +++ b/examples/interface/LLLSingular.py @@ -41,8 +41,8 @@ for deltaLower in 0.5, 0.75, 0.95, 0.98: for variant in El.LLL_WEAK, El.LLL_NORMAL, El.LLL_DEEP, El.LLL_DEEP_REDUCE: - print "variant=%d, presort=%r, smallestFirst=%r, deltaLower=%f" %\ - (variant,presort,smallestFirst,deltaLower) + print('variant={}, presort={}, smallestFirst={}, deltaLower={}'.format( \ + variant,presort,smallestFirst,deltaLower)) El.Copy( BOrig, B ) @@ -56,11 +56,11 @@ mode=El.LLL_FULL U, R, info = El.LLL(B,mode,ctrl) runTime = El.mpi.Time() - startTime - print " runtime: %f seconds" % runTime - print " delta=", info.delta - print " eta =", info.eta - print " nullity: ", info.nullity - print " num swaps: ", info.numSwaps + print(' runtime: {} seconds'.format(runTime)) + print(' delta = {}'.format(info.delta)) + print(' eta = {}'.format(info.eta)) + print(' nullity: {}'.format(info.nullity)) + print(' num swaps: {}'.format(info.numSwaps)) if output: El.Print( U, "U" ) El.Print( B, "BNew" ) @@ -68,7 +68,7 @@ # Test how small the first column is compared to the others b1Norm = El.FrobeniusNorm(B[:,0]) - print " || b_1 ||_2 = ",b1Norm + print(' || b_1 ||_2 = {}'.format(b1Norm)) numLower = 0 minInd = 0 minNorm = b1Norm @@ -80,7 +80,9 @@ minNorm = bjNorm minInd = j if numLower == 0: - print " b1 was the smallest column" + print(' b1 was the smallest column') else: - print " %d columns were smaller than b1, with || b_%d ||_2 = %f the smallest" % (numLower,minInd,minNorm) - print "" + print(' {} columns were smaller than b1, with || b_{} ||_2 = {} the smallest'.format(numLower,minInd,minNorm)) + print('') + +El.Finalize() diff --git a/examples/interface/LPAffine.py b/examples/interface/LPAffine.py index f9c77ff1f4..4823e4adb4 100644 --- a/examples/interface/LPAffine.py +++ b/examples/interface/LPAffine.py @@ -111,7 +111,7 @@ def Rectang(height,width): El.LPAffine(A,G,b,c,h,x,y,z,s,ctrl) endMehrotra = El.mpi.Time() if worldRank == 0: - print "Mehrotra time:", endMehrotra-startMehrotra + print('Mehrotra time: {} seconds'.format(endMehrotra-startMehrotra)) if display: El.Display( x, "x Mehrotra" ) @@ -121,7 +121,7 @@ def Rectang(height,width): obj = El.Dot(c,x) if worldRank == 0: - print "Mehrotra c^T x =", obj + print('Mehrotra c^T x = {}'.format(obj)) if testIPF: ctrl.approach = El.LP_IPF @@ -137,7 +137,7 @@ def Rectang(height,width): El.LPAffine(A,G,b,c,h,x,y,z,s,ctrl) endIPF = El.mpi.Time() if worldRank == 0: - print "IPF time:", endIPF-startIPF + print('IPF time: {} seconds'.format(endIPF-startIPF)) if display: El.Display( x, "x IPF" ) @@ -147,9 +147,6 @@ def Rectang(height,width): obj = El.Dot(c,x) if worldRank == 0: - print "IPF c^T x =", obj + print('IPF c^T x = {}'.format(obj)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/LPAffineDense.py b/examples/interface/LPAffineDense.py index 5c7bc634e3..f7342bb4b5 100644 --- a/examples/interface/LPAffineDense.py +++ b/examples/interface/LPAffineDense.py @@ -93,7 +93,7 @@ def RectangDense(height,width): El.LPAffine(A,G,b,c,h,x,y,z,s,ctrl) endMehrotra = El.mpi.Time() if worldRank == 0: - print "Mehrotra time:", endMehrotra-startMehrotra + print('Mehrotra time: {} seconds'.format(endMehrotra-startMehrotra)) if display: El.Display( x, "x Mehrotra" ) @@ -103,7 +103,7 @@ def RectangDense(height,width): obj = El.Dot(c,x) if worldRank == 0: - print "Mehrotra c^T x =", obj + print('Mehrotra c^T x = {}'.format(obj)) if testIPF: ctrl.approach = El.LP_IPF @@ -119,7 +119,7 @@ def RectangDense(height,width): El.LPAffine(A,G,b,c,h,x,y,z,s,ctrl) endIPF = El.mpi.Time() if worldRank == 0: - print "IPF time:", endIPF-startIPF + print('IPF time: {} seconds'.format(endIPF-startIPF)) if display: El.Display( x, "x IPF" ) @@ -129,9 +129,6 @@ def RectangDense(height,width): obj = El.Dot(c,x) if worldRank == 0: - print "IPF c^T x =", obj + print('IPF c^T x = {}'.format(obj)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/LPDirect.py b/examples/interface/LPDirect.py index 749499f54c..007a5ed89d 100644 --- a/examples/interface/LPDirect.py +++ b/examples/interface/LPDirect.py @@ -91,7 +91,7 @@ def Rectang(height,width): El.LPDirect(A,b,c,x,y,z,ctrl) endMehrotra = El.mpi.Time() if worldRank == 0: - print "Mehrotra time:", endMehrotra-startMehrotra + print('Mehrotra time: {} seconds'.format(endMehrotra-startMehrotra)) if display: El.Display( x, "x Mehrotra" ) @@ -100,7 +100,7 @@ def Rectang(height,width): obj = El.Dot(c,x) if worldRank == 0: - print "Mehrotra c^T x =", obj + print('Mehrotra c^T x = {}'.format(obj)) if testIPF: ctrl.approach = El.LP_IPF @@ -115,7 +115,7 @@ def Rectang(height,width): El.LPDirect(A,b,c,x,y,z,ctrl) endIPF = El.mpi.Time() if worldRank == 0: - print "IPF time:", endIPF-startIPF + print('IPF time: {} seconds'.format(endIPF-startIPF)) if display: El.Display( x, "x IPF" ) @@ -124,9 +124,6 @@ def Rectang(height,width): obj = El.Dot(c,x) if worldRank == 0: - print "IPF c^T x =", obj + print('IPF c^T x = {}'.format(obj)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/LPDirectDense.py b/examples/interface/LPDirectDense.py index f78ee64a49..1900a9112a 100644 --- a/examples/interface/LPDirectDense.py +++ b/examples/interface/LPDirectDense.py @@ -74,7 +74,7 @@ def RectangDense(height,width): El.LPDirect(A,b,c,x,y,z,ctrl) endMehrotra = El.mpi.Time() if worldRank == 0: - print "Mehrotra time:", endMehrotra-startMehrotra + print('Mehrotra time: {} seconds'.format(endMehrotra-startMehrotra)) if display: El.Display( x, "x Mehrotra" ) @@ -83,7 +83,7 @@ def RectangDense(height,width): obj = El.Dot(c,x) if worldRank == 0: - print "Mehrotra c^T x =", obj + print('Mehrotra c^T x = {}'.format(obj)) if testIPF: ctrl.approach = El.LP_IPF @@ -98,7 +98,7 @@ def RectangDense(height,width): El.LPDirect(A,b,c,x,y,z,ctrl) endIPF = El.mpi.Time() if worldRank == 0: - print "IPF time:", endIPF-startIPF + print('IPF time: {} seconds'.format(endIPF-startIPF)) if display: El.Display( x, "x IPF" ) @@ -107,7 +107,7 @@ def RectangDense(height,width): obj = El.Dot(c,x) if worldRank == 0: - print "IPF c^T x =", obj + print('IPF c^T x = {}'.format(obj)) if testADMM: ctrl.approach = El.LP_ADMM @@ -116,16 +116,13 @@ def RectangDense(height,width): x = El.LPDirect(A,b,c,x,y,z,ctrl) endADMM = El.mpi.Time() if worldRank == 0: - print "ADMM time:", endADMM-startADMM + print('ADMM time: {} seconds'.format(endADMM-startADMM)) if display: El.Display( x, "x ADMM" ) obj = El.Dot(c,x) if worldRank == 0: - print "ADMM c^T x =", obj + print('ADMM c^T x = {}'.format(obj)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/LSE.py b/examples/interface/LSE.py index 6d0aef94b4..a0972aeda3 100644 --- a/examples/interface/LSE.py +++ b/examples/interface/LSE.py @@ -92,7 +92,7 @@ def Constraints(numRows,N0,N1): X = El.LSE(A,B,C,D,ctrl) endLSE = El.mpi.Time() if worldRank == 0: - print "LSE time:", endLSE-startLSE, "seconds" + print('LSE time: {} seconds'.format(endLSE-startLSE)) if display: El.Display( X, "X" ) if output: @@ -108,7 +108,7 @@ def Constraints(numRows,N0,N1): if output: El.Print( E, "C - A X" ) if worldRank == 0: - print "|| C - A X ||_F / || C ||_F =", residNorm/CNorm + print('|| C - A X ||_F / || C ||_F = {}'.format(residNorm/CNorm)) El.Copy( D, E ) El.Multiply( El.NORMAL, -1., B, X, 1., E ) @@ -118,7 +118,7 @@ def Constraints(numRows,N0,N1): if output: El.Print( E, "D - B X" ) if worldRank == 0: - print "|| D - B X ||_F / || D ||_F =", equalNorm/DNorm + print('|| D - B X ||_F / || D ||_F = {}'.format(equalNorm/DNorm)) # Now try solving a weighted least squares problem # (as lambda -> infinity, the exact solution converges to that of LSE) @@ -138,7 +138,7 @@ def SolveWeighted(A,B,C,D,lambd): ctrl.alpha = baseAlpha if worldRank == 0: - print "lambda=", lambd, ": ctrl.alpha=", ctrl.alpha + print('lambda={}, ctrl.alpha={}'.format(lambd,ctrl.alpha)) X=El.LeastSquares(AEmb,CEmb,ctrl) El.Copy( C, E ) @@ -149,7 +149,8 @@ def SolveWeighted(A,B,C,D,lambd): if output: El.Print( E, "C - A X" ) if worldRank == 0: - print "lambda=", lambd, ": || C - A X ||_F / || C ||_F =", residNorm/CNorm + print('lambda={}: || C - A X ||_F / || C ||_F = {}'.format(lambd, \ + residNorm/CNorm)) El.Copy( D, E ) El.Multiply( El.NORMAL, -1., B, X, 1., E ) @@ -159,7 +160,8 @@ def SolveWeighted(A,B,C,D,lambd): if output: El.Print( E, "D - B X" ) if worldRank == 0: - print "lambda=", lambd, ": || D - B X ||_F / || D ||_F =", equalNorm/DNorm + print('lambda={}: || D - B X ||_F / || D ||_F = {}'.format(lambd, \ + equalNorm/DNorm)) SolveWeighted(A,B,C,D,1) SolveWeighted(A,B,C,D,10) @@ -168,7 +170,4 @@ def SolveWeighted(A,B,C,D,lambd): SolveWeighted(A,B,C,D,10000) SolveWeighted(A,B,C,D,100000) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/LatticeImageAndKernel.py b/examples/interface/LatticeImageAndKernel.py index 80b383db5a..b29400b4a6 100644 --- a/examples/interface/LatticeImageAndKernel.py +++ b/examples/interface/LatticeImageAndKernel.py @@ -41,8 +41,8 @@ for deltaLower in 0.5, 0.75, 0.95, 0.98: for variant in El.LLL_NORMAL, El.LLL_DEEP, El.LLL_DEEP_REDUCE: - print "variant=%d, presort=%r, smallest1st=%r, deltaLower=%f" % \ - (variant,presort,smallestFirst,deltaLower) + print('variant={}, presort={}, smallest1st={}, deltaLower={}'.format( \ + variant,presort,smallestFirst,deltaLower)) El.Copy( BOrig, B ) @@ -55,8 +55,10 @@ startTime = El.mpi.Time() M, K = El.LatticeImageAndKernel(B,ctrl) runTime = El.mpi.Time() - startTime - print " runtime: %f seconds" % runTime - print " nullity: ", K.Width() + print(' runtime: {} seconds'.format(runTime)) + print(' nullity: {}'.format(K.Width())) if output: El.Print( M, "Image" ) El.Print( K, "Kernel" ) + +El.Finalize() diff --git a/examples/interface/LeastSquares.py b/examples/interface/LeastSquares.py index eb447c13af..2fbf001fdd 100644 --- a/examples/interface/LeastSquares.py +++ b/examples/interface/LeastSquares.py @@ -74,7 +74,7 @@ def StackedFD2D(N0,N1): El.Print( y, "y" ) yNrm = El.Nrm2(y) if worldRank == 0: - print "|| y ||_2 =", yNrm + print('|| y ||_2 = {}'.format(yNrm)) ctrl = El.LeastSquaresCtrl_d() ctrl.progress = True @@ -83,14 +83,14 @@ def StackedFD2D(N0,N1): x = El.LeastSquares(A,y,ctrl) endLS = El.mpi.Time() if worldRank == 0: - print "LS time:", endLS-startLS, "seconds" + print('LS time: {} seconds'.format(endLS-startLS)) xNrm = El.Nrm2(x) if display: El.Display( x, "x" ) if output: El.Print( x, "x" ) if worldRank == 0: - print "|| x ||_2 =", xNrm + print('|| x ||_2 = {}'.format(xNrm)) El.Multiply(El.NORMAL,-1.,A,x,1.,y) if display: El.Display( y, "A x - y" ) @@ -98,10 +98,6 @@ def StackedFD2D(N0,N1): El.Print( y, "A x - y" ) eNrm = El.Nrm2(y) if worldRank == 0: - print "|| A x - y ||_2 / || y ||_2 =", eNrm/yNrm - -# Require the user to press a button before the figures are closed + print('|| A x - y ||_2 / || y ||_2 = {}'.format(eNrm/yNrm)) El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/LinearSolve.py b/examples/interface/LinearSolve.py index 1f1aa91a13..7f4c1d9f63 100644 --- a/examples/interface/LinearSolve.py +++ b/examples/interface/LinearSolve.py @@ -57,7 +57,7 @@ def FD2D(N0,N1): yNrm = El.Nrm2(y) if worldRank == 0: - print "|| y ||_2 =", yNrm + print('|| y ||_2 = {}'.format(yNrm)) ctrl = El.LeastSquaresCtrl_d() ctrl.scaleTwoNorm = True @@ -74,14 +74,14 @@ def FD2D(N0,N1): El.LinearSolve(A,x,ctrl) solveStop = El.mpi.Time() if worldRank == 0: - print "LinearSolve time:", solveStop-solveStart, "seconds" + print('LinearSolve time: {} seconds'.format(solveStop-solveStart)) if display: El.Display( x, "x" ) if output: El.Print( x, "x" ) xNrm = El.Nrm2(x) if worldRank == 0: - print "|| x ||_2 =", xNrm + print('|| x ||_2 = {}'.format(xNrm)) El.Multiply(El.NORMAL,-1.,A,x,1.,y) if display: @@ -90,10 +90,7 @@ def FD2D(N0,N1): El.Print( y, "A x - y" ) eNrm = El.Nrm2(y) if worldRank == 0: - print "|| y ||_2 =", yNrm - print "|| A x - y ||_2 / || y ||_2 =", eNrm/yNrm + print('|| y ||_2 = {}'.format(yNrm)) + print('|| A x - y ||_2 / || y ||_2 = {}'.format(eNrm/yNrm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/LongOnlyPortfolio.py b/examples/interface/LongOnlyPortfolio.py index fd55730c2b..152f9c3359 100644 --- a/examples/interface/LongOnlyPortfolio.py +++ b/examples/interface/LongOnlyPortfolio.py @@ -79,7 +79,7 @@ def CreateExpected(height): x = El.LongOnlyPortfolio(d,F,c,gamma,ctrl) endLOP = El.mpi.Time() if worldRank == 0: - print "LOP time (resolve reg. w/ equil):", endLOP-startLOP, "seconds" + print('LOP time (resolve reg. w/ equil): {} seconds'.format(endLOP-startLOP)) if display: El.Display( x, "x" ) @@ -89,7 +89,8 @@ def CreateExpected(height): x = El.LongOnlyPortfolio(d,F,c,gamma,ctrl) endLOP = El.mpi.Time() if worldRank == 0: - print "LOP time (no resolve reg. w/ equil):", endLOP-startLOP, "seconds" + print('LOP time (no resolve reg. w/ equil): {} seconds'.format( \ + endLOP-startLOP)) if display: El.Display( x, "x" ) @@ -104,15 +105,12 @@ def CreateExpected(height): El.Multiply( El.NORMAL, 1., F, f, 1., e ) rar = El.Dot(c,x) - gamma*El.Dot(x,e) if worldRank == 0: - print "c^T x - gamma x^T (D + F F^T) x = ", rar + print('c^T x - gamma x^T (D + F F^T) x = {}'.format(rar)) xOneNorm = El.EntrywiseNorm( x, 1 ) xTwoNorm = El.Nrm2( x ) if worldRank == 0: - print "|| x ||_1 =", xOneNorm - print "|| x ||_2 =", xTwoNorm + print('|| x ||_1 = {}'.format(xOneNorm)) + print('|| x ||_2 = {}'.format(xTwoNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/Multiply.py b/examples/interface/Multiply.py index 4d02796f95..234bd5ba64 100644 --- a/examples/interface/Multiply.py +++ b/examples/interface/Multiply.py @@ -82,10 +82,7 @@ def StackedFD2D(N0,N1): El.Multiply( El.NORMAL, -1., AAdj, y, 1., z ) eNrm2 = El.FrobeniusNorm( z ) if worldRank == 0: - print "|| A^H y ||_2 =", zNrm2 - print "|| error ||_2 =", eNrm2 + print('|| A^H y ||_2 = {}'.format(zNrm2)) + print('|| error ||_2 = {}'.format(eNrm2)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/NNLS.py b/examples/interface/NNLS.py index 19a112b251..9996b15176 100644 --- a/examples/interface/NNLS.py +++ b/examples/interface/NNLS.py @@ -51,7 +51,7 @@ def Rectang(height,width): x = El.NNLS( A, b, ctrl ) endNNLS = El.mpi.Time() if worldRank == 0: - print "NNLS time (resolve reg.):", endNNLS-startNNLS, "seconds" + print('NNLS time (resolve reg.): {} seconds'.format(endNNLS-startNNLS)) if display: El.Display( x, "x" ) @@ -61,7 +61,7 @@ def Rectang(height,width): x = El.NNLS( A, b, ctrl ) endNNLS = El.mpi.Time() if worldRank == 0: - print "NNLS time (no resolve reg.):", endNNLS-startNNLS, "seconds" + print('NNLS time (no resolve reg.): {} seconds'.format(endNNLS-startNNLS)) if display: El.Display( x, "x" ) @@ -70,22 +70,19 @@ def Rectang(height,width): El.Multiply( El.NORMAL, -1., A, x, 1., e ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| A x - b ||_2 =", eTwoNorm + print('|| A x - b ||_2 = {}'.format(eTwoNorm)) startLS = El.mpi.Time() xLS = El.LeastSquares( A, b ) endLS = El.mpi.Time() if worldRank == 0: - print "LS time:", endLS-startLS, "seconds" + print('LS time: {} seconds'.format(endLS-startLS)) if display: El.Display( xLS, "xLS" ) El.Copy( b, e ) El.Multiply( El.NORMAL, -1., A, xLS, 1., e ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| A x_{LS} - b ||_2 =", eTwoNorm + print('|| A x_{{LS}} - b ||_2 = {}'.format(eTwoNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/NNLSDense.py b/examples/interface/NNLSDense.py index b2ced11001..c0458d02e0 100644 --- a/examples/interface/NNLSDense.py +++ b/examples/interface/NNLSDense.py @@ -30,7 +30,7 @@ def Rectang(height,width): x = El.NNLS( A, b ) endNNLS = El.mpi.Time() if worldRank == 0: - print "NNLS time:", endNNLS-startNNLS, "seconds" + print('NNLS time: {} seconds'.format(endNNLS-startNNLS)) if display: El.Display( x, "x" ) @@ -41,22 +41,19 @@ def Rectang(height,width): El.Display( e, "e" ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| A x - b ||_2 =", eTwoNorm + print('|| A x - b ||_2 = {}'.format(eTwoNorm)) startLS = El.mpi.Time() xLS = El.LeastSquares( A, b ) endLS = El.mpi.Time() if worldRank == 0: - print "LS time:", endLS-startLS, "seconds" + print('LS time: {} seconds'.format(endLS-startLS)) El.Copy( b, e ) El.Gemv( El.NORMAL, -1., A, xLS, 1., e ) if display: El.Display( e, "e" ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| A x_{LS} - b ||_2 =", eTwoNorm + print('|| A x_{{LS}} - b ||_2 = {}'.format(eTwoNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/ProductLanczos.py b/examples/interface/ProductLanczos.py index f4d16a6d70..0ff7ff03ec 100644 --- a/examples/interface/ProductLanczos.py +++ b/examples/interface/ProductLanczos.py @@ -83,9 +83,6 @@ def StackedFD2D(N0,N1): El.Print( T, "T" ) El.Print( v, "v" ) if worldRank == 0: - print "beta=", beta + print('beta = {}'.format(beta)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/QPAffine.py b/examples/interface/QPAffine.py index db87f65a50..b1c335ba58 100644 --- a/examples/interface/QPAffine.py +++ b/examples/interface/QPAffine.py @@ -129,7 +129,7 @@ def Rectang(height,width): El.QPAffine(Q,A,G,b,c,h,x,y,z,s,ctrl) endMehrotra = El.mpi.Time() if worldRank == 0: - print "Mehrotra time:", endMehrotra-startMehrotra + print('Mehrotra time: {} seconds'.format(endMehrotra-startMehrotra)) if display: El.Display( x, "x Mehrotra" ) @@ -142,7 +142,7 @@ def Rectang(height,width): El.Multiply( El.NORMAL, 1., Q, x, 0., d ) obj = El.Dot(x,d)/2 + El.Dot(c,x) if worldRank == 0: - print "Mehrotra (1/2) x^T Q x + c^T x =", obj + print('Mehrotra (1/2) x^T Q x + c^T x = {}'.format(obj)) if testIPF: ctrl.approach = El.QP_IPF @@ -158,7 +158,7 @@ def Rectang(height,width): El.QPAffine(Q,A,G,b,c,h,x,y,z,s,ctrl) endIPF = El.mpi.Time() if worldRank == 0: - print "IPF time:", endIPF-startIPF + print('IPF time: {}'.format(endIPF-startIPF)) if display: El.Display( x, "x IPF" ) @@ -171,9 +171,6 @@ def Rectang(height,width): El.Multiply( El.NORMAL, 1., Q, x, 0., d ) obj = El.Dot(x,d)/2 + El.Dot(c,x) if worldRank == 0: - print "IPF (1/2) x^T Q x + c^T x =", obj + print('IPF (1/2) x^T Q x + c^T x = {}'.format(obj)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/QPAffineDense.py b/examples/interface/QPAffineDense.py index b60adec62d..32badc56cb 100644 --- a/examples/interface/QPAffineDense.py +++ b/examples/interface/QPAffineDense.py @@ -103,7 +103,7 @@ def RectangDense(height,width): El.QPAffine(Q,A,G,b,c,h,x,y,z,s,ctrl) endMehrotra = El.mpi.Time() if worldRank == 0: - print "Mehrotra time:", endMehrotra-startMehrotra + print('Mehrotra time: {} seconds'.format(endMehrotra-startMehrotra)) if display: El.Display( x, "x Mehrotra" ) @@ -116,7 +116,7 @@ def RectangDense(height,width): El.Hemv( El.LOWER, 1., Q, x, 0., d ) obj = El.Dot(x,d)/2 + El.Dot(c,x) if worldRank == 0: - print "Mehrotra (1/2) x^T Q x + c^T x =", obj + print('Mehrotra (1/2) x^T Q x + c^T x = {}'.format(obj)) if testIPF: ctrl.approach = El.QP_IPF @@ -132,7 +132,7 @@ def RectangDense(height,width): El.QPAffine(Q,A,G,b,c,h,x,y,z,s,ctrl) endIPF = El.mpi.Time() if worldRank == 0: - print "IPF time:", endIPF-startIPF + print('IPF time: {} seconds'.format(endIPF-startIPF)) if display: El.Display( x, "x IPF" ) @@ -145,9 +145,6 @@ def RectangDense(height,width): El.Hemv( El.LOWER, 1., Q, x, 0., d ) obj = El.Dot(x,d)/2 + El.Dot(c,x) if worldRank == 0: - print "IPF c^T x =", obj + print('IPF c^T x = {}'.format(obj)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/QPDirect.py b/examples/interface/QPDirect.py index ba06ad62f3..b7a9f1ab32 100644 --- a/examples/interface/QPDirect.py +++ b/examples/interface/QPDirect.py @@ -109,7 +109,7 @@ def Rectang(height,width): El.QPDirect(Q,A,b,c,x,y,z,ctrl) endMehrotra = El.mpi.Time() if worldRank == 0: - print "Mehrotra time:", endMehrotra-startMehrotra + print('Mehrotra time: {} seconds'.format(endMehrotra-startMehrotra)) if display: El.Display( x, "x Mehrotra" ) @@ -121,7 +121,7 @@ def Rectang(height,width): El.Multiply( El.NORMAL, 1., Q, x, 0., d ) obj = El.Dot(x,d)/2 + El.Dot(c,x) if worldRank == 0: - print "Mehrotra (1/2) x^T Q x + c^T x =", obj + print('Mehrotra (1/2) x^T Q x + c^T x = {}'.format(obj)) if testIPF: ctrl.approach = El.QP_IPF @@ -136,7 +136,7 @@ def Rectang(height,width): El.QPDirect(Q,A,b,c,x,y,z,ctrl) endIPF = El.mpi.Time() if worldRank == 0: - print "IPF time:", endIPF-startIPF + print('IPF time: {} seconds'.format(endIPF-startIPF)) if display: El.Display( x, "x IPF" ) @@ -148,9 +148,6 @@ def Rectang(height,width): El.Multiply( El.NORMAL, 1., Q, x, 0., d ) obj = El.Dot(x,d)/2 + El.Dot(c,x) if worldRank == 0: - print "IPF (1/2) x^T Q x + c^T x =", obj + print('IPF (1/2) x^T Q x + c^T x = {}'.format(obj)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/QPDirectDense.py b/examples/interface/QPDirectDense.py index da7d2e4793..9e08c483a6 100644 --- a/examples/interface/QPDirectDense.py +++ b/examples/interface/QPDirectDense.py @@ -83,7 +83,7 @@ def RectangDense(height,width): El.QPDirect(Q,A,b,c,x,y,z,ctrl) endMehrotra = El.mpi.Time() if worldRank == 0: - print "Mehrotra time:", endMehrotra-startMehrotra + print('Mehrotra time: {} seconds'.format(endMehrotra-startMehrotra)) if display: El.Display( x, "x Mehrotra" ) @@ -95,7 +95,7 @@ def RectangDense(height,width): El.Hemv( El.LOWER, 1., Q, x, 0., d ) obj = El.Dot(x,d)/2 + El.Dot(c,x) if worldRank == 0: - print "Mehrotra (1/2) x^T Q x + c^T x =", obj + print('Mehrotra (1/2) x^T Q x + c^T x = {}'.format(obj)) if testIPF: ctrl.approach = El.QP_IPF @@ -110,7 +110,7 @@ def RectangDense(height,width): El.QPDirect(Q,A,b,c,x,y,z,ctrl) endIPF = El.mpi.Time() if worldRank == 0: - print "IPF time:", endIPF-startIPF + print('IPF time: {} seconds'.format(endIPF-startIPF)) if display: El.Display( x, "x IPF" ) @@ -122,9 +122,6 @@ def RectangDense(height,width): El.Hemv( El.LOWER, 1., Q, x, 0., d ) obj = El.Dot(x,d)/2 + El.Dot(c,x) if worldRank == 0: - print "IPF c^T x =", obj + print('IPF c^T x = {}'.format(obj)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/RLS.py b/examples/interface/RLS.py index bfd4fcbe11..afac448eb0 100644 --- a/examples/interface/RLS.py +++ b/examples/interface/RLS.py @@ -52,7 +52,7 @@ def Rectang(height,width): x = El.RLS( A, b, rho, ctrl ) endRLS = El.mpi.Time() if worldRank == 0: - print "RLS time (resolve reg.):", endRLS-startRLS, "seconds" + print('RLS time (resolve reg.): {} seconds'.format(endRLS-startRLS)) if display: El.Display( x, "x" ) @@ -62,7 +62,7 @@ def Rectang(height,width): x = El.RLS( A, b, rho, ctrl ) endRLS = El.mpi.Time() if worldRank == 0: - print "RLS time (no resolve reg.):", endRLS-startRLS, "seconds" + print('RLS time (no resolve reg.): {} seconds'.format(endRLS-startRLS)) if display: El.Display( x, "x" ) @@ -71,22 +71,19 @@ def Rectang(height,width): El.Multiply( El.NORMAL, -1., A, x, 1., e ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| A x - b ||_2 =", eTwoNorm + print('|| A x - b ||_2 = {}'.format(eTwoNorm)) startLS = El.mpi.Time() xLS = El.LeastSquares( A, b ) endLS = El.mpi.Time() if worldRank == 0: - print "LS time:", endLS-startLS, "seconds" + print('LS time: {} seconds'.format(endLS-startLS)) if display: El.Display( xLS, "xLS" ) El.Copy( b, e ) El.Multiply( El.NORMAL, -1., A, xLS, 1., e ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| A x_{LS} - b ||_2 =", eTwoNorm + print('|| A x_{{LS}} - b ||_2 = {}'.format(eTwoNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/RNNLS.py b/examples/interface/RNNLS.py index 45253b9394..4e7fab3b1e 100644 --- a/examples/interface/RNNLS.py +++ b/examples/interface/RNNLS.py @@ -52,7 +52,7 @@ def Rectang(height,width): x = El.RNNLS( A, b, rho, ctrl ) endRNNLS = El.mpi.Time() if worldRank == 0: - print "RNNLS time (resolve reg.):", endRNNLS-startRNNLS, "seconds" + print('RNNLS time (resolve reg.): {} seconds'.format(endRNNLS-startRNNLS)) if display: El.Display( x, "x" ) @@ -61,7 +61,7 @@ def Rectang(height,width): x = El.RNNLS( A, b, rho, ctrl ) endRNNLS = El.mpi.Time() if worldRank == 0: - print "RNNLS time (no resolve reg.):", endRNNLS-startRNNLS, "seconds" + print('RNNLS time (no resolve reg.): {} seconds'.format(endRNNLS-startRNNLS)) if display: El.Display( x, "x" ) @@ -70,35 +70,32 @@ def Rectang(height,width): El.Multiply( El.NORMAL, -1., A, x, 1., e ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| A x - b ||_2 =", eTwoNorm + print('|| A x - b ||_2 = {}'.format(eTwoNorm)) startNNLS = El.mpi.Time() xNNLS = El.NNLS( A, b ) endNNLS = El.mpi.Time() if worldRank == 0: - print "NNLS time:", endNNLS-startNNLS, "seconds" + print('NNLS time: {} seconds'.format(endNNLS-startNNLS)) if display: El.Display( xNNLS, "xNNLS" ) El.Copy( b, e ) El.Multiply( El.NORMAL, -1., A, xNNLS, 1., e ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| A x_{NNLS} - b ||_2 =", eTwoNorm + print('|| A x_{{NNLS}} - b ||_2 = {}'.format(eTwoNorm)) startLS = El.mpi.Time() xLS = El.LeastSquares( A, b ) endLS = El.mpi.Time() if worldRank == 0: - print "LS time:", endLS-startLS, "seconds" + print('LS time: {} seconds'.format(endLS-startLS)) if display: El.Display( xLS, "xLS" ) El.Copy( b, e ) El.Multiply( El.NORMAL, -1., A, xLS, 1., e ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| A x_{LS} - b ||_2 =", eTwoNorm + print('|| A x_{{LS}} - b ||_2 = {}'.format(eTwoNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/RemoteDistSparse.py b/examples/interface/RemoteDistSparse.py index 7ad1874a00..cdd77f7ef7 100644 --- a/examples/interface/RemoteDistSparse.py +++ b/examples/interface/RemoteDistSparse.py @@ -60,7 +60,4 @@ def RemoteStackedFD2D(N0,N1): if output: El.Print( A, "A" ) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/RemoteUpdate.py b/examples/interface/RemoteUpdate.py index a6f8ed7a9d..68f6b83440 100644 --- a/examples/interface/RemoteUpdate.py +++ b/examples/interface/RemoteUpdate.py @@ -79,7 +79,7 @@ def StackedFD2D(N0,N1): x = El.CP( A, b, ctrl ) endCP = El.mpi.Time() if worldRank == 0: - print "CP time:", endCP-startCP, "seconds" + print('CP time: {} seconds'.format(endCP-startCP)) if display: El.Display( x, "x" ) @@ -93,16 +93,16 @@ def StackedFD2D(N0,N1): rTwoNorm = El.Nrm2( r ) rInfNorm = El.MaxNorm( r ) if worldRank == 0: - print "|| b ||_2 =", bTwoNorm - print "|| b ||_oo =", bInfNorm - print "|| A x - b ||_2 =", rTwoNorm - print "|| A x - b ||_oo =", rInfNorm + print('|| b ||_2 = {}'.format(bTwoNorm)) + print('|| b ||_oo = {}'.format(bInfNorm)) + print('|| A x - b ||_2 = {}'.format(rTwoNorm)) + print('|| A x - b ||_oo = {}'.format(rInfNorm)) startLS = El.mpi.Time() xLS = El.LeastSquares(A,b) endLS = El.mpi.Time() if worldRank == 0: - print "LS time:", endLS-startLS, "seconds" + print('LS time: {} seconds'.format(endLS-startLS)) if display: El.Display( xLS, "x_{LS}" ) rLS = El.DistMatrix() @@ -113,10 +113,7 @@ def StackedFD2D(N0,N1): rLSTwoNorm = El.Nrm2(rLS) rLSInfNorm = El.MaxNorm(rLS) if worldRank == 0: - print "|| A x_{LS} - b ||_2 =", rLSTwoNorm - print "|| A x_{LS} - b ||_oo =", rLSInfNorm + print('|| A x_{{LS}} - b ||_2 = {}'.format(rLSTwoNorm)) + print('|| A x_{{LS}} - b ||_oo = {}'.format(rLSInfNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/SOC.py b/examples/interface/SOC.py index b408ad5b12..4aa08a16eb 100644 --- a/examples/interface/SOC.py +++ b/examples/interface/SOC.py @@ -58,8 +58,8 @@ def ConstructPrimalDual(m): zDetsBcast = El.DistMultiVec() El.Copy( sDets, sDetsBcast ) El.Copy( zDets, zDetsBcast ) -El.SOCBroadcast( sDetsBcast, orders, firstInds, cutoff ) -El.SOCBroadcast( zDetsBcast, orders, firstInds, cutoff ) +El.ConeBroadcast( sDetsBcast, orders, firstInds, cutoff ) +El.ConeBroadcast( zDetsBcast, orders, firstInds, cutoff ) sNumNonPos = El.NumNonSOC( s, orders, firstInds, cutoff ) zNumNonPos = El.NumNonSOC( z, orders, firstInds, cutoff ) if output: @@ -68,8 +68,8 @@ def ConstructPrimalDual(m): El.Print( sDetsBcast, "Broadcasted det(s)" ) El.Print( zDetsBcast, "Broadcasted det(z)" ) if worldRank == 0: - print "# non-SOC in s:", sNumNonPos - print "# non-SOC in z:", zNumNonPos + print('# non-SOC in s: {}'.format(sNumNonPos)) + print('# non-SOC in z: {}'.format(zNumNonPos)) # Compute the square-roots of s and z # =================================== @@ -124,11 +124,8 @@ def ConstructPrimalDual(m): if output: El.Print( y, "y" ) if worldRank == 0: - print "maximum step in cone is:", alpha + print('maximum step in cone is: {}'.format(alpha)) El.Print( p, "s + alpha y" ) El.Print( pDets, "det(s + alpha y)" ) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/SOCP_trivial.py b/examples/interface/SOCP_trivial.py index c859cc79f8..b060992b96 100644 --- a/examples/interface/SOCP_trivial.py +++ b/examples/interface/SOCP_trivial.py @@ -39,4 +39,5 @@ ctrl.mehrotraCtrl.outerEquil = True ctrl.mehrotraCtrl.time = True El.SOCPAffine(A,G,b,c,h,orders,firstInd,x,y,z,s,ctrl) + El.Finalize() diff --git a/examples/interface/SVM.py b/examples/interface/SVM.py index 0f51acd146..d7a4a7a28d 100644 --- a/examples/interface/SVM.py +++ b/examples/interface/SVM.py @@ -83,7 +83,7 @@ def StackedFD2D(N0,N1): if display: El.Display( wGen, "wGen" ) if worldRank == 0: - print "offset =", offset + print('offset = {}'.format(offset)) El.Display( A, "A" ) El.Display( d, "d" ) @@ -93,19 +93,16 @@ def StackedFD2D(N0,N1): for j in xrange(0,numLambdas): lambd = startLambda + j*(endLambda-startLambda)/(numLambdas-1.) if worldRank == 0: - print "lambda =", lambd + print('lambda = {}'.format(lambd)) # TODO: Explicitly return w, beta, and z startSVM = El.mpi.Time() x = El.SVM( A, d, lambd, ctrl ) endSVM = El.mpi.Time() if worldRank == 0: - print "SVM time: ", endSVM-startSVM + print('SVM time: {}'.format(endSVM-startSVM)) if display: El.Display( x, "[w;beta;z]" ) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/SVMDense.py b/examples/interface/SVMDense.py index 6b7eb84bb1..613bb31d9a 100644 --- a/examples/interface/SVMDense.py +++ b/examples/interface/SVMDense.py @@ -64,7 +64,7 @@ def RectangSparse(height,width): if display: El.Display( wGen, "wGen" ) if worldRank == 0: - print "offset =", offset + print('offset = {}'.format(offset)) El.Display( A, "A" ) El.Display( d, "d" ) @@ -74,13 +74,13 @@ def RectangSparse(height,width): for j in xrange(0,numLambdas): lambd = startLambda + j*(endLambda-startLambda)/(numLambdas-1.) if worldRank == 0: - print "lambda =", lambd + print('lambda = {}'.format(lambd)) startSVM = El.mpi.Time() x = El.SVM( A, d, lambd, ctrl ) endSVM = El.mpi.Time() if worldRank == 0: - print "SVM time: ", endSVM-startSVM + print('SVM time: {}'.format(endSVM-startSVM)) w = x[0:n,0] beta = x.Get(n,0) @@ -88,7 +88,7 @@ def RectangSparse(height,width): if display: El.Display( w, "w" ) if worldRank==0: - print "beta=", beta + print('beta = {}'.format(beta)) El.Display( z, "z" ) e = El.DistMatrix() @@ -100,9 +100,6 @@ def RectangSparse(height,width): El.Display( e, "diag(d)*(A w + beta)" ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| A w + beta - d ||_2 =", eTwoNorm + print('|| A w + beta - d ||_2 = {}'.format(eTwoNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/SequentialLSE.py b/examples/interface/SequentialLSE.py index c85b7a1e21..261dfc0772 100644 --- a/examples/interface/SequentialLSE.py +++ b/examples/interface/SequentialLSE.py @@ -76,7 +76,7 @@ def Constraints(numRows,N0,N1): startLSE = El.mpi.Time() X = El.LSE(A,B,C,D,ctrl) endLSE = El.mpi.Time() -print "LSE time:", endLSE-startLSE, "seconds" +print('LSE time: {} seconds'.format(endLSE-startLSE)) if display: El.Display( X, "X" ) @@ -87,14 +87,14 @@ def Constraints(numRows,N0,N1): residNorm = El.FrobeniusNorm( E ) if display: El.Display( E, "C - A X" ) -print "|| C - A X ||_F / || C ||_F =", residNorm/CNorm +print('|| C - A X ||_F / || C ||_F = {}'.format(residNorm/CNorm)) El.Copy( D, E ) El.Multiply( El.NORMAL, -1., B, X, 1., E ) equalNorm = El.FrobeniusNorm( E ) if display: El.Display( E, "D - B X" ) -print "|| D - B X ||_F / || D ||_F =", equalNorm/DNorm +print('|| D - B X ||_F / || D ||_F = '.format(equalNorm/DNorm)) # Now try solving a weighted least squares problem # (as lambda -> infinity, the exact solution converges to that of LSE) @@ -117,14 +117,16 @@ def SolveWeighted(A,B,C,D,lambd): residNorm = El.FrobeniusNorm( E ) if display: El.Display( E, "C - A X" ) - print "lambda=", lambd, ": || C - A X ||_F / || C ||_F =", residNorm/CNorm + print('lambda={}: || C - A X ||_F / || C ||_F = {}'.format(lambd, + residNorm/CNorm)) El.Copy( D, E ) El.Multiply( El.NORMAL, -1., B, X, 1., E ) equalNorm = El.FrobeniusNorm( E ) if display: El.Display( E, "D - B X" ) - print "lambda=", lambd, ": || D - B X ||_F / || D ||_F =", equalNorm/DNorm + print('lambda={}: || D - B X ||_F / || D ||_F = {}'.format(lambd, + equalNorm/DNorm)) SolveWeighted(A,B,C,D,1) SolveWeighted(A,B,C,D,10) @@ -134,6 +136,4 @@ def SolveWeighted(A,B,C,D,lambd): SolveWeighted(A,B,C,D,100000) SolveWeighted(A,B,C,D,1000000) -# Require the user to press a button before the figures are closed El.Finalize() -raw_input('Press Enter to exit') diff --git a/examples/interface/SequentialLeastSquares.py b/examples/interface/SequentialLeastSquares.py index c1adf964d5..3f26aae21f 100644 --- a/examples/interface/SequentialLeastSquares.py +++ b/examples/interface/SequentialLeastSquares.py @@ -43,22 +43,20 @@ def ExtendedLaplacian(xSize,ySize): if display: El.Display( y, "y" ) yNrm = El.Nrm2(y) -print "|| y ||_2 =", yNrm +print('|| y ||_2 = {}'.format(yNrm)) -startLS = clock.time() +startLS = time.time() x = El.LeastSquares(A,y) -endLS = clock.time() -print "LS time:", endLS-startLS, "seconds" +endLS = time.time() +print('LS time: {} seconds'.format(endLS-startLS)) xNrm = El.Nrm2(x) if display: El.Display( x, "x" ) -print "|| x ||_2 =", xNrm +print('|| x ||_2 = {}'.format(xNrm)) El.Multiply(El.NORMAL,-1.,A,x,1.,y) if display: El.Display( y, "A x - y" ) eNrm = El.Nrm2(y) -print "|| A x - y ||_2 / || y ||_2 =", eNrm/yNrm +print('|| A x - y ||_2 / || y ||_2 = {}'.format(eNrm/yNrm)) -# Require the user to press a button before the figures are closed El.Finalize() -raw_input('Press Enter to exit') diff --git a/examples/interface/SequentialLinearSolve.py b/examples/interface/SequentialLinearSolve.py index fb0dff72eb..a0f501238f 100644 --- a/examples/interface/SequentialLinearSolve.py +++ b/examples/interface/SequentialLinearSolve.py @@ -59,7 +59,7 @@ def Rectang(height,width): El.Copy( x, y ) yNrm = El.Nrm2(y) -print "|| y ||_2 =", yNrm +print('|| y ||_2 = {}'.format(yNrm)) if display: El.Display( y, "y" ) @@ -69,14 +69,12 @@ def Rectang(height,width): El.Display( x, "x" ) xNrm = El.Nrm2(x) -print "|| x ||_2 =", xNrm +print('|| x ||_2 = {}'.format(xNrm)) El.Multiply(El.NORMAL,-1.,A,x,1.,y) if display: El.Display( y, "A x - y" ) eNrm = El.Nrm2(y) -print "|| A x - y ||_2 / || y ||_2 =", eNrm/yNrm +print('|| A x - y ||_2 / || y ||_2 = {}'.format(eNrm/yNrm)) -# Require the user to press a button before the figures are closed El.Finalize() -raw_input('Press Enter to exit') diff --git a/examples/interface/SymmetricSolve.py b/examples/interface/SymmetricSolve.py index 380d980430..a4268cea66 100644 --- a/examples/interface/SymmetricSolve.py +++ b/examples/interface/SymmetricSolve.py @@ -40,7 +40,7 @@ def Laplacian(xSize,ySize): yNrm = El.Nrm2(y) if worldRank == 0: - print "|| y ||_2 =", yNrm + print('|| y ||_2 = {}'.format(yNrm)) El.Display( A, "Laplacian" ) El.Display( A.DistGraph(), "Laplacian graph" ) @@ -51,15 +51,12 @@ def Laplacian(xSize,ySize): xNrm = El.Nrm2(x) if worldRank == 0: - print "|| x ||_2 =", xNrm + print('|| x ||_2 = {}'.format(xNrm)) El.Multiply(El.NORMAL,-1.,A,x,1.,y) El.Display( y, "A x - y" ) eNrm = El.Nrm2(y) if worldRank == 0: - print "|| A x - y ||_2 / || y ||_2 =", eNrm/yNrm + print('|| A x - y ||_2 / || y ||_2 = {}'.format(eNrm/yNrm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/TV.py b/examples/interface/TV.py index 72c4f8d3d1..6b71d8b7b3 100644 --- a/examples/interface/TV.py +++ b/examples/interface/TV.py @@ -2,16 +2,16 @@ # Copyright (c) 2009-2016, Jack Poulson # All rights reserved. # -# This file is part of Elemental and is under the BSD 2-Clause License, -# which can be found in the LICENSE file in the root directory, or at +# This file is part of Elemental and is under the BSD 2-Clause License, +# which can be found in the LICENSE file in the root directory, or at # http://opensource.org/licenses/BSD-2-Clause # import El n = 4000 -numLambdas = 5 +numLambdas = 3 startLambda = 1. -endLambda = 50. +endLambda = 20. display = True worldRank = El.mpi.WorldRank() worldSize = El.mpi.WorldSize() @@ -42,15 +42,15 @@ def Deriv(height): for j in xrange(0,numLambdas): lambd = startLambda + j*(endLambda-startLambda)/(numLambdas-1.) if worldRank == 0: - print "lambda =", lambd + print('lambda = {}'.format(lambd)) startTV = El.mpi.Time() x = El.TV( b, lambd, ctrl ) endTV = El.mpi.Time() if worldRank == 0: - print "TV time: ", endTV-startTV + print('TV time: {}'.format(endTV-startTV)) - Dx = El.DistMultiVec() + Dx = El.DistMultiVec() El.Zeros( Dx, n-1, 1 ) El.Multiply( El.NORMAL, 1., D, x, 0., Dx ) if display: @@ -65,10 +65,7 @@ def Deriv(height): El.Display( e, "e" ) eTwoNorm = El.Nrm2( e ) if worldRank == 0: - print "|| D x ||_1 =", DxOneNorm - print "|| x - b ||_2 =", eTwoNorm + print('|| D x ||_1 = {}'.format(DxOneNorm)) + print('|| x - b ||_2 = {}'.format(eTwoNorm)) -# Require the user to press a button before the figures are closed El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/Tikhonov.py b/examples/interface/Tikhonov.py index af814a79a6..ae186edec5 100644 --- a/examples/interface/Tikhonov.py +++ b/examples/interface/Tikhonov.py @@ -77,27 +77,23 @@ def StackedFD2D(N0,N1): El.Display( y, "y" ) yNrm = El.Nrm2(y) if worldRank == 0: - print "|| y ||_2 =", yNrm + print('|| y ||_2 = {}'.format(yNrm)) startLS = El.mpi.Time() x = El.Tikhonov(A,y,G) endLS = El.mpi.Time() if worldRank == 0: - print "Tikhonov time:", endLS-startLS, "seconds" + print('Tikhonov time: {} seconds'.format(endLS-startLS)) xNrm = El.Nrm2(x) if display: El.Display( x, "x" ) if worldRank == 0: - print "|| x ||_2 =", xNrm + print('|| x ||_2 = {}'.format(xNrm)) El.Multiply(El.NORMAL,-1.,A,x,1.,y) if display: El.Display( y, "A x - y" ) eNrm = El.Nrm2(y) if worldRank == 0: - print "|| A x - y ||_2 / || y ||_2 =", eNrm/yNrm - -# Require the user to press a button before the figures are closed + print('|| A x - y ||_2 / || y ||_2 = {}'.format(eNrm/yNrm)) El.Finalize() -if worldSize == 1: - raw_input('Press Enter to exit') diff --git a/examples/interface/TriangEig.py b/examples/interface/TriangEig.py index e20b5dfcbe..b95e2a86d5 100644 --- a/examples/interface/TriangEig.py +++ b/examples/interface/TriangEig.py @@ -1,7 +1,8 @@ import El n = 1000 -output = True +outputMatrices = False +outputVector = True A = El.Matrix(El.zTag) El.Uniform( A, n, n, 0., 10.) @@ -12,9 +13,12 @@ X = El.TriangEig(T) -if output: +if outputMatrices: El.Print( A, "A" ) - El.Print( w, "w" ) El.Print( Q, "Q" ) El.Print( T, "T" ) El.Print( X, "X" ) +if outputVector: + El.Print( w, "w" ) + +El.Finalize() diff --git a/examples/interface/ZDependenceSearch.py b/examples/interface/ZDependenceSearch.py index e6f1b4b90b..43cd771778 100644 --- a/examples/interface/ZDependenceSearch.py +++ b/examples/interface/ZDependenceSearch.py @@ -40,8 +40,8 @@ for deltaLower in 0.5, 0.75, 0.95, 0.98, 0.99: for variant in El.LLL_NORMAL, El.LLL_DEEP, El.LLL_DEEP_REDUCE: - print "variant=%d, presort=%r, smallestFirst=%r, deltaLower=%f" % \ - (variant,presort,smallestFirst,deltaLower) + print('variant={}, presort={}, smallestFirst={}, deltaLower={}'.format( \ + variant,presort,smallestFirst,deltaLower)) ctrl.delta = deltaLower ctrl.variant = variant @@ -52,12 +52,14 @@ startTime = El.mpi.Time() numExact, B, U = El.ZDependenceSearch(z,NSqrt,ctrl) runTime = El.mpi.Time() - startTime - print " runtime: %f seconds" % runTime - print " num \"exact\": ", numExact + print(' runtime: {} seconds'.format(runTime)) + print(' num \"exact\": {}'.format(numExact)) if outputAll: El.Print( B, "B" ) El.Print( U, "U" ) elif outputCoeff: El.Print( U[:,0], "u0" ) - print "approximate zero: %e+%ei" % \ - (B.GetRealPart(n,0)/NSqrt,B.GetImagPart(n,0)/NSqrt) + print('approximate zero: {}+{}i'.format( \ + B.GetRealPart(n,0)/NSqrt,B.GetImagPart(n,0)/NSqrt)) + +El.Finalize() diff --git a/include/El/lapack_like/spectral.h b/include/El/lapack_like/spectral.h index 710162ccf4..85d6e8ff56 100644 --- a/include/El/lapack_like/spectral.h +++ b/include/El/lapack_like/spectral.h @@ -1092,6 +1092,9 @@ typedef struct { /* (Pseudo-)Spectral portrait -------------------------- */ + +/* Square + ^^^^^^ */ EL_EXPORT ElError ElSpectralPortrait_s ( ElConstMatrix_s A, ElMatrix_s invNormMap, ElInt realSize, ElInt imagSize, ElSpectralBox_s* box ); @@ -1118,8 +1121,8 @@ EL_EXPORT ElError ElSpectralPortraitDist_z ( ElConstDistMatrix_z A, ElDistMatrix_d invNormMap, ElInt realSize, ElInt imagSize, ElSpectralBox_d* box ); -/* Expert version - ^^^^^^^^^^^^^^ */ +/* Expert interface + ~~~~~~~~~~~~~~~~ */ EL_EXPORT ElError ElSpectralPortraitX_s ( ElConstMatrix_s A, ElMatrix_s invNormMap, ElInt realSize, ElInt imagSize, ElSpectralBox_s* box, ElPseudospecCtrl_s ctrl ); @@ -1150,6 +1153,40 @@ EL_EXPORT ElError ElSpectralPortraitXDist_z ElInt realSize, ElInt imagSize, ElSpectralBox_d* box, ElPseudospecCtrl_d ctrl ); +/* Triangular + ^^^^^^^^^^ */ +EL_EXPORT ElError ElTriangularSpectralPortrait_c +( ElConstMatrix_c U, ElMatrix_s invNormMap, ElInt realSize, ElInt imagSize, + ElSpectralBox_s* box ); +EL_EXPORT ElError ElTriangularSpectralPortrait_z +( ElConstMatrix_z U, ElMatrix_d invNormMap, ElInt realSize, ElInt imagSize, + ElSpectralBox_d* box ); + +EL_EXPORT ElError ElTriangularSpectralPortraitDist_c +( ElConstDistMatrix_c U, ElDistMatrix_s invNormMap, + ElInt realSize, ElInt imagSize, ElSpectralBox_s* box ); +EL_EXPORT ElError ElTriangularSpectralPortraitDist_z +( ElConstDistMatrix_z U, ElDistMatrix_d invNormMap, + ElInt realSize, ElInt imagSize, ElSpectralBox_d* box ); + +/* Expert interface + ~~~~~~~~~~~~~~~~ */ +EL_EXPORT ElError ElTriangularSpectralPortraitX_c +( ElConstMatrix_c U, ElMatrix_s invNormMap, ElInt realSize, ElInt imagSize, + ElSpectralBox_s* box, ElPseudospecCtrl_s ctrl ); +EL_EXPORT ElError ElTriangularSpectralPortraitX_z +( ElConstMatrix_z U, ElMatrix_d invNormMap, ElInt realSize, ElInt imagSize, + ElSpectralBox_d* box, ElPseudospecCtrl_d ctrl ); + +EL_EXPORT ElError ElTriangularSpectralPortraitXDist_c +( ElConstDistMatrix_c U, ElDistMatrix_s invNormMap, + ElInt realSize, ElInt imagSize, + ElSpectralBox_s* box, ElPseudospecCtrl_s ctrl ); +EL_EXPORT ElError ElTriangularSpectralPortraitXDist_z +( ElConstDistMatrix_z U, ElDistMatrix_d invNormMap, + ElInt realSize, ElInt imagSize, + ElSpectralBox_d* box, ElPseudospecCtrl_d ctrl ); + /* (Pseudo-)Spectral window ------------------------ */ EL_EXPORT ElError ElSpectralWindow_s diff --git a/python/__init__.py b/python/__init__.py index ce6302efa4..6acf1e98c7 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -14,3 +14,10 @@ from optimization import * from control import * from lattice import * + +lib.ElFinalize.argtypes = [] +def Finalize(): + if havePyPlot: + if len(plt.get_fignums()) > 0 and not isInlinePyPlot: + plt.show() + lib.ElFinalize() diff --git a/python/core/DistMatrix.py b/python/core/DistMatrix.py index 878fb165b3..587225d400 100644 --- a/python/core/DistMatrix.py +++ b/python/core/DistMatrix.py @@ -924,7 +924,8 @@ def DistRank(self): else: DataExcept() return rank.value - # HERE + # Return this process's rank in the cross communicator + # ---------------------------------------------------- lib.ElDistMatrixCrossRank_i.argtypes = \ lib.ElDistMatrixCrossRank_s.argtypes = \ lib.ElDistMatrixCrossRank_d.argtypes = \ @@ -942,6 +943,8 @@ def CrossRank(self): else: DataExcept() return rank.value + # Return this process's rank in the redundant communicator + # -------------------------------------------------------- lib.ElDistMatrixRedundantRank_i.argtypes = \ lib.ElDistMatrixRedundantRank_s.argtypes = \ lib.ElDistMatrixRedundantRank_d.argtypes = \ @@ -959,6 +962,8 @@ def RedundantRank(self): else: DataExcept() return rank.value + # Return the rank of the process in the cross comm. that owns the data + # -------------------------------------------------------------------- lib.ElDistMatrixRoot_i.argtypes = \ lib.ElDistMatrixRoot_s.argtypes = \ lib.ElDistMatrixRoot_d.argtypes = \ @@ -976,6 +981,8 @@ def Root(self): else: DataExcept() return root.value + # Return True if this process is in the team that is assigned data + # ---------------------------------------------------------------- lib.ElDistMatrixParticipating_i.argtypes = \ lib.ElDistMatrixParticipating_s.argtypes = \ lib.ElDistMatrixParticipating_d.argtypes = \ @@ -993,6 +1000,8 @@ def Participating(self): else: DataExcept() return partic.value + # Return the rank (in the column communicator) of the process owning row 'i' + # -------------------------------------------------------------------------- lib.ElDistMatrixRowOwner_i.argtypes = \ lib.ElDistMatrixRowOwner_s.argtypes = \ lib.ElDistMatrixRowOwner_d.argtypes = \ @@ -1010,6 +1019,8 @@ def RowOwner(self,i): else: DataExcept() return owner.value + # Return the rank (in the row communicator) of the process owning column 'j' + # -------------------------------------------------------------------------- lib.ElDistMatrixColOwner_i.argtypes = \ lib.ElDistMatrixColOwner_s.argtypes = \ lib.ElDistMatrixColOwner_d.argtypes = \ @@ -1027,6 +1038,8 @@ def ColOwner(self,j): else: DataExcept() return owner.value + # Return the rank (in the dist. comm.) of the process owning entry (i,j) + # ---------------------------------------------------------------------- lib.ElDistMatrixOwner_i.argtypes = \ lib.ElDistMatrixOwner_s.argtypes = \ lib.ElDistMatrixOwner_d.argtypes = \ @@ -1044,6 +1057,8 @@ def Owner(self,i,j): else: DataExcept() return owner.value + # NOTE(poulson): Short descriptions still need to be added from here down + lib.ElDistMatrixLocalRow_i.argtypes = \ lib.ElDistMatrixLocalRow_s.argtypes = \ lib.ElDistMatrixLocalRow_d.argtypes = \ diff --git a/python/io.py b/python/io.py index 0e00c91531..1a0602caa0 100644 --- a/python/io.py +++ b/python/io.py @@ -10,13 +10,17 @@ from El.blas_like import Copy, CopyFromRoot, CopyFromNonRoot, RealPart, ImagPart # Attempt to import matplotlib.pyplot and save whether or not this succeeded +global havePyPlot +global isInlinePyPlot try: import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt havePyPlot=True + isInlinePyPlot = 'inline' in mpl.get_backend() except: havePyPlot=False + isInlinePyPlot=False print 'Could not import matplotlib.pyplot' if havePyPlot: @@ -191,9 +195,9 @@ def DisplayPyPlot(A,title=''): fig.colorbar(im,ax=axis) plt.title(title) plt.draw() - isInline = 'inline' in mpl.get_backend() - if not isInline: + if not isInlinePyPlot: plt.show(block=False) + return fig def DisplayNetworkX(A,title=''): numEdges = A.NumEdges() @@ -206,9 +210,9 @@ def DisplayNetworkX(A,title=''): plt.title(title) nx.draw(G) plt.draw() - isInline = 'inline' in mpl.get_backend() - if not isInline: + if not isInlinePyPlot: plt.show(block=False) + return fig def DisplayCxx(A,title=''): args = [A.obj,title] @@ -264,59 +268,55 @@ def DisplayCxx(A,title=''): elif type(A) is DistPermutation: DisplayCxx(A.ExplicitVector(),title) else: TypeExcept() + return None def Display(A,title='',tryPython=True): if tryPython: if type(A) is Matrix: if havePyPlot: - DisplayPyPlot(A,title) - return + return DisplayPyPlot(A,title) elif type(A) is DistMatrix: A_CIRC_CIRC = DistMatrix(A.tag,CIRC,CIRC,A.Grid()) Copy(A,A_CIRC_CIRC) if A_CIRC_CIRC.CrossRank() == A_CIRC_CIRC.Root(): - Display(A_CIRC_CIRC.Matrix(),title,True) - return + return Display(A_CIRC_CIRC.Matrix(),title,True) + return None elif type(A) is DistMultiVec: if mpi.Rank(A.Comm()) == 0: ASeq = Matrix(A.tag) CopyFromRoot(A,ASeq) - Display(ASeq,title,True) + return Display(ASeq,title,True) else: CopyFromNonRoot(A) - return + return None elif type(A) is Graph: if haveNetworkX: - DisplayNetworkX(A,title) - return + return DisplayNetworkX(A,title) elif type(A) is DistGraph: if mpi.Rank(A.Comm()) == 0: ASeq = Graph() CopyFromRoot(A,ASeq) - Display(ASeq,title,True) + return Display(ASeq,title,True) else: CopyFromNonRoot(A) - return + return None elif type(A) is SparseMatrix: ADense = Matrix(A.tag) Copy(A,ADense) - Display(ADense,title,True) - return + return Display(ADense,title,True) elif type(A) is DistSparseMatrix: grid = Grid(A.Comm()) ADense = DistMatrix(A.tag,MC,MR,grid) Copy(A,ADense) - Display(ADense,title,True) - return + return Display(ADense,title,True) elif type(A) is Permutation: - Display(A.ExplicitVector(),title,True) - return + return Display(A.ExplicitVector(),title,True) elif type(A) is DistPermutation: - Display(A.ExplicitVector(),title,True) - return + return Display(A.ExplicitVector(),title,True) # Fall back to the internal Display routine DisplayCxx(A,title) + return None lib.ElSpy_i.argtypes = \ lib.ElSpyDist_i.argtypes = \ diff --git a/python/lapack_like/spectral.py b/python/lapack_like/spectral.py index a397e4e345..1785805d55 100644 --- a/python/lapack_like/spectral.py +++ b/python/lapack_like/spectral.py @@ -7,8 +7,8 @@ # http://opensource.org/licenses/BSD-2-Clause # from ..core import * -from ..blas_like import Copy, EntrywiseMap -from ..io import ProcessEvents +from ..blas_like import Copy, EntrywiseMap, RealPart, ImagPart +from ..io import * import ctypes from ctypes import CFUNCTYPE @@ -1184,59 +1184,77 @@ class SpectralBox_d(ctypes.Structure): ("realWidth",dType), ("imagWidth",dType)] -def DisplayPortrait(portrait,box,title='',tryPython=True): +def DisplayPortrait(portrait,box,title='',tryPython=True,eigvals=None): import math - if tryPython: + if tryPython and havePyPlot: if type(portrait) is Matrix: - EntrywiseMap(portrait,math.log10) - try: - import numpy as np - import matplotlib as mpl - import matplotlib.pyplot as plt - isInline = 'inline' in mpl.get_backend() - isVec = min(portrait.Height(),portrait.Width()) == 1 - fig = plt.figure() - axis = fig.add_axes([0.1,0.1,0.8,0.8]) - if isVec: - axis.plot(np.squeeze(portrait.ToNumPy()),'bo-') - else: - lBound = box.center.real - box.realWidth/2 - rBound = box.center.real + box.realWidth/2 - bBound = box.center.imag - box.imagWidth/2 - tBound = box.center.imag + box.imagWidth/2 - im = axis.imshow(portrait.ToNumPy(), - extent=[lBound,rBound,bBound,tBound]) - fig.colorbar(im,ax=axis) - plt.title(title) - plt.draw() - if not isInline: - plt.show(block=False) - return - except: - print 'Could not import matplotlib.pyplot' + portraitLog10 = Matrix(portrait.tag) + Copy(portrait,portraitLog10) + EntrywiseMap(portraitLog10,math.log10) + isVec = min(portrait.Height(),portrait.Width()) == 1 + fig = plt.figure() + axis = fig.add_axes([0.1,0.1,0.8,0.8]) + if isVec: + axis.plot(io.np.squeeze(portraitLog10.ToNumPy()),'bo-') + else: + lBound = box.center.real - box.realWidth/2 + rBound = box.center.real + box.realWidth/2 + bBound = box.center.imag - box.imagWidth/2 + tBound = box.center.imag + box.imagWidth/2 + im = axis.imshow(portraitLog10.ToNumPy(), + extent=[lBound,rBound,bBound,tBound]) + fig.colorbar(im,ax=axis) + if type(eigvals) is Matrix: + eigvalsReal = Matrix(portrait.tag) + eigvalsImag = Matrix(portrait.tag) + RealPart(eigvals,eigvalsReal) + ImagPart(eigvals,eigvalsImag) + plt.scatter(np.squeeze(eigvalsReal.ToNumPy()), + np.squeeze(eigvalsImag.ToNumPy())) + plt.title(title) + plt.draw() + isInline = 'inline' in mpl.get_backend() + if not isInline: + plt.show(block=False) + return fig elif type(portrait) is DistMatrix: portrait_CIRC_CIRC = DistMatrix(portrait.tag,CIRC,CIRC,portrait.Grid()) Copy(portrait,portrait_CIRC_CIRC) + if type(eigvals) is DistMatrix: + eigvalsFull = DistMatrix(eigvals.tag,STAR,STAR,eigvals.Grid()) + Copy(eigvals,eigvalsFull) if portrait_CIRC_CIRC.CrossRank() == portrait_CIRC_CIRC.Root(): - DisplayPortrait(portrait_CIRC_CIRC.Matrix(),box,title,True) - return + if eigvals is None: + return DisplayPortrait(portrait_CIRC_CIRC.Matrix(),box,title, + tryPython=True) + elif type(eigvals) is Matrix: + return DisplayPortrait(portrait_CIRC_CIRC.Matrix(),box,title, + tryPython=True,eigvals=eigvals) + elif type(eigvals) is DistMatrix: + return DisplayPortrait(portrait_CIRC_CIRC.Matrix(),box,title, + tryPython=True,eigvals=eigvalsFull.Matrix()) + return None # Fall back to the built-in Display if we have not succeeded - if not tryPython or type(portrait) is not Matrix: - EntrywiseMap(portrait,math.log10) - args = [portrait.obj,title] numMsExtra = 200 if type(portrait) is Matrix: + portraitLog10 = Matrix(portrait.tag) + EntrywiseMap(portrait,math.log10) + args = [portraitLog10.obj,title] if portrait.tag == sTag: lib.ElDisplay_s(*args) elif portrait.tag == dTag: lib.ElDisplay_d(*args) else: DataExcept() ProcessEvents(numMsExtra) elif type(portrait) is DistMatrix: + portraitLog10 = DistMatrix(portrait.tag,MC,MR,portrait.Grid()) + EntrywiseMap(portrait,math.log10) + args = [portraitLog10.obj,title] if portrait.tag == sTag: lib.ElDisplayDist_s(*args) elif portrait.tag == dTag: lib.ElDisplayDist_d(*args) else: DataExcept() ProcessEvents(numMsExtra) else: TypeExcept() + return None # (Pseudo-)Spectral portrait # -------------------------- @@ -1244,6 +1262,8 @@ def DisplayPortrait(portrait,box,title='',tryPython=True): # using the spectral radius would be insufficient for highly non-normal # matrices, e.g., a Jordan block with eigenvalue zero +# General +# ^^^^^^^ lib.ElSpectralPortrait_s.argtypes = \ lib.ElSpectralPortrait_c.argtypes = \ lib.ElSpectralPortraitDist_s.argtypes = \ @@ -1327,6 +1347,59 @@ def SpectralPortrait(A,realSize=200,imagSize=200,ctrl=None): return invNormMap, box else: TypeExcept() +# Triangular +# ^^^^^^^^^^ +lib.ElTriangularSpectralPortrait_c.argtypes = \ +lib.ElTriangularSpectralPortraitDist_c.argtypes = \ + [c_void_p,c_void_p,iType,iType,POINTER(SpectralBox_s)] + +lib.ElTriangularSpectralPortrait_z.argtypes = \ +lib.ElTriangularSpectralPortraitDist_z.argtypes = \ + [c_void_p,c_void_p,iType,iType,POINTER(SpectralBox_d)] + +lib.ElTriangularSpectralPortraitX_c.argtypes = \ +lib.ElTriangularSpectralPortraitXDist_c.argtypes = \ + [c_void_p,c_void_p,iType,iType,POINTER(SpectralBox_s),PseudospecCtrl_s] + +lib.ElTriangularSpectralPortraitX_z.argtypes = \ +lib.ElTriangularSpectralPortraitXDist_z.argtypes = \ + [c_void_p,c_void_p,iType,iType,POINTER(SpectralBox_d),PseudospecCtrl_d] + +def TriangularSpectralPortrait(U,realSize=200,imagSize=200,ctrl=None): + if type(U) is Matrix: + invNormMap = Matrix(Base(U.tag)) + if U.tag == cTag: + box = SpectralBox_s() + args = [U.obj,invNormMap.obj,realSize,imagSize,pointer(box)] + argsCtrl = [U.obj,invNormMap.obj,realSize,imagSize,pointer(box),ctrl] + if ctrl == None: lib.ElTriangularSpectralPortrait_c(*args) + else: lib.ElTriangularSpectralPortraitX_c(*argsCtrl) + elif U.tag == zTag: + box = SpectralBox_d() + args = [U.obj,invNormMap.obj,realSize,imagSize,pointer(box)] + argsCtrl = [U.obj,invNormMap.obj,realSize,imagSize,pointer(box),ctrl] + if ctrl == None: lib.ElTriangularSpectralPortrait_z(*args) + else: lib.ElTriangularSpectralPortraitX_z(*argsCtrl) + else: DataExcept() + return invNormMap, box + elif type(U) is DistMatrix: + invNormMap = DistMatrix(Base(U.tag),MC,MR,U.Grid()) + if U.tag == cTag: + box = SpectralBox_s() + args = [U.obj,invNormMap.obj,realSize,imagSize,pointer(box)] + argsCtrl = [U.obj,invNormMap.obj,realSize,imagSize,pointer(box),ctrl] + if ctrl == None: lib.ElTriangularSpectralPortraitDist_c(*args) + else: lib.ElTriangularSpectralPortraitXDist_c(*argsCtrl) + elif U.tag == zTag: + box = SpectralBox_d() + args = [U.obj,invNormMap.obj,realSize,imagSize,pointer(box)] + argsCtrl = [U.obj,invNormMap.obj,realSize,imagSize,pointer(box),ctrl] + if ctrl == None: lib.ElTriangularSpectralPortraitDist_z(*args) + else: lib.ElTriangularSpectralPortraitXDist_z(*argsCtrl) + else: DataExcept() + return invNormMap, box + else: TypeExcept() + # (Pseudo-)Spectral window # ------------------------ lib.ElSpectralWindow_s.argtypes = \ diff --git a/src/lapack_like/spectral-C.cpp b/src/lapack_like/spectral-C.cpp index 65aea20198..76470b82e0 100644 --- a/src/lapack_like/spectral-C.cpp +++ b/src/lapack_like/spectral-C.cpp @@ -833,6 +833,8 @@ ElError ElPseudospecCtrlDestroy_d( const ElPseudospecCtrl_d* ctrl ) ============= */ \ /* (Pseudo-)Spectral portrait -------------------------- */ \ + /* Square + ^^^^^^ */ \ ElError ElSpectralPortrait_ ## SIGBASE \ ( ElConstMatrix_ ## SIGBASE A, ElMatrix_ ## SIGBASE invNormMap, \ ElInt realSize, ElInt imagSize, ElSpectralBox_ ## SIGBASE* boxC ) \ @@ -865,7 +867,7 @@ ElError ElPseudospecCtrlDestroy_d( const ElPseudospecCtrl_d* ctrl ) SpectralPortrait( *CReflect(A), *CReflect(invNormMap), \ realSize, imagSize, box ); \ *boxC = CReflect(box) ) } \ - /* Expert version */ \ + /* Expert interface */ \ ElError ElSpectralPortraitX_ ## SIGBASE \ ( ElConstMatrix_ ## SIGBASE A, ElMatrix_ ## SIGBASE invNormMap, \ ElInt realSize, ElInt imagSize, ElSpectralBox_ ## SIGBASE* boxC, \ @@ -906,6 +908,45 @@ ElError ElPseudospecCtrlDestroy_d( const ElPseudospecCtrl_d* ctrl ) *CReflect(A), *CReflect(invNormMap), realSize, imagSize, box, \ CReflect(ctrl) ); \ *boxC = CReflect(box) ) } \ + /* Triangular + ^^^^^^^^^^ */ \ + ElError ElTriangularSpectralPortrait_ ## SIG \ + ( ElConstMatrix_ ## SIG U, ElMatrix_ ## SIGBASE invNormMap, \ + ElInt realSize, ElInt imagSize, ElSpectralBox_ ## SIGBASE* boxC ) \ + { EL_TRY( \ + SpectralBox> box; \ + SpectralPortrait( *CReflect(U), *CReflect(invNormMap), \ + realSize, imagSize, box ); \ + *boxC = CReflect(box) ) } \ + ElError ElTriangularSpectralPortraitDist_ ## SIG \ + ( ElConstDistMatrix_ ## SIG U, ElDistMatrix_ ## SIGBASE invNormMap, \ + ElInt realSize, ElInt imagSize, ElSpectralBox_ ## SIGBASE* boxC ) \ + { EL_TRY( \ + SpectralBox> box; \ + SpectralPortrait( *CReflect(U), *CReflect(invNormMap), \ + realSize, imagSize, box ); \ + *boxC = CReflect(box) ) } \ + /* Expert interface */ \ + ElError ElTriangularSpectralPortraitX_ ## SIG \ + ( ElConstMatrix_ ## SIG U, ElMatrix_ ## SIGBASE invNormMap, \ + ElInt realSize, ElInt imagSize, ElSpectralBox_ ## SIGBASE* boxC, \ + ElPseudospecCtrl_ ## SIGBASE ctrl ) \ + { EL_TRY( \ + SpectralBox> box; \ + SpectralPortrait( \ + *CReflect(U), *CReflect(invNormMap), realSize, imagSize, box, \ + CReflect(ctrl) ); \ + *boxC = CReflect(box) ) } \ + ElError ElTriangularSpectralPortraitXDist_ ## SIG \ + ( ElConstDistMatrix_ ## SIG U, ElDistMatrix_ ## SIGBASE invNormMap, \ + ElInt realSize, ElInt imagSize, ElSpectralBox_ ## SIGBASE* boxC, \ + ElPseudospecCtrl_ ## SIGBASE ctrl ) \ + { EL_TRY( \ + SpectralBox> box; \ + SpectralPortrait( \ + *CReflect(U), *CReflect(invNormMap), realSize, imagSize, box, \ + CReflect(ctrl) ); \ + *boxC = CReflect(box) ) } \ /* (Pseudo-)Spectral window ------------------------ */ \ ElError ElSpectralWindow_ ## SIGBASE \