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 |