for i in range(m): a = np.random.randn(n) a = a / np.linalg.norm(a) bi = 1 + np.random.rand(1) A[i, :] = a b[i] = bi q = QCML() q.parse(''' dimensions m n variables x(n) r parameters A(m,n) b(m) maximize r A*x + r <= b ''') q.canonicalize() q.dims = {'m': m, 'n': n} q.codegen("python") socp_data = q.prob2socp(locals()) # stuffed variable size n = socp_data['G'].shape[1] ecos_sol = ecos.solve(**socp_data) socp_sol = ecos_sol['x'] prob_sol_x = q.socp2prob(ecos_sol['x'])['x'] prob_sol_r = q.socp2prob(ecos_sol['x'])['r']
# norm(x,y) applies norm across rows of the matrix [x y] norm(u,v) <= radii*c # rctheta is going to be a diagonal matrix # rctheta[i]*c[i] <= u[i] implemented with rctheta a diag matrix rctheta*c <= u """) # More natural formulation would be: # minimize 1/(sqrt(2)*noisesigma) * (data - (dictc*c + dictu(u + dictv*v)) + lambda'*c) # subject to # sqrt(u.^2 + v.^2) <= radii.*c # radii.*cos(theta) <= u raw_input("press ENTER to canonicalize....") p.canonicalize() raw_input("press ENTER to generate code....") if m and n: p.dims = {'m': m, 'n': n} p.codegen(args.codegen) raw_input("press ENTER for raw code....") p.printsource() #socp_data = p.prob2socp(params=locals()) #import ecos #sol = ecos.ecos(**socp_data) #my_vars = p.socp2prob(sol['x']) #pr.disable() #ps = pstats.Stats(pr) #ps.sort_stats('cumulative').print_stats(.5)
objective = [] for i in xrange(T): objective += ["square(norm(Q*x%i)) + square(norm(R*u%i))" % (i,i)] #objective += ["square(norm(Q*x%i))" % T] problem += ["minimize (1/2)*(" + ' + '.join(objective) + ")"] s = '\n'.join(map(lambda x:' ' + x, problem)) print s raw_input("press ENTER to parse....") p = QCML(debug=True) p.parse(s) raw_input("press ENTER to canonicalize....") p.canonicalize() raw_input("press ENTER to generate code....") p.dims = {'n': n, 'm': m} p.codegen("python") raw_input("press ENTER to solve with ECOS....") socp_data = p.prob2socp(params=locals()) import ecos sol = ecos.solve(**socp_data)