Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions src/main/java/org/klomp/cassowary/ClEditInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
* smalltalk version of the code.
*/
class ClEditInfo {
public ClEditInfo(ClConstraint cn_, ClSlackVariable eplus_, ClSlackVariable eminus_, double prevEditConstant_, int i_) {
public ClEditInfo(ClConstraint cn_, ClAbstractVariable eplus_, ClAbstractVariable eminus_, double prevEditConstant_, int i_) {
cn = cn_;
clvEditPlus = eplus_;
clvEditMinus = eminus_;
Expand All @@ -38,11 +38,11 @@ public ClConstraint Constraint() {
return cn;
}

public ClSlackVariable ClvEditPlus() {
public ClAbstractVariable ClvEditPlus() {
return clvEditPlus;
}

public ClSlackVariable ClvEditMinus() {
public ClAbstractVariable ClvEditMinus() {
return clvEditMinus;
}

Expand All @@ -55,8 +55,8 @@ public void SetPrevEditConstant(double prevEditConstant_) {
}

private ClConstraint cn;
private ClSlackVariable clvEditPlus;
private ClSlackVariable clvEditMinus;
private ClAbstractVariable clvEditPlus;
private ClAbstractVariable clvEditMinus;
private double prevEditConstant;
private int i;

Expand Down
20 changes: 13 additions & 7 deletions src/main/java/org/klomp/cassowary/ClSimplexSolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ public final ClSimplexSolver addConstraint(ClConstraint cn) throws RequiredConst
if (fTraceOn)
fnenterprint("addConstraint: " + cn);

List<ClSlackVariable> eplus_eminus = new ArrayList<ClSlackVariable>(2);
List<ClAbstractVariable> eplus_eminus = new ArrayList<ClAbstractVariable>(2);
ClDouble prevEConstant = new ClDouble();
ClLinearExpression expr = newExpression(cn, eplus_eminus, prevEConstant);
boolean fAddedOkDirectly = false;
Expand All @@ -150,8 +150,8 @@ public final ClSimplexSolver addConstraint(ClConstraint cn) throws RequiredConst
if (cn.isEditConstraint()) {
int i = _editVarMap.size();
ClEditConstraint cnEdit = (ClEditConstraint) cn;
ClSlackVariable clvEplus = eplus_eminus.get(0);
ClSlackVariable clvEminus = eplus_eminus.get(1);
ClAbstractVariable clvEplus = eplus_eminus.get(0);
ClAbstractVariable clvEminus = eplus_eminus.get(1);
_editVarMap.put(cnEdit.variable(), new ClEditInfo(cnEdit, clvEplus, clvEminus, prevEConstant.doubleValue(), i));
}

Expand Down Expand Up @@ -456,7 +456,7 @@ private final ClSimplexSolver removeConstraintInternal(ClConstraint cn, ClAbstra
ClEditConstraint cnEdit = (ClEditConstraint) cn;
ClVariable clv = cnEdit.variable();
ClEditInfo cei = _editVarMap.get(clv);
ClSlackVariable clvEditMinus = cei.ClvEditMinus();
ClAbstractVariable clvEditMinus = cei.ClvEditMinus();
// ClSlackVariable clvEditPlus = cei.ClvEditPlus();
// the clvEditPlus is a marker variable that is removed elsewhere
removeColumn(clvEditMinus);
Expand Down Expand Up @@ -534,8 +534,8 @@ public final ClSimplexSolver suggestValue(ClVariable v, double x) throws CLExcep
System.err.println("suggestValue for variable " + v + ", but var is not an edit variable\n");
throw new CLException();
}
ClSlackVariable clvEditPlus = cei.ClvEditPlus();
ClSlackVariable clvEditMinus = cei.ClvEditMinus();
ClAbstractVariable clvEditPlus = cei.ClvEditPlus();
ClAbstractVariable clvEditMinus = cei.ClvEditMinus();
double delta = x - cei.PrevEditConstant();
cei.SetPrevEditConstant(x);
deltaEditConstant(delta, clvEditPlus, clvEditMinus);
Expand Down Expand Up @@ -902,7 +902,7 @@ protected final void dualOptimize() throws CLInternalError {
// Normalize if necessary so that the constant is non-negative. If
// the constraint is non-required give its error variables an
// appropriate weight in the objective function.
protected final ClLinearExpression newExpression(ClConstraint cn, List<ClSlackVariable> eplus_eminus, ClDouble prevEConstant) {
protected final ClLinearExpression newExpression(ClConstraint cn, List<ClAbstractVariable> eplus_eminus, ClDouble prevEConstant) {
if (fTraceOn)
fnenterprint("newExpression: " + cn);
if (fTraceOn)
Expand All @@ -917,6 +917,7 @@ protected final ClLinearExpression newExpression(ClConstraint cn, List<ClSlackVa
ClSlackVariable eminus = new ClSlackVariable();
ClSlackVariable eplus = new ClSlackVariable();
final Map<ClAbstractVariable, ClDouble> cnTerms = cnExpr.terms();

for (Map.Entry<ClAbstractVariable, ClDouble> entry : cnTerms.entrySet()) {
final ClAbstractVariable v = entry.getKey();
double c = entry.getValue().doubleValue();
Expand Down Expand Up @@ -947,6 +948,11 @@ protected final ClLinearExpression newExpression(ClConstraint cn, List<ClSlackVa
if (cn.isRequired()) {
++_dummyCounter;
ClDummyVariable dummyVar = new ClDummyVariable(_dummyCounter, "d");

eplus_eminus.add(dummyVar);
eplus_eminus.add(dummyVar);
prevEConstant.setValue(cnExpr.constant());

expr.setVariable(dummyVar, 1.0);
_markerVars.put(cn, dummyVar);
if (fTraceOn)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public ClLinearInequality(ClLinearExpression cle) {
super(cle);
}


public ClLinearInequality(ClVariable clv1, byte op_enum, ClVariable clv2, ClStrength strength, double weight)
throws CLInternalError {
super(new ClLinearExpression(clv2), strength, weight);
Expand Down
37 changes: 37 additions & 0 deletions src/test/java/org/klomp/cassowary/CassowaryTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,43 @@ public void multiedit() throws CLInternalError, RequiredConstraintFailureExcepti
assertEquals(40, h.getValue(), EPSILON);
}

@Test
public void multieditRequired() throws CLInternalError, RequiredConstraintFailureException, CLException {
ClVariable x = new ClVariable("x");
ClVariable y = new ClVariable("y");
ClVariable w = new ClVariable("w");
ClVariable h = new ClVariable("h");
ClSimplexSolver solver = new ClSimplexSolver();

solver.addStay(x).addStay(y).addStay(w).addStay(h);

solver.addEditVar(x, ClStrength.required).addEditVar(y, ClStrength.required).beginEdit();

solver.suggestValue(x, 10).suggestValue(y, 20).resolve();

assertEquals(10, x.getValue(), EPSILON);
assertEquals(20, y.getValue(), EPSILON);
assertEquals(0, w.getValue(), EPSILON);
assertEquals(0, h.getValue(), EPSILON);

solver.addEditVar(w).addEditVar(h).beginEdit();

solver.suggestValue(w, 30).suggestValue(h, 40).endEdit();

assertEquals(10, x.getValue(), EPSILON);
assertEquals(20, y.getValue(), EPSILON);
assertEquals(30, w.getValue(), EPSILON);
assertEquals(40, h.getValue(), EPSILON);

solver.suggestValue(x, 50).suggestValue(y, 60).endEdit();

assertEquals(50, x.getValue(), EPSILON);
assertEquals(60, y.getValue(), EPSILON);
assertEquals(30, w.getValue(), EPSILON);
assertEquals(40, h.getValue(), EPSILON);
}


@Test
public void requiredEditVar() {
ClVariable x = new ClVariable("x");
Expand Down