blob: 2a474d9d9f84f656381e1eb8ef14597200c8d5cc [file] [log] [blame]
library;
import self as self;
import "dart:core" as core;
class DeltaBlue extends core::Object {
synthetic constructor •() self::DeltaBlue*
: super core::Object::•()
;
method run() void {
self::chainTest(100);
self::projectionTest(100);
}
abstract member-signature get _identityHashCode() core::int*;
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOf(dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOfTrue(dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOfFalse(dynamic type) core::bool*;
abstract member-signature operator ==(dynamic other) core::bool*;
abstract member-signature get hashCode() core::int*;
abstract member-signature method toString() core::String*;
abstract member-signature method noSuchMethod(core::Invocation* invocation) dynamic;
abstract member-signature get runtimeType() core::Type*;
}
class Strength extends core::Object /*hasConstConstructor*/ {
final field core::int* value;
final field core::String* name;
const constructor •(core::int* value, core::String* name) self::Strength*
: self::Strength::value = value, self::Strength::name = name, super core::Object::•()
;
method nextWeaker() self::Strength*
return (#C19).{core::List::[]}(this.{self::Strength::value});
static method stronger(self::Strength* s1, self::Strength* s2) core::bool* {
return s1.{self::Strength::value}.{core::num::<}(s2.{self::Strength::value});
}
static method weaker(self::Strength* s1, self::Strength* s2) core::bool* {
return s1.{self::Strength::value}.{core::num::>}(s2.{self::Strength::value});
}
static method weakest(self::Strength* s1, self::Strength* s2) self::Strength* {
return self::Strength::weaker(s1, s2) ?{self::Strength*} s1 : s2;
}
static method strongest(self::Strength* s1, self::Strength* s2) self::Strength* {
return self::Strength::stronger(s1, s2) ?{self::Strength*} s1 : s2;
}
abstract member-signature get _identityHashCode() core::int*;
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOf(dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOfTrue(dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOfFalse(dynamic type) core::bool*;
abstract member-signature operator ==(dynamic other) core::bool*;
abstract member-signature get hashCode() core::int*;
abstract member-signature method toString() core::String*;
abstract member-signature method noSuchMethod(core::Invocation* invocation) dynamic;
abstract member-signature get runtimeType() core::Type*;
}
abstract class Constraint extends core::Object /*hasConstConstructor*/ {
final field self::Strength* strength;
const constructor •(self::Strength* strength) self::Constraint*
: self::Constraint::strength = strength, super core::Object::•()
;
abstract method isSatisfied() core::bool*;
abstract method markUnsatisfied() void;
abstract method addToGraph() void;
abstract method removeFromGraph() void;
abstract method chooseMethod(core::int* mark) void;
abstract method markInputs(core::int* mark) void;
abstract method inputsKnown(core::int* mark) core::bool*;
abstract method output() self::Variable*;
abstract method execute() void;
abstract method recalculate() void;
method addConstraint() void {
this.{self::Constraint::addToGraph}();
self::planner.{self::Planner::incrementalAdd}(this);
}
method satisfy(dynamic mark) self::Constraint* {
this.{self::Constraint::chooseMethod}(mark as{TypeError,ForDynamic} core::int*);
if(!this.{self::Constraint::isSatisfied}()) {
if(this.{self::Constraint::strength}.{self::Strength::==}(#C22)) {
core::print("Could not satisfy a required constraint!");
}
return null;
}
this.{self::Constraint::markInputs}(mark as{TypeError,ForDynamic} core::int*);
self::Variable* out = this.{self::Constraint::output}();
self::Constraint* overridden = out.{self::Variable::determinedBy};
if(!overridden.{self::Constraint::==}(null))
overridden.{self::Constraint::markUnsatisfied}();
out.{self::Variable::determinedBy} = this;
if(!self::planner.{self::Planner::addPropagate}(this, mark as{TypeError,ForDynamic} core::int*))
core::print("Cycle encountered");
out.{self::Variable::mark} = mark as{TypeError,ForDynamic} core::int*;
return overridden;
}
method destroyConstraint() void {
if(this.{self::Constraint::isSatisfied}())
self::planner.{self::Planner::incrementalRemove}(this);
this.{self::Constraint::removeFromGraph}();
}
method isInput() core::bool*
return false;
abstract member-signature get _identityHashCode() core::int*;
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOf(dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOfTrue(dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOfFalse(dynamic type) core::bool*;
abstract member-signature operator ==(dynamic other) core::bool*;
abstract member-signature get hashCode() core::int*;
abstract member-signature method toString() core::String*;
abstract member-signature method noSuchMethod(core::Invocation* invocation) dynamic;
abstract member-signature get runtimeType() core::Type*;
}
abstract class UnaryConstraint extends self::Constraint {
final field self::Variable* myOutput;
field core::bool* satisfied = false;
constructor •(self::Variable* myOutput, self::Strength* strength) self::UnaryConstraint*
: self::UnaryConstraint::myOutput = myOutput, super self::Constraint::•(strength) {
this.{self::Constraint::addConstraint}();
}
method addToGraph() void {
this.{self::UnaryConstraint::myOutput}.{self::Variable::addConstraint}(this);
this.{self::UnaryConstraint::satisfied} = false;
}
method chooseMethod(core::int* mark) void {
this.{self::UnaryConstraint::satisfied} = !this.{self::UnaryConstraint::myOutput}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::UnaryConstraint::myOutput}.{self::Variable::walkStrength});
}
method isSatisfied() core::bool*
return this.{self::UnaryConstraint::satisfied};
method markInputs(core::int* mark) void {}
method output() self::Variable*
return this.{self::UnaryConstraint::myOutput};
method recalculate() void {
this.{self::UnaryConstraint::myOutput}.{self::Variable::walkStrength} = this.{self::Constraint::strength};
this.{self::UnaryConstraint::myOutput}.{self::Variable::stay} = !this.{self::Constraint::isInput}();
if(this.{self::UnaryConstraint::myOutput}.{self::Variable::stay})
this.{self::Constraint::execute}();
}
method markUnsatisfied() void {
this.{self::UnaryConstraint::satisfied} = false;
}
method inputsKnown(core::int* mark) core::bool*
return true;
method removeFromGraph() void {
if(!this.{self::UnaryConstraint::myOutput}.{self::Variable::==}(null))
this.{self::UnaryConstraint::myOutput}.{self::Variable::removeConstraint}(this);
this.{self::UnaryConstraint::satisfied} = false;
}
}
class StayConstraint extends self::UnaryConstraint {
constructor •(self::Variable* v, self::Strength* str) self::StayConstraint*
: super self::UnaryConstraint::•(v, str)
;
method execute() void {}
}
class EditConstraint extends self::UnaryConstraint {
constructor •(self::Variable* v, self::Strength* str) self::EditConstraint*
: super self::UnaryConstraint::•(v, str)
;
method isInput() core::bool*
return true;
method execute() void {}
}
abstract class BinaryConstraint extends self::Constraint {
field self::Variable* v1;
field self::Variable* v2;
field core::int* direction = #C1;
constructor •(self::Variable* v1, self::Variable* v2, self::Strength* strength) self::BinaryConstraint*
: self::BinaryConstraint::v1 = v1, self::BinaryConstraint::v2 = v2, super self::Constraint::•(strength) {
this.{self::Constraint::addConstraint}();
}
method chooseMethod(core::int* mark) void {
if(this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark)) {
this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ?{core::int*} #C4 : #C1;
}
if(this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark)) {
this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ?{core::int*} #C20 : #C1;
}
if(self::Strength::weaker(this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength})) {
this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ?{core::int*} #C20 : #C1;
}
else {
this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ?{core::int*} #C4 : #C20;
}
}
method addToGraph() void {
this.{self::BinaryConstraint::v1}.{self::Variable::addConstraint}(this);
this.{self::BinaryConstraint::v2}.{self::Variable::addConstraint}(this);
this.{self::BinaryConstraint::direction} = #C1;
}
method isSatisfied() core::bool*
return !this.{self::BinaryConstraint::direction}.{core::num::==}(#C1);
method markInputs(core::int* mark) void {
this.{self::BinaryConstraint::input}().{self::Variable::mark} = mark;
}
method input() self::Variable*
return this.{self::BinaryConstraint::direction}.{core::num::==}(#C4) ?{self::Variable*} this.{self::BinaryConstraint::v1} : this.{self::BinaryConstraint::v2};
method output() self::Variable*
return this.{self::BinaryConstraint::direction}.{core::num::==}(#C4) ?{self::Variable*} this.{self::BinaryConstraint::v2} : this.{self::BinaryConstraint::v1};
method recalculate() void {
self::Variable* ihn = this.{self::BinaryConstraint::input}();
self::Variable* out = this.{self::BinaryConstraint::output}();
out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}, ihn.{self::Variable::walkStrength});
out.{self::Variable::stay} = ihn.{self::Variable::stay};
if(out.{self::Variable::stay})
this.{self::Constraint::execute}();
}
method markUnsatisfied() void {
this.{self::BinaryConstraint::direction} = #C1;
}
method inputsKnown(core::int* mark) core::bool* {
self::Variable* i = this.{self::BinaryConstraint::input}();
return i.{self::Variable::mark}.{core::num::==}(mark) || i.{self::Variable::stay} || i.{self::Variable::determinedBy}.{self::Constraint::==}(null);
}
method removeFromGraph() void {
if(!this.{self::BinaryConstraint::v1}.{self::Variable::==}(null))
this.{self::BinaryConstraint::v1}.{self::Variable::removeConstraint}(this);
if(!this.{self::BinaryConstraint::v2}.{self::Variable::==}(null))
this.{self::BinaryConstraint::v2}.{self::Variable::removeConstraint}(this);
this.{self::BinaryConstraint::direction} = #C1;
}
}
class ScaleConstraint extends self::BinaryConstraint {
final field self::Variable* scale;
final field self::Variable* offset;
constructor •(self::Variable* src, self::Variable* scale, self::Variable* offset, self::Variable* dest, self::Strength* strength) self::ScaleConstraint*
: self::ScaleConstraint::scale = scale, self::ScaleConstraint::offset = offset, super self::BinaryConstraint::•(src, dest, strength)
;
method addToGraph() void {
super.{self::BinaryConstraint::addToGraph}();
this.{self::ScaleConstraint::scale}.{self::Variable::addConstraint}(this);
this.{self::ScaleConstraint::offset}.{self::Variable::addConstraint}(this);
}
method removeFromGraph() void {
super.{self::BinaryConstraint::removeFromGraph}();
if(!this.{self::ScaleConstraint::scale}.{self::Variable::==}(null))
this.{self::ScaleConstraint::scale}.{self::Variable::removeConstraint}(this);
if(!this.{self::ScaleConstraint::offset}.{self::Variable::==}(null))
this.{self::ScaleConstraint::offset}.{self::Variable::removeConstraint}(this);
}
method markInputs(core::int* mark) void {
super.{self::BinaryConstraint::markInputs}(mark);
this.{self::ScaleConstraint::scale}.{self::Variable::mark} = this.{self::ScaleConstraint::offset}.{self::Variable::mark} = mark;
}
method execute() void {
if(this.{self::BinaryConstraint::direction}.{core::num::==}(#C4)) {
this.{self::BinaryConstraint::v2}.{self::Variable::value} = this.{self::BinaryConstraint::v1}.{self::Variable::value}.{core::num::*}(this.{self::ScaleConstraint::scale}.{self::Variable::value}).{core::num::+}(this.{self::ScaleConstraint::offset}.{self::Variable::value});
}
else {
this.{self::BinaryConstraint::v1}.{self::Variable::value} = this.{self::BinaryConstraint::v2}.{self::Variable::value}.{core::num::-}(this.{self::ScaleConstraint::offset}.{self::Variable::value}).{core::num::~/}(this.{self::ScaleConstraint::scale}.{self::Variable::value});
}
}
method recalculate() void {
self::Variable* ihn = this.{self::BinaryConstraint::input}();
self::Variable* out = this.{self::BinaryConstraint::output}();
out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}, ihn.{self::Variable::walkStrength});
out.{self::Variable::stay} = ihn.{self::Variable::stay} && this.{self::ScaleConstraint::scale}.{self::Variable::stay} && this.{self::ScaleConstraint::offset}.{self::Variable::stay};
if(out.{self::Variable::stay})
this.{self::ScaleConstraint::execute}();
}
}
class EqualityConstraint extends self::BinaryConstraint {
constructor •(self::Variable* v1, self::Variable* v2, self::Strength* strength) self::EqualityConstraint*
: super self::BinaryConstraint::•(v1, v2, strength)
;
method execute() void {
this.{self::BinaryConstraint::output}().{self::Variable::value} = this.{self::BinaryConstraint::input}().{self::Variable::value};
}
}
class Variable extends core::Object {
field core::List<self::Constraint*>* constraints = <self::Constraint*>[];
field self::Constraint* determinedBy = null;
field core::int* mark = 0;
field self::Strength* walkStrength = #C18;
field core::bool* stay = true;
field core::int* value;
final field core::String* name;
constructor •(core::String* name, core::int* value) self::Variable*
: self::Variable::name = name, self::Variable::value = value, super core::Object::•()
;
method addConstraint(self::Constraint* c) void {
this.{self::Variable::constraints}.{core::List::add}(c);
}
method removeConstraint(self::Constraint* c) void {
this.{self::Variable::constraints}.{core::List::remove}(c);
if(this.{self::Variable::determinedBy}.{self::Constraint::==}(c))
this.{self::Variable::determinedBy} = null;
}
abstract member-signature get _identityHashCode() core::int*;
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOf(dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOfTrue(dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOfFalse(dynamic type) core::bool*;
abstract member-signature operator ==(dynamic other) core::bool*;
abstract member-signature get hashCode() core::int*;
abstract member-signature method toString() core::String*;
abstract member-signature method noSuchMethod(core::Invocation* invocation) dynamic;
abstract member-signature get runtimeType() core::Type*;
}
class Planner extends core::Object {
field core::int* currentMark = 0;
synthetic constructor •() self::Planner*
: super core::Object::•()
;
method incrementalAdd(self::Constraint* c) void {
core::int* mark = this.{self::Planner::newMark}();
for (self::Constraint* overridden = c.{self::Constraint::satisfy}(mark); !overridden.{self::Constraint::==}(null); overridden = overridden.{self::Constraint::satisfy}(mark))
;
}
method incrementalRemove(self::Constraint* c) void {
self::Variable* out = c.{self::Constraint::output}();
c.{self::Constraint::markUnsatisfied}();
c.{self::Constraint::removeFromGraph}();
core::List<self::Constraint*>* unsatisfied = this.{self::Planner::removePropagateFrom}(out);
self::Strength* strength = #C22;
do {
for (core::int* i = 0; i.{core::num::<}(unsatisfied.{core::List::length}); i = i.{core::num::+}(1)) {
self::Constraint* u = unsatisfied.{core::List::[]}(i);
if(u.{self::Constraint::strength}.{self::Strength::==}(strength))
this.{self::Planner::incrementalAdd}(u);
}
strength = strength.{self::Strength::nextWeaker}();
}
while (!strength.{self::Strength::==}(#C18))
}
method newMark() core::int*
return this.{self::Planner::currentMark} = this.{self::Planner::currentMark}.{core::num::+}(1);
method makePlan(core::List<self::Constraint*>* sources) self::Plan* {
core::int* mark = this.{self::Planner::newMark}();
self::Plan* plan = new self::Plan::•();
core::List<self::Constraint*>* todo = sources;
while (todo.{core::List::length}.{core::num::>}(0)) {
self::Constraint* c = todo.{core::List::removeLast}();
if(!c.{self::Constraint::output}().{self::Variable::mark}.{core::num::==}(mark) && c.{self::Constraint::inputsKnown}(mark)) {
plan.{self::Plan::addConstraint}(c);
c.{self::Constraint::output}().{self::Variable::mark} = mark;
this.{self::Planner::addConstraintsConsumingTo}(c.{self::Constraint::output}(), todo);
}
}
return plan;
}
method extractPlanFromConstraints(core::List<self::Constraint*>* constraints) self::Plan* {
core::List<self::Constraint*>* sources = <self::Constraint*>[];
for (core::int* i = 0; i.{core::num::<}(constraints.{core::List::length}); i = i.{core::num::+}(1)) {
self::Constraint* c = constraints.{core::List::[]}(i);
if(c.{self::Constraint::isInput}() && c.{self::Constraint::isSatisfied}())
sources.{core::List::add}(c);
}
return this.{self::Planner::makePlan}(sources);
}
method addPropagate(self::Constraint* c, core::int* mark) core::bool* {
core::List<self::Constraint*>* todo = <self::Constraint*>[c];
while (todo.{core::List::length}.{core::num::>}(0)) {
self::Constraint* d = todo.{core::List::removeLast}();
if(d.{self::Constraint::output}().{self::Variable::mark}.{core::num::==}(mark)) {
this.{self::Planner::incrementalRemove}(c);
return false;
}
d.{self::Constraint::recalculate}();
this.{self::Planner::addConstraintsConsumingTo}(d.{self::Constraint::output}(), todo);
}
return true;
}
method removePropagateFrom(self::Variable* out) core::List<self::Constraint*>* {
out.{self::Variable::determinedBy} = null;
out.{self::Variable::walkStrength} = #C18;
out.{self::Variable::stay} = true;
core::List<self::Constraint*>* unsatisfied = <self::Constraint*>[];
core::List<self::Variable*>* todo = <self::Variable*>[out];
while (todo.{core::List::length}.{core::num::>}(0)) {
self::Variable* v = todo.{core::List::removeLast}();
for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
self::Constraint* c = v.{self::Variable::constraints}.{core::List::[]}(i);
if(!c.{self::Constraint::isSatisfied}())
unsatisfied.{core::List::add}(c);
}
self::Constraint* determining = v.{self::Variable::determinedBy};
for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
self::Constraint* next = v.{self::Variable::constraints}.{core::List::[]}(i);
if(!next.{self::Constraint::==}(determining) && next.{self::Constraint::isSatisfied}()) {
next.{self::Constraint::recalculate}();
todo.{core::List::add}(next.{self::Constraint::output}());
}
}
}
return unsatisfied;
}
method addConstraintsConsumingTo(self::Variable* v, core::List<self::Constraint*>* coll) void {
self::Constraint* determining = v.{self::Variable::determinedBy};
for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
self::Constraint* c = v.{self::Variable::constraints}.{core::List::[]}(i);
if(!c.{self::Constraint::==}(determining) && c.{self::Constraint::isSatisfied}())
coll.{core::List::add}(c);
}
}
abstract member-signature get _identityHashCode() core::int*;
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOf(dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOfTrue(dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOfFalse(dynamic type) core::bool*;
abstract member-signature operator ==(dynamic other) core::bool*;
abstract member-signature get hashCode() core::int*;
abstract member-signature method toString() core::String*;
abstract member-signature method noSuchMethod(core::Invocation* invocation) dynamic;
abstract member-signature get runtimeType() core::Type*;
}
class Plan extends core::Object {
field core::List<self::Constraint*>* list = <self::Constraint*>[];
synthetic constructor •() self::Plan*
: super core::Object::•()
;
method addConstraint(self::Constraint* c) void {
this.{self::Plan::list}.{core::List::add}(c);
}
method size() core::int*
return this.{self::Plan::list}.{core::List::length};
method execute() void {
for (core::int* i = 0; i.{core::num::<}(this.{self::Plan::list}.{core::List::length}); i = i.{core::num::+}(1)) {
this.{self::Plan::list}.{core::List::[]}(i).{self::Constraint::execute}();
}
}
abstract member-signature get _identityHashCode() core::int*;
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOf(dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOfTrue(dynamic type) core::bool*;
abstract member-signature method _simpleInstanceOfFalse(dynamic type) core::bool*;
abstract member-signature operator ==(dynamic other) core::bool*;
abstract member-signature get hashCode() core::int*;
abstract member-signature method toString() core::String*;
abstract member-signature method noSuchMethod(core::Invocation* invocation) dynamic;
abstract member-signature get runtimeType() core::Type*;
}
static const field self::Strength* REQUIRED = #C22;
static const field self::Strength* STRONG_PREFERRED = #C3;
static const field self::Strength* PREFERRED = #C6;
static const field self::Strength* STRONG_DEFAULT = #C9;
static const field self::Strength* NORMAL = #C12;
static const field self::Strength* WEAK_DEFAULT = #C15;
static const field self::Strength* WEAKEST = #C18;
static const field core::int* NONE = #C1;
static const field core::int* FORWARD = #C4;
static const field core::int* BACKWARD = #C20;
static field self::Planner* planner;
static method main() dynamic {
new self::DeltaBlue::•().{self::DeltaBlue::run}();
}
static method chainTest(core::int* n) void {
self::planner = new self::Planner::•();
self::Variable* prev = null;
self::Variable* first = null;
self::Variable* last = null;
for (core::int* i = 0; i.{core::num::<=}(n); i = i.{core::num::+}(1)) {
self::Variable* v = new self::Variable::•("v${i}", 0);
if(!prev.{self::Variable::==}(null))
new self::EqualityConstraint::•(prev, v, #C22);
if(i.{core::num::==}(0))
first = v;
if(i.{core::num::==}(n))
last = v;
prev = v;
}
new self::StayConstraint::•(last, #C9);
self::EditConstraint* edit = new self::EditConstraint::•(first, #C6);
self::Plan* plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::Constraint*>[edit]);
for (core::int* i = 0; i.{core::num::<}(100); i = i.{core::num::+}(1)) {
first.{self::Variable::value} = i;
plan.{self::Plan::execute}();
if(!last.{self::Variable::value}.{core::num::==}(i)) {
core::print("Chain test failed:");
core::print("Expected last value to be ${i} but it was ${last.{self::Variable::value}}.");
}
}
}
static method projectionTest(core::int* n) void {
self::planner = new self::Planner::•();
self::Variable* scale = new self::Variable::•("scale", 10);
self::Variable* offset = new self::Variable::•("offset", 1000);
self::Variable* src = null;
self::Variable* dst = null;
core::List<self::Variable*>* dests = <self::Variable*>[];
for (core::int* i = 0; i.{core::num::<}(n); i = i.{core::num::+}(1)) {
src = new self::Variable::•("src", i);
dst = new self::Variable::•("dst", i);
dests.{core::List::add}(dst);
new self::StayConstraint::•(src, #C12);
new self::ScaleConstraint::•(src, scale, offset, dst, #C22);
}
self::change(src, 17);
if(!dst.{self::Variable::value}.{core::num::==}(1170))
core::print("Projection 1 failed");
self::change(dst, 1050);
if(!src.{self::Variable::value}.{core::num::==}(5))
core::print("Projection 2 failed");
self::change(scale, 5);
for (core::int* i = 0; i.{core::num::<}(n.{core::num::-}(1)); i = i.{core::num::+}(1)) {
if(!dests.{core::List::[]}(i).{self::Variable::value}.{core::num::==}(i.{core::num::*}(5).{core::num::+}(1000)))
core::print("Projection 3 failed");
}
self::change(offset, 2000);
for (core::int* i = 0; i.{core::num::<}(n.{core::num::-}(1)); i = i.{core::num::+}(1)) {
if(!dests.{core::List::[]}(i).{self::Variable::value}.{core::num::==}(i.{core::num::*}(5).{core::num::+}(2000)))
core::print("Projection 4 failed");
}
}
static method change(self::Variable* v, core::int* newValue) void {
self::EditConstraint* edit = new self::EditConstraint::•(v, #C6);
self::Plan* plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::EditConstraint*>[edit]);
for (core::int* i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
v.{self::Variable::value} = newValue;
plan.{self::Plan::execute}();
}
edit.{self::Constraint::destroyConstraint}();
}
constants {
#C1 = 1
#C2 = "strongPreferred"
#C3 = self::Strength {value:#C1, name:#C2}
#C4 = 2
#C5 = "preferred"
#C6 = self::Strength {value:#C4, name:#C5}
#C7 = 3
#C8 = "strongDefault"
#C9 = self::Strength {value:#C7, name:#C8}
#C10 = 4
#C11 = "normal"
#C12 = self::Strength {value:#C10, name:#C11}
#C13 = 5
#C14 = "weakDefault"
#C15 = self::Strength {value:#C13, name:#C14}
#C16 = 6
#C17 = "weakest"
#C18 = self::Strength {value:#C16, name:#C17}
#C19 = <self::Strength*>[#C3, #C6, #C9, #C12, #C15, #C18]
#C20 = 0
#C21 = "required"
#C22 = self::Strength {value:#C20, name:#C21}
}