Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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'])
Ejemplo n.º 3
0
    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'])
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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)