The MOSEK Python optimizer API manual Version 7.0 (Revision 141)

Optimizer API for Python - Documentation - Mosek Optimizer API for Python - Documentation - Mosek

25.11.2015 Views

42 CHAPTER 5. BASIC API TUTORIAL 104 task.appendsparsesymmat(BARVARDIM[0], 105 barci, 106 barcj, 107 barcval) 108 109 syma0 = \ 110 task.appendsparsesymmat(BARVARDIM[0], 111 barai[0], 112 baraj[0], 113 baraval[0]) 114 115 syma1 = \ 116 task.appendsparsesymmat(BARVARDIM[0], 117 barai[1], 118 baraj[1], 119 baraval[1]) 120 121 task.putbarcj(0, [symc], [1.0]) 122 123 task.putbaraij(0, 0, [syma0], [1.0]) 124 task.putbaraij(1, 0, [syma1], [1.0]) 125 126 # Input the objective sense (minimize/maximize) 127 task.putobjsense(mosek.objsense.minimize) 128 129 task.writedata("sdo1.task") 130 131 # Solve the problem and print summary 132 task.optimize() 133 task.solutionsummary(mosek.streamtype.msg) 134 135 # Get status information about the solution 136 prosta = task.getprosta(mosek.soltype.itr) 137 solsta = task.getsolsta(mosek.soltype.itr) 138 139 if (solsta == mosek.solsta.optimal or 140 solsta == mosek.solsta.near optimal): 141 xx = zeros(numvar, float) 142 task.getxx(mosek.soltype.itr, xx) 143 144 lenbarvar = BARVARDIM[0] * (BARVARDIM[0]+1) / 2 145 barx = zeros(int(lenbarvar), float) 146 task.getbarxj(mosek.soltype.itr, 0, barx) 147 148 print("Optimal solution:\nx=%s\nbarx=%s" % (xx,barx)) 149 elif (solsta == mosek.solsta.dual infeas cer or 150 solsta == mosek.solsta.prim infeas cer or 151 solsta == mosek.solsta.near dual infeas cer or 152 solsta == mosek.solsta.near prim infeas cer): 153 print("Primal or dual infeasibility certificate found.\n") 154 elif solsta == mosek.solsta.unknown: 155 print("Unknown solution status") 156 else: 157 print("Other solution status") 158 159 # call the main function 160 try: 161 main ()

5.4. SEMIDEFINITE OPTIMIZATION 43 162 except mosek.Exception as e: 163 print ("ERROR: %s" % str(e.errno)) 164 if e.msg is not None: 165 print ("\t%s" % e.msg) 166 sys.exit(1) 167 except: 168 import traceback 169 traceback.print exc() 170 sys.exit(1) 171 sys.exit(0) 5.4.1.2 Source code comments This example introduces several new functions. The first new function Task.appendbarvars is used to append the semidefinite variable: 79 task.appendbarvars(BARVARDIM) [ sdo1.py ] Symmetric matrices are created using the function Task.appendsparsesymmat: 103 symc = \ 104 task.appendsparsesymmat(BARVARDIM[0], 105 barci, 106 barcj, 107 barcval) 108 109 syma0 = \ 110 task.appendsparsesymmat(BARVARDIM[0], 111 barai[0], 112 baraj[0], 113 baraval[0]) 114 115 syma1 = \ 116 task.appendsparsesymmat(BARVARDIM[0], 117 barai[1], 118 baraj[1], 119 baraval[1]) [ sdo1.py ] The second argument specifies the dimension of the symmetric variable and the third argument gives the number of non-zeros in the lower triangular part of the matrix. The next three arguments specify the non-zeros in the lower-triangle in triplet format, and the last argument will be updated with a unique index of the created symmetric matrix. After one or more symmetric matrices have been created using Task.appendsparsesymmat, we can combine them to setup a objective matrix coefficient c j using Task.putbarcj, which forms a linear combination of one more symmetric matrices: 121 task.putbarcj(0, [symc], [1.0]) [ sdo1.py ]

42 CHAPTER 5. BASIC <strong>API</strong> TUTORIAL<br />

104 task.appendsparsesymmat(BARVARDIM[0],<br />

105 barci,<br />

106 barcj,<br />

107 barcval)<br />

108<br />

109 syma0 = \<br />

110 task.appendsparsesymmat(BARVARDIM[0],<br />

111 barai[0],<br />

112 baraj[0],<br />

113 baraval[0])<br />

114<br />

115 syma1 = \<br />

116 task.appendsparsesymmat(BARVARDIM[0],<br />

117 barai[1],<br />

118 baraj[1],<br />

119 baraval[1])<br />

120<br />

121 task.putbarcj(0, [symc], [1.0])<br />

122<br />

123 task.putbaraij(0, 0, [syma0], [1.0])<br />

124 task.putbaraij(1, 0, [syma1], [1.0])<br />

125<br />

126 # Input the objective sense (minimize/maximize)<br />

127 task.putobjsense(mosek.objsense.minimize)<br />

128<br />

129 task.writedata("sdo1.task")<br />

130<br />

131 # Solve the problem and print summary<br />

132 task.optimize()<br />

133 task.solutionsummary(mosek.streamtype.msg)<br />

134<br />

135 # Get status information about the solution<br />

136 prosta = task.getprosta(mosek.soltype.itr)<br />

137 solsta = task.getsolsta(mosek.soltype.itr)<br />

138<br />

139 if (solsta == mosek.solsta.optimal or<br />

140 solsta == mosek.solsta.near optimal):<br />

<strong>141</strong> xx = zeros(numvar, float)<br />

142 task.getxx(mosek.soltype.itr, xx)<br />

143<br />

144 lenbarvar = BARVARDIM[0] * (BARVARDIM[0]+1) / 2<br />

145 barx = zeros(int(lenbarvar), float)<br />

146 task.getbarxj(mosek.soltype.itr, 0, barx)<br />

147<br />

148 print("Optimal solution:\nx=%s\nbarx=%s" % (xx,barx))<br />

149 elif (solsta == mosek.solsta.dual infeas cer or<br />

150 solsta == mosek.solsta.prim infeas cer or<br />

151 solsta == mosek.solsta.near dual infeas cer or<br />

152 solsta == mosek.solsta.near prim infeas cer):<br />

153 print("Primal or dual infeasibility certificate found.\n")<br />

154 elif solsta == mosek.solsta.unknown:<br />

155 print("Unknown solution status")<br />

156 else:<br />

157 print("Other solution status")<br />

158<br />

159 # call the main function<br />

160 try:<br />

161 main ()

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!