From 9a0e2db88529ff0388eb9a9f2b6398faae407406 Mon Sep 17 00:00:00 2001 From: Val Erastov Date: Wed, 29 Oct 2014 18:09:58 -0700 Subject: [PATCH] split system by two steps --- web/app/constr/solver.js | 86 ++++++++++++++++++++++------------------ web/app/parametric.js | 50 +++++++++++++---------- 2 files changed, 77 insertions(+), 59 deletions(-) diff --git a/web/app/constr/solver.js b/web/app/constr/solver.js index aafb7371..b39204e8 100644 --- a/web/app/constr/solver.js +++ b/web/app/constr/solver.js @@ -203,7 +203,7 @@ TCAD.parametric.lock2 = function(constrs, locked) { } }; -TCAD.parametric.solve = function(constrs, locked, fineLevel, alg) { +TCAD.parametric.prepare = function(constrs, locked, alg) { if (constrs.length == 0) return; @@ -233,47 +233,57 @@ TCAD.parametric.solve = function(constrs, locked, fineLevel, alg) { sys.setParams(point); return sys.makeJacobian(); }; - alg = 5; - if (alg > 0) { - switch (alg) { + alg = 5; + + function solve(fineLevel) { + if (alg > 0) { + switch (alg) { + case 1: + var res = TCAD.math.solve_BFGS(sys, 1e-4, 1e-4); + console.log(res); + break; + case 2: + TCAD.math.solve_TR(sys); + break; + case 3: + TCAD.math.noptim(sys); + break; + case 4: + TCAD.math.solve_UNCMIN(sys); + break; + case 5: + optim.dog_leg(sys); + break; + } + return sys; + } + + var opt = new LMOptimizer(sys.getParams(), arr(sys.constraints.length), model, jacobian); + var eps; + switch (fineLevel) { case 1: - var res = TCAD.math.solve_BFGS(sys, 1e-4, 1e-4); - console.log(res); + eps = 0.01; + opt.init0(eps, eps, eps); break; case 2: - TCAD.math.solve_TR(sys); - break; - case 3: - TCAD.math.noptim(sys); - break; - case 4: - TCAD.math.solve_UNCMIN(sys); - break; - case 5: - optim.dog_leg(sys); + eps = 0.1; + opt.init0(eps, eps, eps); break; + default: + eps = 0.00000001; + opt.init0(eps, eps, eps); } - return sys; + + var res = opt.doOptimize(); + sys.setParams(res[0]); + // console.log("Solved with error: " + sys.error()); + return res; } - - var opt = new LMOptimizer(sys.getParams(), arr(sys.constraints.length), model, jacobian); - var eps; - switch (fineLevel) { - case 1: - eps = 0.01; - opt.init0(eps, eps, eps); - break; - case 2: - eps = 0.1; - opt.init0(eps, eps, eps); - break; - default: - eps = 0.00000001; - opt.init0(eps, eps, eps); - } - - var res = opt.doOptimize(); - sys.setParams(res[0]); -// console.log("Solved with error: " + sys.error()); - return sys; + var systemSolver = { + system : sys, + solveSystem : solve + }; + + return systemSolver; + }; diff --git a/web/app/parametric.js b/web/app/parametric.js index c7b9bba5..16c1eabb 100644 --- a/web/app/parametric.js +++ b/web/app/parametric.js @@ -226,8 +226,12 @@ TCAD.TWO.ParametricManager.prototype.solve1 = function(locked, onSolved) { xhr.send(JSON.stringify(request)); }; - TCAD.TWO.ParametricManager.prototype.solve = function(locked, fineLevel, alg) { + this.prepare(locked, alg).solve(fineLevel); +}; + +TCAD.TWO.ParametricManager.prototype.prepare = function(locked, alg) { + var pdict = {}; var params; var _constrs = []; @@ -273,28 +277,32 @@ TCAD.TWO.ParametricManager.prototype.solve = function(locked, fineLevel, alg) { } } - TCAD.parametric.solve(_constrs, _locked, fineLevel, alg); - - for (p in pdict) { - _p = pdict[p]; - _p._backingParam.set(_p.get()); - } - - - //Make sure all equal constraints are equal - for (i = 0; i < equals.length; ++i) { - var ec = equals[i]; - var master = ec.p1; - var slave = ec.p2; - if (lockedIds[master.id] === true) { - master = ec.p2; - slave = ec.p1; - if (lockedIds[master.id] === true) { - continue; - } + var solver = TCAD.parametric.prepare(_constrs, _locked, alg); + function solve(fineLevel) { + solver.solveSystem(fineLevel); + for (p in pdict) { + _p = pdict[p]; + _p._backingParam.set(_p.get()); + } + + + //Make sure all equal constraints are equal + for (i = 0; i < equals.length; ++i) { + var ec = equals[i]; + var master = ec.p1; + var slave = ec.p2; + if (lockedIds[master.id] === true) { + master = ec.p2; + slave = ec.p1; + if (lockedIds[master.id] === true) { + continue; + } + } + slave.set( master.get() ); } - slave.set( master.get() ); } + solver.solve = solve; + return solver; }; TCAD.TWO.Constraints.Equal = function(p1, p2) {