Navigation Menu

Skip to content

Commit

Permalink
LinearConstraint -> Constraint, Constraint -> AbstractConstraint
Browse files Browse the repository at this point in the history
  • Loading branch information
slightlyoff committed Jun 29, 2012
1 parent 17f6ecc commit 7a8e1bd
Show file tree
Hide file tree
Showing 15 changed files with 192 additions and 193 deletions.
1 change: 1 addition & 0 deletions TODO
Expand Up @@ -8,3 +8,4 @@
- Define a JSON format for constraint loading
- Document API (after improving/fixing it)
- Expose Cassowary as a NodeJS module
- Improve the box model of panels.js to handle more real-world applications
2 changes: 1 addition & 1 deletion demos/css/canvas-renderer.html
Expand Up @@ -54,7 +54,7 @@
<script src="../../src/Point.js"></script>
<script src="../../src/LinearExpression.js"></script>
<script src="../../src/Constraint.js"></script>
<script src="../../src/LinearConstraint.js"></script>
<script src="../../src/Constraint.js"></script>
<script src="../../src/EditInfo.js"></script>
<script src="../../src/Tableau.js"></script>
<script src="../../src/SimplexSolver.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion demos/panels/cloudy.html
Expand Up @@ -27,7 +27,7 @@
<script defer="defer" src="../../src/Point.js"></script>
<script defer="defer" src="../../src/LinearExpression.js"></script>
<script defer="defer" src="../../src/Constraint.js"></script>
<script defer="defer" src="../../src/LinearConstraint.js"></script>
<script defer="defer" src="../../src/Constraint.js"></script>
<script defer="defer" src="../../src/EditInfo.js"></script>
<script defer="defer" src="../../src/Tableau.js"></script>
<script defer="defer" src="../../src/SimplexSolver.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion demos/panels/compat.html
Expand Up @@ -23,7 +23,7 @@
<script src="http://www.badros.com/greg/cassowary/js/ClPoint.js"></script>
<script src="http://www.badros.com/greg/cassowary/js/ClLinearExpression.js"></script>
<script src="http://www.badros.com/greg/cassowary/js/ClConstraint.js"></script>
<script src="http://www.badros.com/greg/cassowary/js/ClLinearConstraint.js"></script>
<script src="http://www.badros.com/greg/cassowary/js/ClConstraint.js"></script>
<script src="http://www.badros.com/greg/cassowary/js/ClEditInfo.js"></script>
<script src="http://www.badros.com/greg/cassowary/js/ClTableau.js"></script>
<script src="http://www.badros.com/greg/cassowary/js/ClSimplexSolver.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion demos/panels/panels.html
Expand Up @@ -23,7 +23,7 @@
<script defer="defer" src="../../src/Point.js"></script>
<script defer="defer" src="../../src/LinearExpression.js"></script>
<script defer="defer" src="../../src/Constraint.js"></script>
<script defer="defer" src="../../src/LinearConstraint.js"></script>
<script defer="defer" src="../../src/Constraint.js"></script>
<script defer="defer" src="../../src/EditInfo.js"></script>
<script defer="defer" src="../../src/Tableau.js"></script>
<script defer="defer" src="../../src/SimplexSolver.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion demos/panels/popup.html
Expand Up @@ -22,7 +22,7 @@
<script defer="defer" src="../../src/Point.js"></script>
<script defer="defer" src="../../src/LinearExpression.js"></script>
<script defer="defer" src="../../src/Constraint.js"></script>
<script defer="defer" src="../../src/LinearConstraint.js"></script>
<script defer="defer" src="../../src/Constraint.js"></script>
<script defer="defer" src="../../src/EditInfo.js"></script>
<script defer="defer" src="../../src/Tableau.js"></script>
<script defer="defer" src="../../src/SimplexSolver.js"></script>
Expand Down
2 changes: 1 addition & 1 deletion demos/quad/quaddemo.html
Expand Up @@ -66,7 +66,7 @@ <h3>By <a href="http://www.badros.com/greg">Greg J. Badros</a></h3>
<script src='../../src/Point.js'></script>
<script src='../../src/LinearExpression.js'></script>
<script src='../../src/Constraint.js'></script>
<script src='../../src/LinearConstraint.js'></script>
<script src='../../src/Constraint.js'></script>
<script src='../../src/EditInfo.js'></script>
<script src='../../src/Tableau.js'></script>
<script src='../../src/SimplexSolver.js'></script>
Expand Down
2 changes: 1 addition & 1 deletion demos/table/table.html
Expand Up @@ -12,7 +12,7 @@
<script src="../../src/Point.js"></script>
<script src="../../src/LinearExpression.js"></script>
<script src="../../src/Constraint.js"></script>
<script src="../../src/LinearConstraint.js"></script>
<script src="../../src/Constraint.js"></script>
<script src="../../src/EditInfo.js"></script>
<script src="../../src/Tableau.js"></script>
<script src="../../src/SimplexSolver.js"></script>
Expand Down
182 changes: 177 additions & 5 deletions src/Constraint.js
Expand Up @@ -7,7 +7,7 @@
(function(c) {
"use strict";

c.Constraint = c.inherit({
c.AbstractConstraint = c.inherit({
initialize: function(strength /*c.Strength*/, weight /*double*/) {
this.hash_code = c._inc();
this.strength = strength || c.Strength.required;
Expand All @@ -28,26 +28,198 @@ c.Constraint = c.inherit({
},
});

var ts = c.Constraint.prototype.toString;
var ts = c.AbstractConstraint.prototype.toString;

var EditOrStayCtor = function(clv /*c.Variable*/, strength /*c.Strength*/, weight /*double*/) {
c.Constraint.call(this, strength || c.Strength.strong, weight);
c.AbstractConstraint.call(this, strength || c.Strength.strong, weight);
this.variable = clv;
this.expression = new c.LinearExpression(clv, -1, clv.value());
};

c.EditConstraint = c.inherit({
extends: c.Constraint,
extends: c.AbstractConstraint,
initialize: function() { EditOrStayCtor.apply(this, arguments); },
isEditConstraint: true,
toString: function() { return "edit:" + ts.call(this); },
});

c.StayConstraint = c.inherit({
extends: c.Constraint,
extends: c.AbstractConstraint,
initialize: function() { EditOrStayCtor.apply(this, arguments); },
isStayConstraint: true,
toString: function() { return "stay:" + ts.call(this); },
});

c.Constraint = c.inherit({
extends: c.AbstractConstraint,
initialize: function(cle /*c.LinearExpression*/,
strength /*c.Strength*/,
weight /*double*/) {
c.AbstractConstraint.call(this, strength, weight);
this.expression = cle;
},
});

c.LinearInequality = c.inherit({
extends: c.Constraint,

_cloneOrNewCle: function(cle) {
// FIXME(D4): move somewhere else?
if (cle.clone) {
return cle.clone();
} else {
return new c.LinearExpression(cle);
}
},

initialize: function(a1, a2, a3, a4, a5) {
// FIXME(slightlyoff): what a disgusting mess. Should at least add docs.
// console.log("c.LinearInequality.initialize(", a1, a2, a3, a4, a5, ")");
//
// (cle || number), op, clv
var a1IsExp, a3IsExp, a1IsNum, a3IsNum, a1IsVar, a3IsVar;
a1IsExp = a1 instanceof c.LinearExpression;
a3IsExp = a3 instanceof c.LinearExpression;
a1IsVar = a1 instanceof c.AbstractVariable;
a3IsVar = a3 instanceof c.AbstractVariable;
a1IsNum = typeof(a1) == 'number';
a3IsNum = typeof(a3) == 'number';

if ((a1IsExp || a1IsNum) && a3IsVar) {
var cle = a1, op = a2, clv = a3, strength = a4, weight = a5;
c.Constraint.call(this, this._cloneOrNewCle(cle), strength, weight);
if (op == c.LEQ) {
this.expression.multiplyMe(-1);
this.expression.addVariable(clv);
} else if (op == c.GEQ) {
this.expression.addVariable(clv, -1);
} else {
throw new c.InternalError("Invalid operator in ClLinearInequality constructor");
}
// clv, op, (cle || number)
} else if (a1IsVar && (a3IsExp || a3IsNum)) {
var cle = a3, op = a2, clv = a1, strength = a4, weight = a5;
c.Constraint.call(this, this._cloneOrNewCle(cle), strength, weight);
if (op == c.GEQ) {
this.expression.multiplyMe(-1);
this.expression.addVariable(clv);
} else if (op == c.LEQ) {
this.expression.addVariable(clv, -1);
} else {
throw new c.InternalError("Invalid operator in ClLinearInequality constructor");
}
// cle, op, num
} else if (a1IsExp && a3IsNum) {
var cle1 = a1, op = a2, cle2 = a3, strength = a4, weight = a5;
c.Constraint.call(this, this._cloneOrNewCle(cle1), strength, weight);
if (op == c.LEQ) {
this.expression.multiplyMe(-1);
this.expression.addExpression(this._cloneOrNewCle(cle2));
} else if (op == c.GEQ) {
this.expression.addExpression(this._cloneOrNewCle(cle2), -1);
} else {
throw new c.InternalError("Invalid operator in ClLinearInequality constructor");
}
return this
// num, op, cle
} else if (a1IsNum && a3IsExp) {
var cle1 = a3, op = a2, cle2 = a1, strength = a4, weight = a5;
c.Constraint.call(this, this._cloneOrNewCle(cle1), strength, weight);
if (op == c.GEQ) {
this.expression.multiplyMe(-1);
this.expression.addExpression(this._cloneOrNewCle(cle2));
} else if (op == c.LEQ) {
this.expression.addExpression(this._cloneOrNewCle(cle2), -1);
} else {
throw new c.InternalError("Invalid operator in ClLinearInequality constructor");
}
return this
// cle op cle
} else if (a1IsExp && a3IsExp) {
var cle1 = a1, op = a2, cle2 = a3, strength = a4, weight = a5;
c.Constraint.call(this, this._cloneOrNewCle(cle2), strength, weight);
if (op == c.GEQ) {
this.expression.multiplyMe(-1);
this.expression.addExpression(this._cloneOrNewCle(cle1));
} else if (op == c.LEQ) {
this.expression.addExpression(this._cloneOrNewCle(cle1), -1);
} else {
throw new c.InternalError("Invalid operator in ClLinearInequality constructor");
}
// cle
} else if (a1IsExp) {
return c.Constraint.call(this, a1, a2, a3);
// >=
} else if (a2 == c.GEQ) {
c.Constraint.call(this, new c.LinearExpression(a3), a4, a5);
this.expression.multiplyMe(-1);
this.expression.addVariable(a1);
// <=
} else if (a2 == c.LEQ) {
c.Constraint.call(this, new c.LinearExpression(a3), a4, a5);
this.expression.addVariable(a1,-1);
// error
} else {
throw new c.InternalError("Invalid operator in ClLinearInequality constructor");
}
},

isInequality: true,

toString: function() {
// return "c.LinearInequality: " + this.hashCode();
return c.Constraint.prototype.toString.call(this) + " >= 0 ) id: " + this.hash_code;
},
});

var lc = c.Constraint;

c.LinearEquation = c.inherit({
extends: c.Constraint,
initialize: function(a1, a2, a3, a4) {
// FIXME(slightlyoff): this is just a huge mess.
if (a1 instanceof c.LinearExpression && !a2 || a2 instanceof c.Strength) {
lc.call(this, a1, a2, a3);
} else if ((a1 instanceof c.AbstractVariable) &&
(a2 instanceof c.LinearExpression)) {
var clv = a1, cle = a2, strength = a3, weight = a4;
lc.call(this, cle, strength, weight);
this.expression.addVariable(clv, -1);
} else if ((a1 instanceof c.AbstractVariable) &&
(typeof(a2) == 'number')) {
var clv = a1, val = a2, strength = a3, weight = a4;
lc.call(this, new c.LinearExpression(val), strength, weight);
this.expression.addVariable(clv, -1);
} else if ((a1 instanceof c.LinearExpression) &&
(a2 instanceof c.AbstractVariable)) {
var cle = a1, clv = a2, strength = a3, weight = a4;
lc.call(this, cle.clone(), strength, weight);
this.expression.addVariable(clv, -1);
} else if (((a1 instanceof c.LinearExpression) || (a1 instanceof c.AbstractVariable) ||
(typeof(a1) == 'number')) &&
((a2 instanceof c.LinearExpression) || (a2 instanceof c.AbstractVariable) ||
(typeof(a2) == 'number'))) {
if (a1 instanceof c.LinearExpression) {
a1 = a1.clone();
} else {
a1 = new c.LinearExpression(a1);
}
if (a2 instanceof c.LinearExpression) {
a2 = a2.clone();
} else {
a2 = new c.LinearExpression(a2);
}
lc.call(this, a1, a3, a4);
this.expression.addExpression(a2, -1);
} else {
throw "Bad initializer to ClLinearEquation";
}
c.Assert(this.strength instanceof c.Strength, "_strength not set");
},

toString: function() {
return lc.prototype.toString.call(this) + " = 0 )";
},
});

})(c);

0 comments on commit 7a8e1bd

Please sign in to comment.