def setup_solver_cvx(self): c = self.constvars imagedims = c['imagedims'] n_image = c['n_image'] d_image = c['d_image'] l_labels = c['l_labels'] l_shm = c['l_shm'] self.cvx_x = Variable( ('p', (l_shm, d_image, n_image)), ('q0', (n_image, )), ('q1', (l_labels, n_image)), ('q2', (l_labels, n_image)), ) self.cvx_y = Variable( ('u1', (n_image, l_labels)), ('v', (n_image, l_shm)), ('misc', (n_image, )), ) p, q0, q1, q2 = [cvxVariable(*a['shape']) for a in self.cvx_x.vars()] self.cvx_vars = p + [q0, q1, q2] fid_fun_dual = 0 for i in range(n_image): for k in range(l_labels): fid_fun_dual += -1.0/c['b'][k]*(cvx.power(q2[k,i],2)/2 \ + cvx.maximum(q2[k,i]*c['b'][k]*c['f1'][i,k], q2[k,i]*c['b'][k]*c['f2'][i,k])) self.cvx_obj = cvx.Maximize(fid_fun_dual - cvx.sum(q0)) div_op = sparse_div_op(imagedims) self.cvx_dual = True self.cvx_constr = [] # u1_constr for i in range(n_image): self.cvx_constr.append(c['b'] * q0[i] - q1[:, i] >= 0) # v_constr for i in range(n_image): for k in range(l_shm): Yk = cvx.vec(c['Y'][:, k]) self.cvx_constr.append( Yk.T*(c['M'][k]*q2[:,i] + q1[:,i]) \ - cvxOp(div_op, p[k], i) == 0) # additional inequality constraints for i in range(n_image): self.cvx_constr.append(sum(cvx.sum_squares(p[k][:,i]) \ for k in range(l_shm)) <= c['lbd']**2)
def setup_solver_cvx(self): c = self.constvars imagedims = c['imagedims'] n_image = c['n_image'] d_image = c['d_image'] l_labels = c['l_labels'] m_gradients = c['m_gradients'] s_manifold = c['s_manifold'] l_shm = c['l_shm'] self.cvx_x = Variable( ('p', (l_shm, d_image, n_image)), ('g', (n_image, m_gradients, s_manifold, d_image)), ('q0', (n_image, )), ('q1', (l_labels, n_image)), ('q2', (l_labels, n_image)), ) self.cvx_y = Variable( ('u1', (n_image, l_labels)), ('v', (n_image, l_shm)), ('w', (m_gradients, n_image, d_image, s_manifold)), ('misc', (n_image * m_gradients, )), ) p, g, q0, q1, q2 = [ cvxVariable(*a['shape']) for a in self.cvx_x.vars() ] self.cvx_vars = p + sum(g, []) + [q0, q1, q2] self.cvx_obj = cvx.Maximize( 0.5 * cvx.sum(cvx.diag(c['b']) * cvx.square(c['f'].T)) - 0.5 * cvx.sum( cvx.diag(1.0 / c['b']) * cvx.square(q2 + cvx.diag(c['b']) * c['f'].T)) - cvx.sum(q0)) div_op = sparse_div_op(imagedims) self.cvx_dual = True self.cvx_constr = [] # u1_constr for i in range(n_image): self.cvx_constr.append(c['b'] * q0[i] - q1[:, i] >= 0) # v_constr for i in range(n_image): for k in range(l_shm): Yk = cvx.vec(c['Y'][:, k]) self.cvx_constr.append( Yk.T*(c['M'][k]*q2[:,i] + q1[:,i]) \ - cvxOp(div_op, p[k], i) == 0) # w_constr for j in range(m_gradients): Gj = c['G'][j, :, :] for i in range(n_image): for t in range(d_image): for l in range(s_manifold): self.cvx_constr.append( g[i][j][l,t] == sum([Gj[l,k]*p[k][t,i] \ for k in range(l_shm)])) # additional inequality constraints for i in range(n_image): for j in range(m_gradients): self.cvx_constr.append(cvx.norm(g[i][j], 2) <= c['lbd'])
def setup_solver_cvx(self): c = self.constvars imagedims = c['imagedims'] n_image = c['n_image'] d_image = c['d_image'] l_labels = c['l_labels'] m_gradients = c['m_gradients'] s_manifold = c['s_manifold'] l_shm = c['l_shm'] self.cvx_x = Variable( ('p', (l_labels, d_image, n_image)), ('g', (n_image, m_gradients, s_manifold, d_image)), ('q0', (n_image, )), ('q1', (l_labels, n_image)), ('q2', (l_labels, n_image)), ) self.cvx_y = Variable( ('u1', (n_image, l_labels)), ('v', (n_image, l_shm)), ('w', (m_gradients, n_image, d_image, s_manifold)), ('misc', (n_image * m_gradients, )), ) p, g, q0, q1, q2 = [ cvxVariable(*a['shape']) for a in self.cvx_x.vars() ] self.cvx_vars = p + sum(g, []) + [q0, q1, q2] fid_fun_dual = 0 for i in range(n_image): for k in range(l_labels): fid_fun_dual += -cvx.power(q2[k,i],2)/2 \ - cvx.maximum(q2[k,i]*c['f1'][i,k], q2[k,i]*c['f2'][i,k]) self.cvx_obj = cvx.Maximize(fid_fun_dual - cvx.sum(q0)) div_op = sparse_div_op(imagedims) self.cvx_dual = True self.cvx_constr = [] # u1_constr for i in range(n_image): for k in range(l_labels): self.cvx_constr.append( c['b'][k] * (q0[i] - cvxOp(div_op, p[k], i)) - q1[k, i] >= 0) # v_constr for i in range(n_image): for k in range(l_shm): Yk = cvx.vec(c['Y'][:, k]) self.cvx_constr.append(Yk.T * (c['M'][k] * q2[:, i] + q1[:, i]) == 0) # w_constr for j in range(m_gradients): Aj = c['A'][j, :, :] Bj = c['B'][j, :, :] Pj = c['P'][j, :] for i in range(n_image): for t in range(d_image): for l in range(s_manifold): self.cvx_constr.append(Aj * g[i][j][l, t] == sum( [Bj[l, m] * p[Pj[m]][t, i] for m in range(3)])) # additional inequality constraints for i in range(n_image): for j in range(m_gradients): self.cvx_constr.append(cvx.norm(g[i][j], 2) <= c['lbd'])
def setup_solver_cvx(self): c = self.constvars imagedims = c['imagedims'] n_image = c['n_image'] d_image = c['d_image'] l_labels = c['l_labels'] l_shm = c['l_shm'] self.cvx_x = Variable( ('p', (l_shm, d_image, n_image)), ('q0', (n_image, )), ('q1', (l_labels, n_image)), ('q2', (l_labels, n_image)), ('q3', (l_labels, n_image)), ('q4', (l_labels, n_image)), ) self.cvx_y = Variable( ('u1', (n_image, l_labels)), ('v', (n_image, l_shm)), ('misc', (n_image * l_labels * 5 + n_image, )), ) p, q0, q1, q2, q3, q4 = [ cvxVariable(*a['shape']) for a in self.cvx_x.vars() ] self.cvx_vars = p + [q0, q1, q2, q3, q4] self.cvx_obj = cvx.Maximize( cvx.vec(q3).T * cvx.vec(cvx.diag(c['b']) * c['f1'].T) - cvx.vec(q4).T * cvx.vec(cvx.diag(c['b']) * c['f2'].T) - cvx.sum(q0)) div_op = sparse_div_op(imagedims) self.cvx_dual = True self.cvx_constr = [] # u1_constr for i in range(n_image): self.cvx_constr.append(c['b'][:] * q0[i] - q1[:, i] >= 0) # v_constr for i in range(n_image): for k in range(l_shm): Yk = cvx.vec(c['Y'][:, k]) self.cvx_constr.append( Yk.T*(c['M'][k]*q2[:,i] + q1[:,i]) \ - cvxOp(div_op, p[k], i) == 0) # additional inequality constraints for i in range(n_image): for k in range(l_labels): self.cvx_constr.append(0 <= q3[k, i]) self.cvx_constr.append(q3[k, i] <= 1) self.cvx_constr.append(0 <= q4[k, i]) self.cvx_constr.append(q4[k, i] <= 1) self.cvx_constr.append(q4[k, i] - q3[k, i] - q2[k, i] == 0) for i in range(n_image): self.cvx_constr.append(sum(cvx.sum_squares(p[k][:,i]) \ for k in range(l_shm)) <= c['lbd']**2)
def setup_solver_cvx(self): if self.dataterm != "W1": raise Exception("Only W1 dataterm is implemented in CVX") c = self.constvars imagedims = c['imagedims'] n_image = c['n_image'] d_image = c['d_image'] l_labels = c['l_labels'] m_gradients = c['m_gradients'] s_manifold = c['s_manifold'] l_shm = c['l_shm'] f_flat = self.data.odf.reshape(-1, l_labels).T f = np.array(f_flat.reshape((l_labels, ) + imagedims), order='C') normalize_odf(f, c['b']) f_flat = f.reshape(l_labels, n_image) self.cvx_x = Variable( ('p', (l_labels, d_image, n_image)), ('g', (n_image, m_gradients, s_manifold, d_image)), ('q0', (n_image, )), ('q1', (l_labels, n_image)), ('p0', (l_labels, n_image)), ('g0', (n_image, m_gradients, s_manifold)), ) self.cvx_y = Variable( ('u', (n_image, l_labels)), ('v', (n_image, l_shm)), ('w', (m_gradients, n_image, d_image, s_manifold)), ('w0', (m_gradients, n_image, s_manifold)), ('misc', (n_image * m_gradients, )), ) p, g, q0, q1, p0, g0 = [ cvxVariable(*a['shape']) for a in self.cvx_x.vars() ] self.cvx_vars = p + sum(g, []) + [q0, q1, p0] + g0 self.cvx_obj = cvx.Maximize(-cvx.vec(f_flat).T * cvx.vec(cvx.diag(c['b']) * p0) - cvx.sum(q0)) div_op = sparse_div_op(imagedims) self.cvx_dual = True self.cvx_constr = [] # u_constr for i in range(n_image): for k in range(l_labels): self.cvx_constr.append( c['b'][k]*(q0[i] + p0[k,i] \ - cvxOp(div_op, p[k], i)) - q1[k,i] >= 0) # v_constr for i in range(n_image): for k in range(l_shm): Yk = cvx.vec(c['Y'][:, k]) self.cvx_constr.append(-Yk.T * q1[:, i] == 0) # w_constr for j in range(m_gradients): Aj = c['A'][j, :, :] Bj = c['B'][j, :, :] Pj = c['P'][j, :] for i in range(n_image): for t in range(d_image): for l in range(s_manifold): self.cvx_constr.append( Aj*g[i][j][l,t] == sum([Bj[l,m]*p[Pj[m]][t,i] \ for m in range(3)])) # w0_constr for j in range(m_gradients): Aj = c['A'][j, :, :] Bj = c['B'][j, :, :] Pj = c['P'][j, :] for i in range(n_image): self.cvx_constr.append(Aj * g0[i][j, :].T == Bj * p0[Pj, i]) # additional inequality constraints for i in range(n_image): for j in range(m_gradients): self.cvx_constr.append(cvx.norm(g[i][j], 2) <= c['lbd']) self.cvx_constr.append(cvx.norm(g0[i][j, :], 2) <= 1.0)