function foo() {var i; if (i > 10) return;} var ca, cb, cc; var NUM_POINTS = 50; var NUM_LEADERS = 15; var dot_radius = 5; var num_points_lp = 10; function rand_uniform() {return 2*Math.random() - 1;} function norm2(x, y) { return x*x + y*y;} function rand_gauss(std_dev) { var x,y,s=1.5; while (s>1) { x = rand_uniform(); y = rand_uniform(); s = norm2(x, y); } var ret = std_dev*x*Math.sqrt(-2*Math.log(s)/s); return ret; } function create_vline(circ, i) { var ret = document.createElementNS("http://www.w3.org/2000/svg", "line"); ret.y1.baseVal.value = ret.y2.baseVal.value = circ.cy.baseVal.value; ret.x1.baseVal.value = ret.x2.baseVal.value = circ.cx.baseVal.value; ret.setAttribute("id", vl_id(i)); ret.setAttribute("style", "fill:black; stroke:black; stroke-width:2"); return ret; } function createCircleGauss(i, R) { var x = Math.random()*(R.width.baseVal.value-4*dot_radius) + R.x.baseVal.value + 2*dot_radius; var h = R.height.baseVal.value; var y_inc = h; var offset = (x - R.x.baseVal.value)/R.width.baseVal.value*h/8; while (y_inc > h/2 || y_inc < -h/2) y_inc = rand_gauss(h/20) - offset; var y = R.y.baseVal.value + h/2 + y_inc; var circle = document.createElementNS("http://www.w3.org/2000/svg", "circle"); circle.setAttribute( 'id', circ_id(i)); circle.setAttribute( 'cx', x ); circle.setAttribute( 'cy', y ); circle.setAttribute( 'r', dot_radius ); last_circle = i; return circle; } function distsqr(jx, jy, ix, iy) { return (ix-jx)*(ix-jx) + (iy-jy)*(iy-jy); } var fit_line_slope = 0.0; var fit_line_inter = 0.0; var cp_x = 0.0; var cp_y = 0.0; function l1_dist_tot_4arg(slope, inter, xs, ys, n) { var dist = 0.0; for (var i=0; i 0) { grad.slope += x; grad.inter += 1; } else { grad.slope -= x; grad.inter -= 1; } } function l1_gradient(si, ret) { ret.slope = ret.inter = 0; for (var i=0; i rr) circi.setAttribute("style", "fill:none; stroke:lightgreen; stroke-width:3pt;"); else circi.setAttribute("style", "fill:none; stroke:none;"); circi.ownerSVGElement.unsuspendRedraw(gid2); circi.ownerSVGElement.forceRedraw(); } group.ownerSVGElement.unsuspendRedraw(gid); group.ownerSVGElement.forceRedraw(); } } function update_i(T, q_name, circ_num, x, y) { var circ = document.getElementById(q_name); var xx = T.getAttribute(x)*1.0; var yy = T.getAttribute(y)*1.0; var query_t = document.getElementById(circ_id(circ_num)); circ.cx.baseVal.value = xx; circ.cy.baseVal.value = yy; circ.r.baseVal.value = Math.sqrt(distsqrC(circ, query_t)); } function distsqrC(ca, cb) { return distsqr(ca.cx.baseVal.value, ca.cy.baseVal.value, cb.cx.baseVal.value, cb.cy.baseVal.value); } function sb_setHighlight(leader_num, col) { for (var i=NUM_LEADERS; i < NUM_POINTS; i++) { var j = start_sb_circles + i; var circ = document.getElementById(circ_id(j)); if (circ.className.baseVal.value!=leader_num) continue; circ.setAttribute("style", "fill:magenta"); } } var Ownership = new Array(); function sb_mouseover() { var tid = this.getAttribute("id"); for (var i=NUM_LEADERS; i < NUM_POINTS; i++) { var j = start_sb_circles+i; if (Ownership[i].match(tid)) { var circi = document.getElementById(circ_id(j)); circi.setAttribute("style", "fill:magenta"); } } // var circi=document.getElementById(tid+"_out"); // var gid = circi.ownerSVGElement.suspendRedraw(1000); // circi.setAttribute("style", "stroke:lightgreen; fill:none; fill-opacity:0.1"); // circi.ownerSVGElement.unsuspendRedraw(gid); } function sb_mouseout() { var tid = this.getAttribute("id"); for (var i=NUM_LEADERS; i < NUM_POINTS; i++) { var j = start_sb_circles+i; if (Ownership[i].match(tid)) { var circi = document.getElementById(circ_id(j)); circi.setAttribute("style", "fill:black"); } } // var circi=document.getElementById(tid+"_out"); // var gid = circi.ownerSVGElement.suspendRedraw(1000); // circi.setAttribute("style", "stroke:none; fill:none;"); // var foo = circi.r.baseVal.value; // circi.r.baseVal.value = 0; // circi.r.baseVal.value = foo; // circi.ownerSVGElement.unsuspendRedraw(gid); } function nearest_leader(start_circ, num_leaders, circ, return_leader) { var min_dist = 1000000; var min_i = -1; for (var i=0; i < num_leaders; i++) { var j = start_circ + i; var ci = document.getElementById(circ_id(j)); var dist = distsqrC(ci, circ); if (dist < min_dist) { min_dist = dist; min_i = i; } } if (return_leader) return min_i; else return min_dist; } function circ_id(i) {return "circle_"+i ;} function createCircleCirc(i, C) { var cx = C.cx.baseVal.value; var cy = C.cy.baseVal.value; var r = C.r.baseVal.value; var x,y,s=1.5; while (s>1) { x = rand_uniform(); y = rand_uniform(); s = norm2(x, y); } x = x*r + cx; y = y*r + cy; var circle = document.createElementNS("http://www.w3.org/2000/svg", "circle"); circle.setAttribute( 'cx', x ); circle.setAttribute( 'cy', y ); circle.setAttribute( 'r', dot_radius ); last_circle = i; return circle; } var num_points_coreset = 25; function vl_id(j) {return "vl_" + j; } function pic_init() { var canvas = document.getElementById("coreset"); var group = document.createElementNS("http://www.w3.org/2000/svg", "group"); canvas.appendChild(group); var coreset_circ = document.getElementById("coreset_big_circ"); for (var i = 0; i < num_points_coreset; i++) group.appendChild(createCircleCirc(i, coreset_circ)); make_arrows_both("fit_line", "canvas_regression"); make_arrows_both("l2_fit_line", "canvas_regression2"); make_arrows_both("l1_fit_line", "canvas_regression2"); make_arrows_both("l1_fit_line2", "canvas_regression3"); var c=document.getElementById("circ_go"); c.addEventListener("mousedown", go_mousedown, false); c = document.getElementById("circ_step"); c.addEventListener("mousedown", step_mousedown, false); c = document.getElementById("circ_stop"); c.addEventListener("mousedown", stop_mousedown, false); } var slidenum = 1; var max_slides = 20; var regression1_init_called = 0; function regression1_init() { if (regression1_init_called) return; regression1_init_called = 1; var canvas = document.getElementById("canvas_regression"); var group = document.createElementNS("http://www.w3.org/2000/svg", "group"); var vlines = document.createElementNS("http://www.w3.org/2000/svg", "group"); vlines.setAttribute('id', "vlines"); canvas.appendChild(group); canvas.appendChild(vlines); for (var i = 0; i < num_points_lp; i++) { var c = createCircleGauss(i, canvas); group.appendChild(c); var vl = create_vline(c, i); vlines.appendChild(vl); } } var regression2_init_called = 0; function regression_n_init(canvas_id, xs, ys, do_l2) { var canvas = document.getElementById(canvas_id); var group = document.createElementNS("http://www.w3.org/2000/svg", "group"); canvas.appendChild(group); for (var i = 0; i < num_points_lp; i++) { var c = createCircleGauss(i, canvas); xs[i] = c.cx.baseVal.value; ys[i] = c.cy.baseVal.value; group.appendChild(c); } if (do_l2==1) init_l2(); } function regression2_init() {regression_n_init("canvas_regression2", xs, ys, 1);} var xs3 = new Array(); var ys3 = new Array(); function regression3_init() {regression_n_init("canvas_regression3", xs3, ys3, 0);} var lp_init_called = 0; function lp_init() { if (lp_init_called) return; lp_init_called = 1; var kdr=document.getElementById("kd-rect"); var gid = kdr.ownerSVGElement.suspendRedraw(1000); var canvas = document.getElementById("canvaskd"); var group = document.createElementNS("http://www.w3.org/2000/svg", "group"); canvas.appendChild(group); for (var i = 0; i < NUM_POINTS; i++) group.appendChild(createCircleGauss(i, kdr)); kdr.ownerSVGElement.unsuspendRedraw(gid); kdr.ownerSVGElement.forceRedraw(); } var sb_init_called = 0; function sb_init() { if (sb_init_called) return; sb_init_called = 1; var canvas = document.getElementById("canvas_sb"); var group = document.getElementById("group_sb"); canvas.appendChild(group); var sbr = document.getElementById("sb-rect"); var gid = sbr.ownerSVGElement.suspendRedraw(1000); start_sb_circles = last_circle+1; for (var i = 0; i < NUM_POINTS; i++) group.appendChild(createCircle(start_sb_circles+i, sbr)); for (var i=0; i < NUM_LEADERS; i++) { var j = start_sb_circles + i; var circ = document.getElementById(circ_id(j)); circ.setAttribute("style", "stroke: red; fill:red;"); var circi = document.createElementNS("http://www.w3.org/2000/svg", "circle"); circi.cx.baseVal.value = circ.cx.baseVal.value; circi.cy.baseVal.value = circ.cy.baseVal.value; circi.r.baseVal.value = 0; circi.setAttribute('id', circ_id(j)+"_out"); circi.setAttribute('style', "fill:none; stroke:none;"); group.appendChild(circi); circ.addEventListener("mouseover", sb_mouseover, false); circ.addEventListener("mouseout", sb_mouseout, false); } for (var i=NUM_LEADERS; i < NUM_POINTS; i++) { var j = start_sb_circles + i; var circ = document.getElementById(circ_id(j)); var g = nearest_leader(start_sb_circles, NUM_LEADERS, circ, 1); var gp = start_sb_circles+g; Ownership[i] = circ_id(gp); var circi = document.getElementById(circ_id(gp)+"_out"); var rr = circi.r.baseVal.value; var r2 = Math.sqrt(distsqrC(circi, circ)); if (rr < r2) circi.r.baseVal.value = r2; } sbr.ownerSVGElement.unsuspendRedraw(gid); sbr.ownerSVGElement.forceRedraw(); } var sb2_init_called = 0; function sb2_init() { if (sb2_init_called) return; sb2_init_called = 1; var canvas = document.getElementById("canvas_sb2"); var group = document.getElementById("group_sb2"); canvas.appendChild(group); var sbr = document.getElementById("sb-rect2"); var gid = sbr.ownerSVGElement.suspendRedraw(1000); start_sb_circles2 = last_circle+1; for (var i=0; i < NUM_POINTS; i++) { var circi = createCircle(start_sb_circles2+i, sbr); circi.setAttribute("class", "sb_uninserted"); group.appendChild(circi); } var arrows = document.getElementById("sb_arrows"); canvas.appendChild(arrows); tot_arrows = 0; current_set = 0; var c=document.getElementById("circ_go"); c.addEventListener("mousedown", go_mousedown, false); c = document.getElementById("circ_step"); c.addEventListener("mousedown", step_mousedown, false); c = document.getElementById("circ_stop"); c.addEventListener("mousedown", stop_mousedown, false); sbr.ownerSVGElement.unsuspendRedraw(gid); sbr.ownerSVGElement.forceRedraw(); } function go_mousedown(evt) {start_animation(); } function step_mousedown(evt){one_step();} function stop_mousedown(evt){stop_animation();} function re_init() { need_reset = 0; current_set = 0; tot_arrows = 0; var sbr = document.getElementById("sb-rect2"); var arrows = document.getElementById("sb_arrows"); var kids = arrows.childNodes; var numkids = kids.length; var gid = sbr.ownerSVGElement.suspendRedraw(1000); for (var i = 0; i < numkids; i++) { arrows.removeChild(kids[0]); } sbr.setAttribute("style", "fill:white;"); for (var i=0; i < NUM_POINTS; i++) { var circ = document.getElementById(circ_id(start_sb_circles2+i)); circ.setAttribute("class", "sb_uninserted"); circ.cx.baseVal.value = Math.random()*sbr.width.baseVal.value + sbr.x.baseVal.value; circ.cy.baseVal.value = Math.random()*sbr.height.baseVal.value + sbr.y.baseVal.value; } sbr.ownerSVGElement.unsuspendRedraw(gid); sbr.setAttribute("style", "fill:none;"); } var last_circle; var start_sb_circles; function createCircle(i, R) { var x = Math.random()*R.width.baseVal.value + R.x.baseVal.value; var y = Math.random()*R.height.baseVal.value + R.y.baseVal.value; var circle = document.createElementNS("http://www.w3.org/2000/svg", "circle"); circle.setAttribute( 'id', circ_id(i)); circle.setAttribute( 'cx', x ); circle.setAttribute( 'cy', y ); circle.setAttribute( 'r', dot_radius ); last_circle = i; return circle; } var anim_running = 0; var adding_point = 1; var need_reset = 0; var got_to_done = 0; function rand_uniform() {return 2*Math.random() - 1;} function norm2(x, y) { return x*x + y*y;} function rand_gauss(std_dev) { var x,y,s=1.5; while (s>1) { x = rand_uniform(); y = rand_uniform(); s = norm2(x, y); } var ret = std_dev*x*Math.sqrt(-2*Math.log(s)/s); return ret; } function start_animation() { if (need_reset) re_init(); animate(); } function stop_animation() { if (!anim_running) return; clearTimeout(anim_running); anim_running = 0; need_reset = 1; } function animate() { if (!one_step()) anim_running = setTimeout("animate()",30); else need_reset = 1; } var step = 0; var inserting = 0; var num_iters = 0; var max_iters = 10; function sb2_circ(i) { return document.getElementById(circ_id(start_sb_circles2+i)); } var Ownership2 = new Array(); var owner_dist = new Array(); function arrow_id(a,b) {return "arrow " + a + ":" + b;} var tot_arrows; function arrow_l_id(t, lab, line_id) {return "arrow_" + t + "_" + line_id + "_" + lab;} function make_arrow_line(group, line_id, lab, xo, yo, xi, yi) { var did = Math.sqrt(distsqr(xo, yo, xi, yi)); var xd = dot_radius*(xo - xi)/did; var yd = dot_radius*(yo - yi)/did; var ta = document.createElementNS("http://www.w3.org/2000/svg", "line"); ta.x1.baseVal.value = xi; ta.y1.baseVal.value = yi; ta.x2.baseVal.value = xi + 2*xd - yd; ta.y2.baseVal.value = yi + 2*yd + xd; ta.setAttribute('style', 'stroke:black; fill:none; stroke-width:2'); ta.setAttribute("id", arrow_l_id("a", lab, line_id)); group.appendChild(ta); var tb = document.createElementNS("http://www.w3.org/2000/svg", "line"); tb.x1.baseVal.value = xi; tb.y1.baseVal.value = yi; tb.x2.baseVal.value = xi + 2*xd + yd; tb.y2.baseVal.value = yi + 2*yd - xd; tb.setAttribute('style', 'stroke:black; fill:none; stroke-width:2'); tb.setAttribute("id", arrow_l_id("b", lab, line_id)); group.appendChild(tb); } function make_arrows_both(line_id, canvas_id) { var ll = document.getElementById(line_id); var xi = ll.x1.baseVal.value; var yi = ll.y1.baseVal.value; var xo = ll.x2.baseVal.value; var yo = ll.y2.baseVal.value; var group = document.createElementNS("http://www.w3.org/2000/svg", "group"); group.setAttribute("id", "g__arrows_" + line_id); var canvas = document.getElementById(canvas_id); canvas.appendChild(group); make_arrow_line(group, line_id, "one", xo, yo, xi, yi); make_arrow_line(group, line_id, "other", xi, yi, xo, yo); } function adjust_arrow_line(line_id, lab, xo, yo, xi, yi) { var did = Math.sqrt(distsqr(xo, yo, xi, yi)); var xd = dot_radius*(xo - xi)/did; var yd = dot_radius*(yo - yi)/did; var ta = document.getElementById(arrow_l_id("a", lab, line_id)); ta.x1.baseVal.value = xi; ta.y1.baseVal.value = yi; ta.x2.baseVal.value = xi + 2*xd - yd; ta.y2.baseVal.value = yi + 2*yd + xd; var tb = document.getElementById(arrow_l_id("b", lab, line_id)); tb.x1.baseVal.value = xi; tb.y1.baseVal.value = yi; tb.x2.baseVal.value = xi + 2*xd + yd; tb.y2.baseVal.value = yi + 2*yd - xd; } function adjust_arrows_both(line_id) { var ll = document.getElementById(line_id); var xi = ll.x1.baseVal.value; var yi = ll.y1.baseVal.value; var xo = ll.x2.baseVal.value; var yo = ll.y2.baseVal.value; // var go = document.getElementById("g__arrows_" + line_id); // var gid = go.ownerSVGElement.suspendRedraw(1000); adjust_arrow_line(line_id, "one", xo, yo, xi, yi); adjust_arrow_line(line_id, "other", xi, yi, xo, yo); // go.ownerSVGElement.unsuspendRedraw(gid); // go.ownerSVGElement.forceRedraw(); } function make_arrow(circ_out, circ_in) { tot_arrows++; var co = sb2_circ(circ_out); var ci = sb2_circ(circ_in); var go = document.createElementNS( "http://www.w3.org/2000/svg", "group"); go.setAttribute("id", arrow_id(circ_in, circ_out)); var arrows = document.getElementById("sb_arrows"); arrows.appendChild(go); var xo = co.cx.baseVal.value; var yo = co.cy.baseVal.value; var xi = ci.cx.baseVal.value; var yi = ci.cy.baseVal.value; var did = Math.sqrt(distsqrC(co, ci)); var xd = dot_radius*(xo - xi)/did; var yd = dot_radius*(yo - yi)/did; xo -= xd; xi += xd; yo -= yd; yi += yd; var lin = document.createElementNS("http://www.w3.org/2000/svg", "line"); lin.x1.baseVal.value = xo; lin.y1.baseVal.value = yo; lin.x2.baseVal.value = xi; lin.y2.baseVal.value= yi; lin.setAttribute('style', 'stroke:black; fill:none; stroke-width:2'); go.appendChild(lin); var xit = xi + xd; var yit = yi + yd; var xit2 = xit + xd*0.2 - yd*0.2; var yit2 = yit + xd*0.2 + xd*0.2; var ta = document.createElementNS("http://www.w3.org/2000/svg", "line"); ta.x1.baseVal.value = xi; ta.y1.baseVal.value = yi; ta.x2.baseVal.value = xi + 2*xd - yd; ta.y2.baseVal.value = yi + 2*yd + xd; ta.setAttribute('style', 'stroke:black; fill:none; stroke-width:2'); go.appendChild(ta); var tb = document.createElementNS("http://www.w3.org/2000/svg", "line"); tb.x1.baseVal.value = xi; tb.y1.baseVal.value = yi; tb.x2.baseVal.value = xi + 2*xd + yd; tb.y2.baseVal.value = yi + 2*yd - xd; tb.setAttribute('style', 'stroke:black; fill:none; stroke-width:2'); go.appendChild(tb); } function clear_highlights() { for (var i=0; i < NUM_POINTS; i++) { var c = sb2_circ(i); var cc = c.getAttribute("class"); if (cc.match("sb_taken")) c.setAttribute("class", "sb_uninserted"); if (cc.match("sb_touched")) c.setAttribute("class", "sb_inserted"); } } function setLabel(lab) { var alr = document.getElementById("anim_label_rect"); alr.setAttribute("style", "fill:white;"); var anim_lab = document.getElementById("anim_label"); var foo = document.createTextNode(lab); anim_lab.replaceChild(foo, anim_lab.firstChild); } var seens = new Array(); var old_ave = 0; function one_step() { if (need_reset) re_init(); // var group = document.getElementById("canvas_regression3"); // var gid = group.ownerSVGElement.suspendRedraw(1000); if (num_iters >= max_iters) { // group.ownerSVGElement.unsuspendRedraw(gid); return 1; } one_step_subgradient(); // group.ownerSVGElement.unsuspendRedraw(gid); return 0; }