| 1 | #!/usr/bin/env python |
|---|
| 2 | # |
|---|
| 3 | # Author: Patrick Hung (patrickh @caltech) |
|---|
| 4 | # Copyright (c) 1997-2016 California Institute of Technology. |
|---|
| 5 | # License: 3-clause BSD. The full license text is available at: |
|---|
| 6 | # - http://mmckerns.github.io/project/mystic/browser/mystic/LICENSE |
|---|
| 7 | """ |
|---|
| 8 | Solve the dual form of test_circle.py. |
|---|
| 9 | |
|---|
| 10 | Currently, it uses a package called "qld" that I wrote but not in |
|---|
| 11 | the repo. yet. It wraps IQP from bell-labs. (code not GPL and has export |
|---|
| 12 | restrictions.) |
|---|
| 13 | """ |
|---|
| 14 | |
|---|
| 15 | from numpy import * |
|---|
| 16 | import pylab |
|---|
| 17 | from test_circle import sparse_circle, sv, x0, y0, R0 |
|---|
| 18 | getpoints = sparse_circle.forward |
|---|
| 19 | import qld |
|---|
| 20 | |
|---|
| 21 | def getobjective(H,f, x): |
|---|
| 22 | return 0.5 * dot(dot(x,H),x) + dot(f,x) |
|---|
| 23 | |
|---|
| 24 | def chop(x): |
|---|
| 25 | if abs(x) > 1e-6: |
|---|
| 26 | return x |
|---|
| 27 | else: |
|---|
| 28 | return 0 |
|---|
| 29 | |
|---|
| 30 | def round(x): |
|---|
| 31 | return array([chop(y) for y in x]) |
|---|
| 32 | |
|---|
| 33 | |
|---|
| 34 | def plot(xy, sv, x0, y0, R0, center, R): |
|---|
| 35 | import pylab |
|---|
| 36 | pylab.plot(xy[:,0],xy[:,1],'k+') |
|---|
| 37 | pylab.plot(xy[sv,0],xy[sv,1],'ro') |
|---|
| 38 | theta = arange(0, 2*pi, 0.02) |
|---|
| 39 | pylab.plot([center[0]],[center[1]],'bo') |
|---|
| 40 | pylab.plot([xy[sv0,0], center[0]],[xy[sv0,1], center[1]],'r--') |
|---|
| 41 | pylab.plot(R0 * cos(theta)+x0, R0*sin(theta)+y0, 'r-',linewidth=2) |
|---|
| 42 | pylab.plot(R * cos(theta)+center[0], R*sin(theta)+center[1], 'b-',linewidth=2) |
|---|
| 43 | pylab.axis('equal') |
|---|
| 44 | pylab.show() |
|---|
| 45 | |
|---|
| 46 | |
|---|
| 47 | if __name__ == '__main__': |
|---|
| 48 | npt = 20 |
|---|
| 49 | from test_circle import xy |
|---|
| 50 | npt1 = xy.shape[0] |
|---|
| 51 | if npt is not npt1: |
|---|
| 52 | xy = getpoints((x0,y0,R0),npt) |
|---|
| 53 | else: |
|---|
| 54 | pass |
|---|
| 55 | Q = dot(xy, transpose(xy)) |
|---|
| 56 | f = -diag(Q)+10 |
|---|
| 57 | H = Q*2 |
|---|
| 58 | A = ones((1,npt)) |
|---|
| 59 | b = ones(1) |
|---|
| 60 | x = qld.quadprog2(H, f, None, None, A, b, zeros(npt), ones(npt)) |
|---|
| 61 | |
|---|
| 62 | center = dot(x,xy) |
|---|
| 63 | print "center: " , center |
|---|
| 64 | # find support vectors (find numpy way please) |
|---|
| 65 | |
|---|
| 66 | sv = [] |
|---|
| 67 | for i,v in enumerate(x): |
|---|
| 68 | if v > 0.001: sv.append(i) |
|---|
| 69 | sv0 = sv[0] |
|---|
| 70 | |
|---|
| 71 | print sv |
|---|
| 72 | R = linalg.norm(xy[sv0,:]-center) |
|---|
| 73 | |
|---|
| 74 | plot(xy, sv, x0, y0, R0, center, R) |
|---|
| 75 | |
|---|
| 76 | # $Id$ |
|---|
| 77 | # |
|---|