From 37e6c48698dfdec75d03b8b1a0773ae67e293a91 Mon Sep 17 00:00:00 2001 From: Val Erastov Date: Mon, 13 Oct 2014 00:34:14 -0700 Subject: [PATCH] implement lock alternative locking mechanism --- web/app/constr/constraints.js | 27 +++++++++++++++++++++++++++ web/app/constr/solver.js | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/web/app/constr/constraints.js b/web/app/constr/constraints.js index 88553313..e49f1d1f 100644 --- a/web/app/constr/constraints.js +++ b/web/app/constr/constraints.js @@ -34,6 +34,33 @@ TCAD.constraints.Equal = function(params) { }; +TCAD.constraints.ConstantWrapper = function(constr, mask) { + + this.params = []; + this.grad = []; + + for (j = 0; j < constr.params.length; j++) { + if (!mask[j]) { + this.params.push(constr.params[j]); + } + this.grad.push(0); + } + + this.error = function() { + return constr.error(); + } + + this.gradient = function(out) { + constr.gradient(this.grad); + var jj = 0; + for (j = 0; j < mask.length; j++) { + if (!mask[j]) { + out[jj ++] = this.grad[j]; + } + } + } +}; + TCAD.constraints.EqualsTo = function(params, value) { this.params = params; diff --git a/web/app/constr/solver.js b/web/app/constr/solver.js index 19adbe12..f7346bd6 100644 --- a/web/app/constr/solver.js +++ b/web/app/constr/solver.js @@ -87,13 +87,42 @@ TCAD.parametric.System.prototype.getValues = function() { return values; }; +TCAD.parametric.lock1 = function(constrs, locked) { + + var lockedSet = {}; + for (var i = 0; i < locked.length; i++) { + lockedSet[locked[i].id] = true; + } + + for (var i = 0; i < constrs.length; i++) { + var c = constrs[i]; + var mask = []; + var needWrap = false; + for (var j = 0; j < c.params.length; j++) { + var param = c.params[j]; + mask[j] = lockedSet[param.id] === true; + needWrap = needWrap || mask[j]; + } + if (needWrap) { + var wrapper = new TCAD.constraints.ConstantWrapper(c, mask); + constrs[i] = wrapper; + } + } +}; + +TCAD.parametric.lock2 = function(constrs, locked) { + for (var i = 0; i < locked.length; ++i) { + constrs.push(new TCAD.constraints.EqualsTo([locked[i]], locked[i].get())); + } +}; + TCAD.parametric.solve = function(constrs, locked, fineLevel) { if (constrs.length == 0) return; - for (var i = 0; i < locked.length; ++i) { - constrs.push(new TCAD.constraints.EqualsTo([locked[i]], locked[i].get())); - } + +// this.lock1(constrs, locked); + this.lock2(constrs, locked); var sys = new TCAD.parametric.System(constrs);