| OLD | NEW |
| 1 dart_library.library('DeltaBlue', null, /* Imports */[ | 1 dart_library.library('DeltaBlue', null, /* Imports */[ |
| 2 "dart_runtime/dart", | 2 "dart_runtime/dart", |
| 3 'BenchmarkBase', | 3 'BenchmarkBase', |
| 4 'dart/core' | 4 'dart/core' |
| 5 ], /* Lazy imports */[ | 5 ], /* Lazy imports */[ |
| 6 ], function(exports, dart, BenchmarkBase, core) { | 6 ], function(exports, dart, BenchmarkBase, core) { |
| 7 'use strict'; | 7 'use strict'; |
| 8 let dartx = dart.dartx; | 8 let dartx = dart.dartx; |
| 9 function main() { | 9 function main() { |
| 10 new DeltaBlue().report(); | 10 dart.dcall(new DeltaBlue().report); |
| 11 } | 11 } |
| 12 dart.fn(main); | 12 dart.fn(main); |
| 13 class DeltaBlue extends BenchmarkBase.BenchmarkBase { | 13 class DeltaBlue extends BenchmarkBase.BenchmarkBase { |
| 14 DeltaBlue() { | 14 DeltaBlue() { |
| 15 super.BenchmarkBase("DeltaBlue"); | 15 super.BenchmarkBase("DeltaBlue"); |
| 16 } | 16 } |
| 17 run() { | 17 run() { |
| 18 chainTest(100); | 18 dart.dcall(chainTest, 100); |
| 19 projectionTest(100); | 19 dart.dcall(projectionTest, 100); |
| 20 } | 20 } |
| 21 } | 21 } |
| 22 dart.setSignature(DeltaBlue, { | 22 dart.setSignature(DeltaBlue, { |
| 23 constructors: () => ({DeltaBlue: [DeltaBlue, []]}) | 23 constructors: () => ({DeltaBlue: [DeltaBlue, []]}) |
| 24 }); | 24 }); |
| 25 class Strength extends core.Object { | 25 class Strength extends core.Object { |
| 26 Strength(value, name) { | 26 Strength(value, name) { |
| 27 this.value = value; | 27 this.value = value; |
| 28 this.name = name; | 28 this.name = name; |
| 29 } | 29 } |
| 30 nextWeaker() { | 30 nextWeaker() { |
| 31 return dart.const(dart.list([STRONG_PREFERRED, PREFERRED, STRONG_DEFAULT,
NORMAL, WEAK_DEFAULT, WEAKEST], Strength))[dartx.get](this.value); | 31 return dart.const(dart.list([dart.as(STRONG_PREFERRED, Strength), dart.as(
PREFERRED, Strength), dart.as(STRONG_DEFAULT, Strength), dart.as(NORMAL, Strengt
h), dart.as(WEAK_DEFAULT, Strength), dart.as(WEAKEST, Strength)], Strength))[dar
tx.get](this.value); |
| 32 } | 32 } |
| 33 static stronger(s1, s2) { | 33 static stronger(s1, s2) { |
| 34 return dart.notNull(s1.value) < dart.notNull(s2.value); | 34 return dart.notNull(s1.value) < dart.notNull(s2.value); |
| 35 } | 35 } |
| 36 static weaker(s1, s2) { | 36 static weaker(s1, s2) { |
| 37 return dart.notNull(s1.value) > dart.notNull(s2.value); | 37 return dart.notNull(s1.value) > dart.notNull(s2.value); |
| 38 } | 38 } |
| 39 static weakest(s1, s2) { | 39 static weakest(s1, s2) { |
| 40 return dart.notNull(Strength.weaker(s1, s2)) ? s1 : s2; | 40 return dart.notNull(dart.dcall(Strength.weaker, s1, s2)) ? s1 : s2; |
| 41 } | 41 } |
| 42 static strongest(s1, s2) { | 42 static strongest(s1, s2) { |
| 43 return dart.notNull(Strength.stronger(s1, s2)) ? s1 : s2; | 43 return dart.notNull(dart.dcall(Strength.stronger, s1, s2)) ? s1 : s2; |
| 44 } | 44 } |
| 45 } | 45 } |
| 46 dart.setSignature(Strength, { | 46 dart.setSignature(Strength, { |
| 47 constructors: () => ({Strength: [Strength, [core.int, core.String]]}), | 47 constructors: () => ({Strength: [Strength, [core.int, core.String]]}), |
| 48 methods: () => ({nextWeaker: [Strength, []]}), | 48 methods: () => ({nextWeaker: [Strength, []]}), |
| 49 statics: () => ({ | 49 statics: () => ({ |
| 50 stronger: [core.bool, [Strength, Strength]], | 50 stronger: [core.bool, [Strength, Strength]], |
| 51 weaker: [core.bool, [Strength, Strength]], | 51 weaker: [core.bool, [Strength, Strength]], |
| 52 weakest: [Strength, [Strength, Strength]], | 52 weakest: [Strength, [Strength, Strength]], |
| 53 strongest: [Strength, [Strength, Strength]] | 53 strongest: [Strength, [Strength, Strength]] |
| 54 }), | 54 }), |
| 55 names: ['stronger', 'weaker', 'weakest', 'strongest'] | 55 names: ['stronger', 'weaker', 'weakest', 'strongest'] |
| 56 }); | 56 }); |
| 57 let REQUIRED = dart.const(new Strength(0, "required")); | 57 let REQUIRED = dart.const(new Strength(0, "required")); |
| 58 let STRONG_PREFERRED = dart.const(new Strength(1, "strongPreferred")); | 58 let STRONG_PREFERRED = dart.const(new Strength(1, "strongPreferred")); |
| 59 let PREFERRED = dart.const(new Strength(2, "preferred")); | 59 let PREFERRED = dart.const(new Strength(2, "preferred")); |
| 60 let STRONG_DEFAULT = dart.const(new Strength(3, "strongDefault")); | 60 let STRONG_DEFAULT = dart.const(new Strength(3, "strongDefault")); |
| 61 let NORMAL = dart.const(new Strength(4, "normal")); | 61 let NORMAL = dart.const(new Strength(4, "normal")); |
| 62 let WEAK_DEFAULT = dart.const(new Strength(5, "weakDefault")); | 62 let WEAK_DEFAULT = dart.const(new Strength(5, "weakDefault")); |
| 63 let WEAKEST = dart.const(new Strength(6, "weakest")); | 63 let WEAKEST = dart.const(new Strength(6, "weakest")); |
| 64 class Constraint extends core.Object { | 64 class Constraint extends core.Object { |
| 65 Constraint(strength) { | 65 Constraint(strength) { |
| 66 this.strength = strength; | 66 this.strength = strength; |
| 67 } | 67 } |
| 68 addConstraint() { | 68 addConstraint() { |
| 69 this.addToGraph(); | 69 dart.dcall(this.addToGraph); |
| 70 exports.planner.incrementalAdd(this); | 70 dart.dcall(exports.planner.incrementalAdd, this); |
| 71 } | 71 } |
| 72 satisfy(mark) { | 72 satisfy(mark) { |
| 73 this.chooseMethod(dart.as(mark, core.int)); | 73 dart.dcall(this.chooseMethod, mark); |
| 74 if (!dart.notNull(this.isSatisfied())) { | 74 if (!dart.notNull(dart.dcall(this.isSatisfied))) { |
| 75 if (dart.equals(this.strength, REQUIRED)) { | 75 if (dart.equals(this.strength, REQUIRED)) { |
| 76 core.print("Could not satisfy a required constraint!"); | 76 dart.dcall(core.print, "Could not satisfy a required constraint!"); |
| 77 } | 77 } |
| 78 return null; | 78 return null; |
| 79 } | 79 } |
| 80 this.markInputs(dart.as(mark, core.int)); | 80 dart.dcall(this.markInputs, mark); |
| 81 let out = this.output(); | 81 let out = dart.dcall(this.output); |
| 82 let overridden = out.determinedBy; | 82 let overridden = out.determinedBy; |
| 83 if (overridden != null) | 83 if (overridden != null) |
| 84 overridden.markUnsatisfied(); | 84 dart.dcall(overridden.markUnsatisfied); |
| 85 out.determinedBy = this; | 85 out.determinedBy = this; |
| 86 if (!dart.notNull(exports.planner.addPropagate(this, dart.as(mark, core.in
t)))) | 86 if (!dart.notNull(dart.dcall(exports.planner.addPropagate, this, mark))) |
| 87 core.print("Cycle encountered"); | 87 dart.dcall(core.print, "Cycle encountered"); |
| 88 out.mark = dart.as(mark, core.int); | 88 out.mark = dart.as(mark, core.int); |
| 89 return overridden; | 89 return overridden; |
| 90 } | 90 } |
| 91 destroyConstraint() { | 91 destroyConstraint() { |
| 92 if (dart.notNull(this.isSatisfied())) | 92 if (dart.notNull(dart.dcall(this.isSatisfied))) |
| 93 exports.planner.incrementalRemove(this); | 93 dart.dcall(exports.planner.incrementalRemove, this); |
| 94 this.removeFromGraph(); | 94 dart.dcall(this.removeFromGraph); |
| 95 } | 95 } |
| 96 isInput() { | 96 isInput() { |
| 97 return false; | 97 return false; |
| 98 } | 98 } |
| 99 } | 99 } |
| 100 dart.setSignature(Constraint, { | 100 dart.setSignature(Constraint, { |
| 101 constructors: () => ({Constraint: [Constraint, [Strength]]}), | 101 constructors: () => ({Constraint: [Constraint, [Strength]]}), |
| 102 methods: () => ({ | 102 methods: () => ({ |
| 103 addConstraint: [dart.void, []], | 103 addConstraint: [dart.void, []], |
| 104 satisfy: [Constraint, [dart.dynamic]], | 104 satisfy: [Constraint, [dart.dynamic]], |
| 105 destroyConstraint: [dart.void, []], | 105 destroyConstraint: [dart.void, []], |
| 106 isInput: [core.bool, []] | 106 isInput: [core.bool, []] |
| 107 }) | 107 }) |
| 108 }); | 108 }); |
| 109 class UnaryConstraint extends Constraint { | 109 class UnaryConstraint extends Constraint { |
| 110 UnaryConstraint(myOutput, strength) { | 110 UnaryConstraint(myOutput, strength) { |
| 111 this.myOutput = myOutput; | 111 this.myOutput = myOutput; |
| 112 this.satisfied = false; | 112 this.satisfied = false; |
| 113 super.Constraint(strength); | 113 super.Constraint(strength); |
| 114 this.addConstraint(); | 114 dart.dcall(this.addConstraint); |
| 115 } | 115 } |
| 116 addToGraph() { | 116 addToGraph() { |
| 117 this.myOutput.addConstraint(this); | 117 dart.dcall(this.myOutput.addConstraint, this); |
| 118 this.satisfied = false; | 118 this.satisfied = false; |
| 119 } | 119 } |
| 120 chooseMethod(mark) { | 120 chooseMethod(mark) { |
| 121 this.satisfied = this.myOutput.mark != mark && dart.notNull(Strength.stron
ger(this.strength, this.myOutput.walkStrength)); | 121 this.satisfied = this.myOutput.mark != mark && dart.notNull(dart.dcall(Str
ength.stronger, this.strength, this.myOutput.walkStrength)); |
| 122 } | 122 } |
| 123 isSatisfied() { | 123 isSatisfied() { |
| 124 return this.satisfied; | 124 return this.satisfied; |
| 125 } | 125 } |
| 126 markInputs(mark) {} | 126 markInputs(mark) {} |
| 127 output() { | 127 output() { |
| 128 return this.myOutput; | 128 return this.myOutput; |
| 129 } | 129 } |
| 130 recalculate() { | 130 recalculate() { |
| 131 this.myOutput.walkStrength = this.strength; | 131 this.myOutput.walkStrength = this.strength; |
| 132 this.myOutput.stay = !dart.notNull(this.isInput()); | 132 this.myOutput.stay = !dart.notNull(dart.dcall(this.isInput)); |
| 133 if (dart.notNull(this.myOutput.stay)) | 133 if (dart.notNull(this.myOutput.stay)) |
| 134 this.execute(); | 134 dart.dcall(this.execute); |
| 135 } | 135 } |
| 136 markUnsatisfied() { | 136 markUnsatisfied() { |
| 137 this.satisfied = false; | 137 this.satisfied = false; |
| 138 } | 138 } |
| 139 inputsKnown(mark) { | 139 inputsKnown(mark) { |
| 140 return true; | 140 return true; |
| 141 } | 141 } |
| 142 removeFromGraph() { | 142 removeFromGraph() { |
| 143 if (this.myOutput != null) | 143 if (this.myOutput != null) |
| 144 this.myOutput.removeConstraint(this); | 144 dart.dcall(this.myOutput.removeConstraint, this); |
| 145 this.satisfied = false; | 145 this.satisfied = false; |
| 146 } | 146 } |
| 147 } | 147 } |
| 148 dart.setSignature(UnaryConstraint, { | 148 dart.setSignature(UnaryConstraint, { |
| 149 constructors: () => ({UnaryConstraint: [UnaryConstraint, [Variable, Strength
]]}), | 149 constructors: () => ({UnaryConstraint: [UnaryConstraint, [Variable, Strength
]]}), |
| 150 methods: () => ({ | 150 methods: () => ({ |
| 151 addToGraph: [dart.void, []], | 151 addToGraph: [dart.void, []], |
| 152 chooseMethod: [dart.void, [core.int]], | 152 chooseMethod: [dart.void, [core.int]], |
| 153 isSatisfied: [core.bool, []], | 153 isSatisfied: [core.bool, []], |
| 154 markInputs: [dart.void, [core.int]], | 154 markInputs: [dart.void, [core.int]], |
| (...skipping 29 matching lines...) Expand all Loading... |
| 184 }); | 184 }); |
| 185 let NONE = 1; | 185 let NONE = 1; |
| 186 let FORWARD = 2; | 186 let FORWARD = 2; |
| 187 let BACKWARD = 0; | 187 let BACKWARD = 0; |
| 188 class BinaryConstraint extends Constraint { | 188 class BinaryConstraint extends Constraint { |
| 189 BinaryConstraint(v1, v2, strength) { | 189 BinaryConstraint(v1, v2, strength) { |
| 190 this.v1 = v1; | 190 this.v1 = v1; |
| 191 this.v2 = v2; | 191 this.v2 = v2; |
| 192 this.direction = NONE; | 192 this.direction = NONE; |
| 193 super.Constraint(strength); | 193 super.Constraint(strength); |
| 194 this.addConstraint(); | 194 dart.dcall(this.addConstraint); |
| 195 } | 195 } |
| 196 chooseMethod(mark) { | 196 chooseMethod(mark) { |
| 197 if (this.v1.mark == mark) { | 197 if (this.v1.mark == mark) { |
| 198 this.direction = this.v2.mark != mark && dart.notNull(Strength.stronger(
this.strength, this.v2.walkStrength)) ? FORWARD : NONE; | 198 this.direction = this.v2.mark != mark && dart.notNull(dart.dcall(Strengt
h.stronger, this.strength, this.v2.walkStrength)) ? FORWARD : NONE; |
| 199 } | 199 } |
| 200 if (this.v2.mark == mark) { | 200 if (this.v2.mark == mark) { |
| 201 this.direction = this.v1.mark != mark && dart.notNull(Strength.stronger(
this.strength, this.v1.walkStrength)) ? BACKWARD : NONE; | 201 this.direction = this.v1.mark != mark && dart.notNull(dart.dcall(Strengt
h.stronger, this.strength, this.v1.walkStrength)) ? BACKWARD : NONE; |
| 202 } | 202 } |
| 203 if (dart.notNull(Strength.weaker(this.v1.walkStrength, this.v2.walkStrengt
h))) { | 203 if (dart.notNull(dart.dcall(Strength.weaker, this.v1.walkStrength, this.v2
.walkStrength))) { |
| 204 this.direction = dart.notNull(Strength.stronger(this.strength, this.v1.w
alkStrength)) ? BACKWARD : NONE; | 204 this.direction = dart.notNull(dart.dcall(Strength.stronger, this.strengt
h, this.v1.walkStrength)) ? BACKWARD : NONE; |
| 205 } else { | 205 } else { |
| 206 this.direction = dart.notNull(Strength.stronger(this.strength, this.v2.w
alkStrength)) ? FORWARD : BACKWARD; | 206 this.direction = dart.notNull(dart.dcall(Strength.stronger, this.strengt
h, this.v2.walkStrength)) ? FORWARD : BACKWARD; |
| 207 } | 207 } |
| 208 } | 208 } |
| 209 addToGraph() { | 209 addToGraph() { |
| 210 this.v1.addConstraint(this); | 210 dart.dcall(this.v1.addConstraint, this); |
| 211 this.v2.addConstraint(this); | 211 dart.dcall(this.v2.addConstraint, this); |
| 212 this.direction = NONE; | 212 this.direction = NONE; |
| 213 } | 213 } |
| 214 isSatisfied() { | 214 isSatisfied() { |
| 215 return this.direction != NONE; | 215 return this.direction != NONE; |
| 216 } | 216 } |
| 217 markInputs(mark) { | 217 markInputs(mark) { |
| 218 this.input().mark = mark; | 218 dart.dcall(this.input).mark = mark; |
| 219 } | 219 } |
| 220 input() { | 220 input() { |
| 221 return this.direction == FORWARD ? this.v1 : this.v2; | 221 return this.direction == FORWARD ? this.v1 : this.v2; |
| 222 } | 222 } |
| 223 output() { | 223 output() { |
| 224 return this.direction == FORWARD ? this.v2 : this.v1; | 224 return this.direction == FORWARD ? this.v2 : this.v1; |
| 225 } | 225 } |
| 226 recalculate() { | 226 recalculate() { |
| 227 let ihn = this.input(), out = this.output(); | 227 let ihn = dart.dcall(this.input), out = dart.dcall(this.output); |
| 228 out.walkStrength = Strength.weakest(this.strength, ihn.walkStrength); | 228 out.walkStrength = dart.dcall(Strength.weakest, this.strength, ihn.walkStr
ength); |
| 229 out.stay = ihn.stay; | 229 out.stay = ihn.stay; |
| 230 if (dart.notNull(out.stay)) | 230 if (dart.notNull(out.stay)) |
| 231 this.execute(); | 231 dart.dcall(this.execute); |
| 232 } | 232 } |
| 233 markUnsatisfied() { | 233 markUnsatisfied() { |
| 234 this.direction = NONE; | 234 this.direction = NONE; |
| 235 } | 235 } |
| 236 inputsKnown(mark) { | 236 inputsKnown(mark) { |
| 237 let i = this.input(); | 237 let i = dart.dcall(this.input); |
| 238 return i.mark == mark || dart.notNull(i.stay) || i.determinedBy == null; | 238 return i.mark == mark || dart.notNull(i.stay) || i.determinedBy == null; |
| 239 } | 239 } |
| 240 removeFromGraph() { | 240 removeFromGraph() { |
| 241 if (this.v1 != null) | 241 if (this.v1 != null) |
| 242 this.v1.removeConstraint(this); | 242 dart.dcall(this.v1.removeConstraint, this); |
| 243 if (this.v2 != null) | 243 if (this.v2 != null) |
| 244 this.v2.removeConstraint(this); | 244 dart.dcall(this.v2.removeConstraint, this); |
| 245 this.direction = NONE; | 245 this.direction = NONE; |
| 246 } | 246 } |
| 247 } | 247 } |
| 248 dart.setSignature(BinaryConstraint, { | 248 dart.setSignature(BinaryConstraint, { |
| 249 constructors: () => ({BinaryConstraint: [BinaryConstraint, [Variable, Variab
le, Strength]]}), | 249 constructors: () => ({BinaryConstraint: [BinaryConstraint, [Variable, Variab
le, Strength]]}), |
| 250 methods: () => ({ | 250 methods: () => ({ |
| 251 chooseMethod: [dart.void, [core.int]], | 251 chooseMethod: [dart.void, [core.int]], |
| 252 addToGraph: [dart.void, []], | 252 addToGraph: [dart.void, []], |
| 253 isSatisfied: [core.bool, []], | 253 isSatisfied: [core.bool, []], |
| 254 markInputs: [dart.void, [core.int]], | 254 markInputs: [dart.void, [core.int]], |
| 255 input: [Variable, []], | 255 input: [Variable, []], |
| 256 output: [Variable, []], | 256 output: [Variable, []], |
| 257 recalculate: [dart.void, []], | 257 recalculate: [dart.void, []], |
| 258 markUnsatisfied: [dart.void, []], | 258 markUnsatisfied: [dart.void, []], |
| 259 inputsKnown: [core.bool, [core.int]], | 259 inputsKnown: [core.bool, [core.int]], |
| 260 removeFromGraph: [dart.void, []] | 260 removeFromGraph: [dart.void, []] |
| 261 }) | 261 }) |
| 262 }); | 262 }); |
| 263 class ScaleConstraint extends BinaryConstraint { | 263 class ScaleConstraint extends BinaryConstraint { |
| 264 ScaleConstraint(src, scale, offset, dest, strength) { | 264 ScaleConstraint(src, scale, offset, dest, strength) { |
| 265 this.scale = scale; | 265 this.scale = scale; |
| 266 this.offset = offset; | 266 this.offset = offset; |
| 267 super.BinaryConstraint(src, dest, strength); | 267 super.BinaryConstraint(src, dest, strength); |
| 268 } | 268 } |
| 269 addToGraph() { | 269 addToGraph() { |
| 270 super.addToGraph(); | 270 dart.dcall(super.addToGraph); |
| 271 this.scale.addConstraint(this); | 271 dart.dcall(this.scale.addConstraint, this); |
| 272 this.offset.addConstraint(this); | 272 dart.dcall(this.offset.addConstraint, this); |
| 273 } | 273 } |
| 274 removeFromGraph() { | 274 removeFromGraph() { |
| 275 super.removeFromGraph(); | 275 dart.dcall(super.removeFromGraph); |
| 276 if (this.scale != null) | 276 if (this.scale != null) |
| 277 this.scale.removeConstraint(this); | 277 dart.dcall(this.scale.removeConstraint, this); |
| 278 if (this.offset != null) | 278 if (this.offset != null) |
| 279 this.offset.removeConstraint(this); | 279 dart.dcall(this.offset.removeConstraint, this); |
| 280 } | 280 } |
| 281 markInputs(mark) { | 281 markInputs(mark) { |
| 282 super.markInputs(mark); | 282 dart.dcall(super.markInputs, mark); |
| 283 this.scale.mark = this.offset.mark = mark; | 283 this.scale.mark = this.offset.mark = mark; |
| 284 } | 284 } |
| 285 execute() { | 285 execute() { |
| 286 if (this.direction == FORWARD) { | 286 if (this.direction == FORWARD) { |
| 287 this.v2.value = dart.notNull(this.v1.value) * dart.notNull(this.scale.va
lue) + dart.notNull(this.offset.value); | 287 this.v2.value = dart.notNull(this.v1.value) * dart.notNull(this.scale.va
lue) + dart.notNull(this.offset.value); |
| 288 } else { | 288 } else { |
| 289 this.v1.value = ((dart.notNull(this.v2.value) - dart.notNull(this.offset
.value)) / dart.notNull(this.scale.value))[dartx.truncate](); | 289 this.v1.value = ((dart.notNull(this.v2.value) - dart.notNull(this.offset
.value)) / dart.notNull(this.scale.value))[dartx.truncate](); |
| 290 } | 290 } |
| 291 } | 291 } |
| 292 recalculate() { | 292 recalculate() { |
| 293 let ihn = this.input(), out = this.output(); | 293 let ihn = dart.dcall(this.input), out = dart.dcall(this.output); |
| 294 out.walkStrength = Strength.weakest(this.strength, ihn.walkStrength); | 294 out.walkStrength = dart.dcall(Strength.weakest, this.strength, ihn.walkStr
ength); |
| 295 out.stay = dart.notNull(ihn.stay) && dart.notNull(this.scale.stay) && dart
.notNull(this.offset.stay); | 295 out.stay = dart.notNull(ihn.stay) && dart.notNull(this.scale.stay) && dart
.notNull(this.offset.stay); |
| 296 if (dart.notNull(out.stay)) | 296 if (dart.notNull(out.stay)) |
| 297 this.execute(); | 297 dart.dcall(this.execute); |
| 298 } | 298 } |
| 299 } | 299 } |
| 300 dart.setSignature(ScaleConstraint, { | 300 dart.setSignature(ScaleConstraint, { |
| 301 constructors: () => ({ScaleConstraint: [ScaleConstraint, [Variable, Variable
, Variable, Variable, Strength]]}), | 301 constructors: () => ({ScaleConstraint: [ScaleConstraint, [Variable, Variable
, Variable, Variable, Strength]]}), |
| 302 methods: () => ({execute: [dart.void, []]}) | 302 methods: () => ({execute: [dart.void, []]}) |
| 303 }); | 303 }); |
| 304 class EqualityConstraint extends BinaryConstraint { | 304 class EqualityConstraint extends BinaryConstraint { |
| 305 EqualityConstraint(v1, v2, strength) { | 305 EqualityConstraint(v1, v2, strength) { |
| 306 super.BinaryConstraint(v1, v2, strength); | 306 super.BinaryConstraint(v1, v2, strength); |
| 307 } | 307 } |
| 308 execute() { | 308 execute() { |
| 309 this.output().value = this.input().value; | 309 dart.dcall(this.output).value = dart.dcall(this.input).value; |
| 310 } | 310 } |
| 311 } | 311 } |
| 312 dart.setSignature(EqualityConstraint, { | 312 dart.setSignature(EqualityConstraint, { |
| 313 constructors: () => ({EqualityConstraint: [EqualityConstraint, [Variable, Va
riable, Strength]]}), | 313 constructors: () => ({EqualityConstraint: [EqualityConstraint, [Variable, Va
riable, Strength]]}), |
| 314 methods: () => ({execute: [dart.void, []]}) | 314 methods: () => ({execute: [dart.void, []]}) |
| 315 }); | 315 }); |
| 316 class Variable extends core.Object { | 316 class Variable extends core.Object { |
| 317 Variable(name, value) { | 317 Variable(name, value) { |
| 318 this.constraints = dart.list([], Constraint); | 318 this.constraints = dart.list([], Constraint); |
| 319 this.walkStrength = dart.as(WEAKEST, Strength); |
| 319 this.name = name; | 320 this.name = name; |
| 320 this.value = value; | 321 this.value = value; |
| 321 this.determinedBy = null; | 322 this.determinedBy = null; |
| 322 this.mark = 0; | 323 this.mark = 0; |
| 323 this.walkStrength = WEAKEST; | |
| 324 this.stay = true; | 324 this.stay = true; |
| 325 } | 325 } |
| 326 addConstraint(c) { | 326 addConstraint(c) { |
| 327 this.constraints[dartx.add](c); | 327 dart.dcall(this.constraints[dartx.add], c); |
| 328 } | 328 } |
| 329 removeConstraint(c) { | 329 removeConstraint(c) { |
| 330 this.constraints[dartx.remove](c); | 330 dart.dcall(this.constraints[dartx.remove], c); |
| 331 if (dart.equals(this.determinedBy, c)) | 331 if (dart.equals(this.determinedBy, c)) |
| 332 this.determinedBy = null; | 332 this.determinedBy = null; |
| 333 } | 333 } |
| 334 } | 334 } |
| 335 dart.setSignature(Variable, { | 335 dart.setSignature(Variable, { |
| 336 constructors: () => ({Variable: [Variable, [core.String, core.int]]}), | 336 constructors: () => ({Variable: [Variable, [core.String, core.int]]}), |
| 337 methods: () => ({ | 337 methods: () => ({ |
| 338 addConstraint: [dart.void, [Constraint]], | 338 addConstraint: [dart.void, [Constraint]], |
| 339 removeConstraint: [dart.void, [Constraint]] | 339 removeConstraint: [dart.void, [Constraint]] |
| 340 }) | 340 }) |
| 341 }); | 341 }); |
| 342 class Planner extends core.Object { | 342 class Planner extends core.Object { |
| 343 Planner() { | 343 Planner() { |
| 344 this.currentMark = 0; | 344 this.currentMark = 0; |
| 345 } | 345 } |
| 346 incrementalAdd(c) { | 346 incrementalAdd(c) { |
| 347 let mark = this.newMark(); | 347 let mark = dart.dcall(this.newMark); |
| 348 for (let overridden = c.satisfy(mark); overridden != null; overridden = ov
erridden.satisfy(mark)) | 348 for (let overridden = dart.dcall(c.satisfy, mark); overridden != null; ove
rridden = dart.dcall(overridden.satisfy, mark)) |
| 349 ; | 349 ; |
| 350 } | 350 } |
| 351 incrementalRemove(c) { | 351 incrementalRemove(c) { |
| 352 let out = c.output(); | 352 let out = dart.dcall(c.output); |
| 353 c.markUnsatisfied(); | 353 dart.dcall(c.markUnsatisfied); |
| 354 c.removeFromGraph(); | 354 dart.dcall(c.removeFromGraph); |
| 355 let unsatisfied = this.removePropagateFrom(out); | 355 let unsatisfied = dart.dcall(this.removePropagateFrom, out); |
| 356 let strength = REQUIRED; | 356 let strength = dart.as(REQUIRED, Strength); |
| 357 do { | 357 do { |
| 358 for (let i = 0; dart.notNull(i) < dart.notNull(unsatisfied[dartx.length]
); i = dart.notNull(i) + 1) { | 358 for (let i = 0; dart.notNull(i) < dart.notNull(unsatisfied[dartx.length]
); i = dart.notNull(i) + 1) { |
| 359 let u = unsatisfied[dartx.get](i); | 359 let u = unsatisfied[dartx.get](i); |
| 360 if (dart.equals(u.strength, strength)) | 360 if (dart.equals(u.strength, strength)) |
| 361 this.incrementalAdd(u); | 361 dart.dcall(this.incrementalAdd, u); |
| 362 } | 362 } |
| 363 strength = strength.nextWeaker(); | 363 strength = dart.dcall(strength.nextWeaker); |
| 364 } while (!dart.equals(strength, WEAKEST)); | 364 } while (!dart.equals(strength, WEAKEST)); |
| 365 } | 365 } |
| 366 newMark() { | 366 newMark() { |
| 367 return this.currentMark = dart.notNull(this.currentMark) + 1; | 367 return this.currentMark = dart.notNull(this.currentMark) + 1; |
| 368 } | 368 } |
| 369 makePlan(sources) { | 369 makePlan(sources) { |
| 370 let mark = this.newMark(); | 370 let mark = dart.dcall(this.newMark); |
| 371 let plan = new Plan(); | 371 let plan = new Plan(); |
| 372 let todo = sources; | 372 let todo = sources; |
| 373 while (dart.notNull(todo[dartx.length]) > 0) { | 373 while (dart.notNull(todo[dartx.length]) > 0) { |
| 374 let c = todo[dartx.removeLast](); | 374 let c = dart.dcall(todo[dartx.removeLast]); |
| 375 if (c.output().mark != mark && dart.notNull(c.inputsKnown(mark))) { | 375 if (dart.dcall(c.output).mark != mark && dart.notNull(dart.dcall(c.input
sKnown, mark))) { |
| 376 plan.addConstraint(c); | 376 dart.dcall(plan.addConstraint, c); |
| 377 c.output().mark = mark; | 377 dart.dcall(c.output).mark = mark; |
| 378 this.addConstraintsConsumingTo(c.output(), todo); | 378 dart.dcall(this.addConstraintsConsumingTo, dart.dcall(c.output), todo)
; |
| 379 } | 379 } |
| 380 } | 380 } |
| 381 return plan; | 381 return plan; |
| 382 } | 382 } |
| 383 extractPlanFromConstraints(constraints) { | 383 extractPlanFromConstraints(constraints) { |
| 384 let sources = dart.list([], Constraint); | 384 let sources = dart.list([], Constraint); |
| 385 for (let i = 0; dart.notNull(i) < dart.notNull(constraints[dartx.length]);
i = dart.notNull(i) + 1) { | 385 for (let i = 0; dart.notNull(i) < dart.notNull(constraints[dartx.length]);
i = dart.notNull(i) + 1) { |
| 386 let c = constraints[dartx.get](i); | 386 let c = constraints[dartx.get](i); |
| 387 if (dart.notNull(c.isInput()) && dart.notNull(c.isSatisfied())) | 387 if (dart.notNull(dart.dcall(c.isInput)) && dart.notNull(dart.dcall(c.isS
atisfied))) |
| 388 sources[dartx.add](c); | 388 dart.dcall(sources[dartx.add], c); |
| 389 } | 389 } |
| 390 return this.makePlan(sources); | 390 return dart.dcall(this.makePlan, sources); |
| 391 } | 391 } |
| 392 addPropagate(c, mark) { | 392 addPropagate(c, mark) { |
| 393 let todo = dart.list([c], Constraint); | 393 let todo = dart.list([c], Constraint); |
| 394 while (dart.notNull(todo[dartx.length]) > 0) { | 394 while (dart.notNull(todo[dartx.length]) > 0) { |
| 395 let d = todo[dartx.removeLast](); | 395 let d = dart.dcall(todo[dartx.removeLast]); |
| 396 if (d.output().mark == mark) { | 396 if (dart.dcall(d.output).mark == mark) { |
| 397 this.incrementalRemove(c); | 397 dart.dcall(this.incrementalRemove, c); |
| 398 return false; | 398 return false; |
| 399 } | 399 } |
| 400 d.recalculate(); | 400 dart.dcall(d.recalculate); |
| 401 this.addConstraintsConsumingTo(d.output(), todo); | 401 dart.dcall(this.addConstraintsConsumingTo, dart.dcall(d.output), todo); |
| 402 } | 402 } |
| 403 return true; | 403 return true; |
| 404 } | 404 } |
| 405 removePropagateFrom(out) { | 405 removePropagateFrom(out) { |
| 406 out.determinedBy = null; | 406 out.determinedBy = null; |
| 407 out.walkStrength = WEAKEST; | 407 out.walkStrength = dart.as(WEAKEST, Strength); |
| 408 out.stay = true; | 408 out.stay = true; |
| 409 let unsatisfied = dart.list([], Constraint); | 409 let unsatisfied = dart.list([], Constraint); |
| 410 let todo = dart.list([out], Variable); | 410 let todo = dart.list([out], Variable); |
| 411 while (dart.notNull(todo[dartx.length]) > 0) { | 411 while (dart.notNull(todo[dartx.length]) > 0) { |
| 412 let v = todo[dartx.removeLast](); | 412 let v = dart.dcall(todo[dartx.removeLast]); |
| 413 for (let i = 0; dart.notNull(i) < dart.notNull(v.constraints[dartx.lengt
h]); i = dart.notNull(i) + 1) { | 413 for (let i = 0; dart.notNull(i) < dart.notNull(v.constraints[dartx.lengt
h]); i = dart.notNull(i) + 1) { |
| 414 let c = v.constraints[dartx.get](i); | 414 let c = v.constraints[dartx.get](i); |
| 415 if (!dart.notNull(c.isSatisfied())) | 415 if (!dart.notNull(dart.dcall(c.isSatisfied))) |
| 416 unsatisfied[dartx.add](c); | 416 dart.dcall(unsatisfied[dartx.add], c); |
| 417 } | 417 } |
| 418 let determining = v.determinedBy; | 418 let determining = v.determinedBy; |
| 419 for (let i = 0; dart.notNull(i) < dart.notNull(v.constraints[dartx.lengt
h]); i = dart.notNull(i) + 1) { | 419 for (let i = 0; dart.notNull(i) < dart.notNull(v.constraints[dartx.lengt
h]); i = dart.notNull(i) + 1) { |
| 420 let next = v.constraints[dartx.get](i); | 420 let next = v.constraints[dartx.get](i); |
| 421 if (!dart.equals(next, determining) && dart.notNull(next.isSatisfied()
)) { | 421 if (!dart.equals(next, determining) && dart.notNull(dart.dcall(next.is
Satisfied))) { |
| 422 next.recalculate(); | 422 dart.dcall(next.recalculate); |
| 423 todo[dartx.add](next.output()); | 423 dart.dcall(todo[dartx.add], dart.dcall(next.output)); |
| 424 } | 424 } |
| 425 } | 425 } |
| 426 } | 426 } |
| 427 return unsatisfied; | 427 return unsatisfied; |
| 428 } | 428 } |
| 429 addConstraintsConsumingTo(v, coll) { | 429 addConstraintsConsumingTo(v, coll) { |
| 430 let determining = v.determinedBy; | 430 let determining = v.determinedBy; |
| 431 for (let i = 0; dart.notNull(i) < dart.notNull(v.constraints[dartx.length]
); i = dart.notNull(i) + 1) { | 431 for (let i = 0; dart.notNull(i) < dart.notNull(v.constraints[dartx.length]
); i = dart.notNull(i) + 1) { |
| 432 let c = v.constraints[dartx.get](i); | 432 let c = v.constraints[dartx.get](i); |
| 433 if (!dart.equals(c, determining) && dart.notNull(c.isSatisfied())) | 433 if (!dart.equals(c, determining) && dart.notNull(dart.dcall(c.isSatisfie
d))) |
| 434 coll[dartx.add](c); | 434 dart.dcall(coll[dartx.add], c); |
| 435 } | 435 } |
| 436 } | 436 } |
| 437 } | 437 } |
| 438 dart.setSignature(Planner, { | 438 dart.setSignature(Planner, { |
| 439 methods: () => ({ | 439 methods: () => ({ |
| 440 incrementalAdd: [dart.void, [Constraint]], | 440 incrementalAdd: [dart.void, [Constraint]], |
| 441 incrementalRemove: [dart.void, [Constraint]], | 441 incrementalRemove: [dart.void, [Constraint]], |
| 442 newMark: [core.int, []], | 442 newMark: [core.int, []], |
| 443 makePlan: [Plan, [core.List$(Constraint)]], | 443 makePlan: [Plan, [core.List$(Constraint)]], |
| 444 extractPlanFromConstraints: [Plan, [core.List$(Constraint)]], | 444 extractPlanFromConstraints: [Plan, [core.List$(Constraint)]], |
| 445 addPropagate: [core.bool, [Constraint, core.int]], | 445 addPropagate: [core.bool, [Constraint, core.int]], |
| 446 removePropagateFrom: [core.List$(Constraint), [Variable]], | 446 removePropagateFrom: [core.List$(Constraint), [Variable]], |
| 447 addConstraintsConsumingTo: [dart.void, [Variable, core.List$(Constraint)]] | 447 addConstraintsConsumingTo: [dart.void, [Variable, core.List$(Constraint)]] |
| 448 }) | 448 }) |
| 449 }); | 449 }); |
| 450 class Plan extends core.Object { | 450 class Plan extends core.Object { |
| 451 Plan() { | 451 Plan() { |
| 452 this.list = dart.list([], Constraint); | 452 this.list = dart.list([], Constraint); |
| 453 } | 453 } |
| 454 addConstraint(c) { | 454 addConstraint(c) { |
| 455 this.list[dartx.add](c); | 455 dart.dcall(this.list[dartx.add], c); |
| 456 } | 456 } |
| 457 size() { | 457 size() { |
| 458 return this.list[dartx.length]; | 458 return this.list[dartx.length]; |
| 459 } | 459 } |
| 460 execute() { | 460 execute() { |
| 461 for (let i = 0; dart.notNull(i) < dart.notNull(this.list[dartx.length]); i
= dart.notNull(i) + 1) { | 461 for (let i = 0; dart.notNull(i) < dart.notNull(this.list[dartx.length]); i
= dart.notNull(i) + 1) { |
| 462 this.list[dartx.get](i).execute(); | 462 dart.dcall(this.list[dartx.get](i).execute); |
| 463 } | 463 } |
| 464 } | 464 } |
| 465 } | 465 } |
| 466 dart.setSignature(Plan, { | 466 dart.setSignature(Plan, { |
| 467 methods: () => ({ | 467 methods: () => ({ |
| 468 addConstraint: [dart.void, [Constraint]], | 468 addConstraint: [dart.void, [Constraint]], |
| 469 size: [core.int, []], | 469 size: [core.int, []], |
| 470 execute: [dart.void, []] | 470 execute: [dart.void, []] |
| 471 }) | 471 }) |
| 472 }); | 472 }); |
| 473 function chainTest(n) { | 473 function chainTest(n) { |
| 474 exports.planner = new Planner(); | 474 exports.planner = new Planner(); |
| 475 let prev = null, first = null, last = null; | 475 let prev = null, first = null, last = null; |
| 476 for (let i = 0; dart.notNull(i) <= dart.notNull(n); i = dart.notNull(i) + 1)
{ | 476 for (let i = 0; dart.notNull(i) <= dart.notNull(n); i = dart.notNull(i) + 1)
{ |
| 477 let v = new Variable("v", 0); | 477 let v = new Variable("v", 0); |
| 478 if (prev != null) | 478 if (prev != null) |
| 479 new EqualityConstraint(prev, v, REQUIRED); | 479 new EqualityConstraint(prev, v, dart.as(REQUIRED, Strength)); |
| 480 if (i == 0) | 480 if (i == 0) |
| 481 first = v; | 481 first = v; |
| 482 if (i == n) | 482 if (i == n) |
| 483 last = v; | 483 last = v; |
| 484 prev = v; | 484 prev = v; |
| 485 } | 485 } |
| 486 new StayConstraint(last, STRONG_DEFAULT); | 486 new StayConstraint(last, dart.as(STRONG_DEFAULT, Strength)); |
| 487 let edit = new EditConstraint(first, PREFERRED); | 487 let edit = new EditConstraint(first, dart.as(PREFERRED, Strength)); |
| 488 let plan = exports.planner.extractPlanFromConstraints(dart.list([edit], Cons
traint)); | 488 let plan = dart.dcall(exports.planner.extractPlanFromConstraints, dart.list(
[edit], Constraint)); |
| 489 for (let i = 0; dart.notNull(i) < 100; i = dart.notNull(i) + 1) { | 489 for (let i = 0; dart.notNull(i) < 100; i = dart.notNull(i) + 1) { |
| 490 first.value = i; | 490 first.value = i; |
| 491 plan.execute(); | 491 dart.dcall(plan.execute); |
| 492 if (last.value != i) { | 492 if (last.value != i) { |
| 493 core.print("Chain test failed:"); | 493 dart.dcall(core.print, "Chain test failed:"); |
| 494 core.print(`Expected last value to be ${i} but it was ${last.value}.`); | 494 dart.dcall(core.print, `Expected last value to be ${i} but it was ${last
.value}.`); |
| 495 } | 495 } |
| 496 } | 496 } |
| 497 } | 497 } |
| 498 dart.fn(chainTest, dart.void, [core.int]); | 498 dart.fn(chainTest, dart.void, [core.int]); |
| 499 function projectionTest(n) { | 499 function projectionTest(n) { |
| 500 exports.planner = new Planner(); | 500 exports.planner = new Planner(); |
| 501 let scale = new Variable("scale", 10); | 501 let scale = new Variable("scale", 10); |
| 502 let offset = new Variable("offset", 1000); | 502 let offset = new Variable("offset", 1000); |
| 503 let src = null, dst = null; | 503 let src = null, dst = null; |
| 504 let dests = dart.list([], Variable); | 504 let dests = dart.list([], Variable); |
| 505 for (let i = 0; dart.notNull(i) < dart.notNull(n); i = dart.notNull(i) + 1)
{ | 505 for (let i = 0; dart.notNull(i) < dart.notNull(n); i = dart.notNull(i) + 1)
{ |
| 506 src = new Variable("src", i); | 506 src = new Variable("src", i); |
| 507 dst = new Variable("dst", i); | 507 dst = new Variable("dst", i); |
| 508 dests[dartx.add](dst); | 508 dart.dcall(dests[dartx.add], dst); |
| 509 new StayConstraint(src, NORMAL); | 509 new StayConstraint(src, dart.as(NORMAL, Strength)); |
| 510 new ScaleConstraint(src, scale, offset, dst, REQUIRED); | 510 new ScaleConstraint(src, scale, offset, dst, dart.as(REQUIRED, Strength)); |
| 511 } | 511 } |
| 512 change(src, 17); | 512 dart.dcall(change, src, 17); |
| 513 if (dst.value != 1170) | 513 if (dst.value != 1170) |
| 514 core.print("Projection 1 failed"); | 514 dart.dcall(core.print, "Projection 1 failed"); |
| 515 change(dst, 1050); | 515 dart.dcall(change, dst, 1050); |
| 516 if (src.value != 5) | 516 if (src.value != 5) |
| 517 core.print("Projection 2 failed"); | 517 dart.dcall(core.print, "Projection 2 failed"); |
| 518 change(scale, 5); | 518 dart.dcall(change, scale, 5); |
| 519 for (let i = 0; dart.notNull(i) < dart.notNull(n) - 1; i = dart.notNull(i) +
1) { | 519 for (let i = 0; dart.notNull(i) < dart.notNull(n) - 1; i = dart.notNull(i) +
1) { |
| 520 if (dests[dartx.get](i).value != dart.notNull(i) * 5 + 1000) | 520 if (dests[dartx.get](i).value != dart.notNull(i) * 5 + 1000) |
| 521 core.print("Projection 3 failed"); | 521 dart.dcall(core.print, "Projection 3 failed"); |
| 522 } | 522 } |
| 523 change(offset, 2000); | 523 dart.dcall(change, offset, 2000); |
| 524 for (let i = 0; dart.notNull(i) < dart.notNull(n) - 1; i = dart.notNull(i) +
1) { | 524 for (let i = 0; dart.notNull(i) < dart.notNull(n) - 1; i = dart.notNull(i) +
1) { |
| 525 if (dests[dartx.get](i).value != dart.notNull(i) * 5 + 2000) | 525 if (dests[dartx.get](i).value != dart.notNull(i) * 5 + 2000) |
| 526 core.print("Projection 4 failed"); | 526 dart.dcall(core.print, "Projection 4 failed"); |
| 527 } | 527 } |
| 528 } | 528 } |
| 529 dart.fn(projectionTest, dart.void, [core.int]); | 529 dart.fn(projectionTest, dart.void, [core.int]); |
| 530 function change(v, newValue) { | 530 function change(v, newValue) { |
| 531 let edit = new EditConstraint(v, PREFERRED); | 531 let edit = new EditConstraint(v, dart.as(PREFERRED, Strength)); |
| 532 let plan = exports.planner.extractPlanFromConstraints(dart.list([edit], Edit
Constraint)); | 532 let plan = dart.dcall(exports.planner.extractPlanFromConstraints, dart.list(
[edit], EditConstraint)); |
| 533 for (let i = 0; dart.notNull(i) < 10; i = dart.notNull(i) + 1) { | 533 for (let i = 0; dart.notNull(i) < 10; i = dart.notNull(i) + 1) { |
| 534 v.value = newValue; | 534 v.value = newValue; |
| 535 plan.execute(); | 535 dart.dcall(plan.execute); |
| 536 } | 536 } |
| 537 edit.destroyConstraint(); | 537 dart.dcall(edit.destroyConstraint); |
| 538 } | 538 } |
| 539 dart.fn(change, dart.void, [Variable, core.int]); | 539 dart.fn(change, dart.void, [Variable, core.int]); |
| 540 exports.planner = null; | 540 exports.planner = null; |
| 541 // Exports: | 541 // Exports: |
| 542 exports.main = main; | 542 exports.main = main; |
| 543 exports.DeltaBlue = DeltaBlue; | 543 exports.DeltaBlue = DeltaBlue; |
| 544 exports.Strength = Strength; | 544 exports.Strength = Strength; |
| 545 exports.REQUIRED = REQUIRED; | 545 exports.REQUIRED = REQUIRED; |
| 546 exports.STRONG_PREFERRED = STRONG_PREFERRED; | 546 exports.STRONG_PREFERRED = STRONG_PREFERRED; |
| 547 exports.PREFERRED = PREFERRED; | 547 exports.PREFERRED = PREFERRED; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 559 exports.BinaryConstraint = BinaryConstraint; | 559 exports.BinaryConstraint = BinaryConstraint; |
| 560 exports.ScaleConstraint = ScaleConstraint; | 560 exports.ScaleConstraint = ScaleConstraint; |
| 561 exports.EqualityConstraint = EqualityConstraint; | 561 exports.EqualityConstraint = EqualityConstraint; |
| 562 exports.Variable = Variable; | 562 exports.Variable = Variable; |
| 563 exports.Planner = Planner; | 563 exports.Planner = Planner; |
| 564 exports.Plan = Plan; | 564 exports.Plan = Plan; |
| 565 exports.chainTest = chainTest; | 565 exports.chainTest = chainTest; |
| 566 exports.projectionTest = projectionTest; | 566 exports.projectionTest = projectionTest; |
| 567 exports.change = change; | 567 exports.change = change; |
| 568 }); | 568 }); |
| OLD | NEW |