bench9000 0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +7 -0
- data/benchmarks/chunky_png/chunky-canvas-resampling-bilinear.rb +69 -0
- data/benchmarks/chunky_png/chunky-canvas-resampling-nearest-neighbor.rb +68 -0
- data/benchmarks/chunky_png/chunky-canvas-resampling-steps-residues.rb +37 -0
- data/benchmarks/chunky_png/chunky-canvas-resampling-steps.rb +37 -0
- data/benchmarks/chunky_png/chunky-color-a.rb +39 -0
- data/benchmarks/chunky_png/chunky-color-b.rb +39 -0
- data/benchmarks/chunky_png/chunky-color-compose-quick.rb +39 -0
- data/benchmarks/chunky_png/chunky-color-g.rb +39 -0
- data/benchmarks/chunky_png/chunky-color-r.rb +39 -0
- data/benchmarks/chunky_png/chunky-decode-png-image-pass.rb +74 -0
- data/benchmarks/chunky_png/chunky-encode-png-image-pass-to-stream.rb +84 -0
- data/benchmarks/chunky_png/chunky-operations-compose.rb +70 -0
- data/benchmarks/chunky_png/chunky-operations-replace.rb +69 -0
- data/benchmarks/chunky_png/chunky_png.patch +22 -0
- data/benchmarks/chunky_png/version.txt +2 -0
- data/benchmarks/classic/binary-trees.rb +100 -0
- data/benchmarks/classic/deltablue.rb +732 -0
- data/benchmarks/classic/fannkuch-redux.rb +111 -0
- data/benchmarks/classic/fasta-string.rb +71 -0
- data/benchmarks/classic/mandelbrot.rb +112 -0
- data/benchmarks/classic/matrix-multiply.rb +78 -0
- data/benchmarks/classic/n-body.rb +188 -0
- data/benchmarks/classic/pidigits.rb +88 -0
- data/benchmarks/classic/red-black.rb +363 -0
- data/benchmarks/classic/richards-kwargs.rb +403 -0
- data/benchmarks/classic/richards.rb +403 -0
- data/benchmarks/classic/spectral-norm.rb +95 -0
- data/benchmarks/default.config.rb +206 -0
- data/benchmarks/graph/connected.rb +62 -0
- data/benchmarks/literature/acid.rb +46 -0
- data/benchmarks/micro/pack-big-U-loop.rb +24 -0
- data/benchmarks/micro/pack-big-xLX-repeat.rb +22 -0
- data/benchmarks/micro/pack-small-mixture.rb +17 -0
- data/benchmarks/micro/string-equal.rb +28 -0
- data/benchmarks/octane/deltablue.rb +981 -0
- data/benchmarks/psd.rb/mock-logger.rb +23 -0
- data/benchmarks/psd.rb/psd-color-cmyk-to-rgb.rb +46 -0
- data/benchmarks/psd.rb/psd-compose-color-burn.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-color-dodge.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-darken.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-difference.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-exclusion.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-hard-light.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-hard-mix.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-lighten.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-linear-burn.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-linear-dodge.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-linear-light.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-multiply.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-normal.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-overlay.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-pin-light.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-screen.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-soft-light.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-vivid-light.rb +43 -0
- data/benchmarks/psd.rb/psd-imageformat-layerraw-parse-raw.rb +70 -0
- data/benchmarks/psd.rb/psd-imageformat-rle-decode-rle-channel.rb +87 -0
- data/benchmarks/psd.rb/psd-imagemode-cmyk-combine-cmyk-channel.rb +65 -0
- data/benchmarks/psd.rb/psd-imagemode-greyscale-combine-greyscale-channel.rb +68 -0
- data/benchmarks/psd.rb/psd-imagemode-rgb-combine-rgb-channel.rb +65 -0
- data/benchmarks/psd.rb/psd-renderer-blender-compose.rb +113 -0
- data/benchmarks/psd.rb/psd-renderer-clippingmask-apply.rb +129 -0
- data/benchmarks/psd.rb/psd-renderer-mask-apply.rb +137 -0
- data/benchmarks/psd.rb/psd-util-clamp.rb +42 -0
- data/benchmarks/psd.rb/psd-util-pad2.rb +42 -0
- data/benchmarks/psd.rb/psd-util-pad4.rb +42 -0
- data/benchmarks/psd.rb/psd_native.patch +99 -0
- data/benchmarks/psd.rb/version.txt +2 -0
- data/benchmarks/topaz/neural-net.rb +208 -0
- data/benchmarks/vm/codeload.rb +35 -0
- data/benchmarks/vm/fixtures/codeload/LICENSE.txt +25 -0
- data/benchmarks/vm/fixtures/codeload/lexer.rb +21493 -0
- data/bin/bench9000 +13 -0
- data/example/report.data +945 -0
- data/example/report.html +59178 -0
- data/lib/bench9000.rb +27 -0
- data/lib/bench9000/benchmark.rb +29 -0
- data/lib/bench9000/commands/command.rb +30 -0
- data/lib/bench9000/commands/compare-reference.rb +70 -0
- data/lib/bench9000/commands/compare.rb +43 -0
- data/lib/bench9000/commands/detail.rb +51 -0
- data/lib/bench9000/commands/list-benchmarks.rb +29 -0
- data/lib/bench9000/commands/list-implementations.rb +29 -0
- data/lib/bench9000/commands/reference.rb +46 -0
- data/lib/bench9000/commands/remove.rb +41 -0
- data/lib/bench9000/commands/report.rb +71 -0
- data/lib/bench9000/commands/score.rb +27 -0
- data/lib/bench9000/config.rb +88 -0
- data/lib/bench9000/group.rb +23 -0
- data/lib/bench9000/harness.rb +68 -0
- data/lib/bench9000/implementation.rb +134 -0
- data/lib/bench9000/json-formatter.rb +50 -0
- data/lib/bench9000/main.rb +268 -0
- data/lib/bench9000/measurement.rb +75 -0
- data/lib/bench9000/micro-harness.rb +39 -0
- data/lib/bench9000/options.rb +31 -0
- data/lib/bench9000/report/bootstrap-theme.css +5 -0
- data/lib/bench9000/report/bootstrap.css +5 -0
- data/lib/bench9000/report/bootstrap.js +6 -0
- data/lib/bench9000/report/chart.js +3432 -0
- data/lib/bench9000/report/chartjs.patch +91 -0
- data/lib/bench9000/report/jquery.js +4 -0
- data/lib/bench9000/report/report.html +177 -0
- data/lib/bench9000/report/report.js +547 -0
- data/lib/bench9000/stats.rb +41 -0
- data/readme.md +205 -0
- data/vendor/chunky_png/BENCHMARKS.rdoc +31 -0
- data/vendor/chunky_png/Gemfile +10 -0
- data/vendor/chunky_png/LICENSE +20 -0
- data/vendor/chunky_png/README.rdoc +84 -0
- data/vendor/chunky_png/Rakefile +11 -0
- data/vendor/chunky_png/benchmarks/decoding_benchmark.rb +36 -0
- data/vendor/chunky_png/benchmarks/encoding_benchmark.rb +40 -0
- data/vendor/chunky_png/benchmarks/filesize_benchmark.rb +28 -0
- data/vendor/chunky_png/chunky_png.gemspec +47 -0
- data/vendor/chunky_png/lib/chunky_png.rb +160 -0
- data/vendor/chunky_png/lib/chunky_png/canvas.rb +372 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/adam7_interlacing.rb +72 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/data_url_exporting.rb +15 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/data_url_importing.rb +21 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/drawing.rb +338 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/masking.rb +91 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/operations.rb +395 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/png_decoding.rb +492 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/png_encoding.rb +442 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/resampling.rb +147 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/stream_exporting.rb +58 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/stream_importing.rb +77 -0
- data/vendor/chunky_png/lib/chunky_png/chunk.rb +328 -0
- data/vendor/chunky_png/lib/chunky_png/color.rb +780 -0
- data/vendor/chunky_png/lib/chunky_png/compatibility.rb +15 -0
- data/vendor/chunky_png/lib/chunky_png/datastream.rb +185 -0
- data/vendor/chunky_png/lib/chunky_png/dimension.rb +113 -0
- data/vendor/chunky_png/lib/chunky_png/image.rb +79 -0
- data/vendor/chunky_png/lib/chunky_png/palette.rb +209 -0
- data/vendor/chunky_png/lib/chunky_png/point.rb +115 -0
- data/vendor/chunky_png/lib/chunky_png/rmagick.rb +43 -0
- data/vendor/chunky_png/lib/chunky_png/vector.rb +186 -0
- data/vendor/chunky_png/lib/chunky_png/version.rb +5 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/adam7_interlacing_spec.rb +106 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/data_url_exporting_spec.rb +13 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/data_url_importing_spec.rb +15 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/drawing_spec.rb +170 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/masking_spec.rb +51 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/operations_spec.rb +388 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/png_decoding_spec.rb +97 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/png_encoding_spec.rb +235 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/resampling_spec.rb +121 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/stream_exporting_spec.rb +59 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/stream_importing_spec.rb +31 -0
- data/vendor/chunky_png/spec/chunky_png/canvas_spec.rb +226 -0
- data/vendor/chunky_png/spec/chunky_png/color_spec.rb +251 -0
- data/vendor/chunky_png/spec/chunky_png/datastream_spec.rb +32 -0
- data/vendor/chunky_png/spec/chunky_png/dimension_spec.rb +48 -0
- data/vendor/chunky_png/spec/chunky_png/image_spec.rb +25 -0
- data/vendor/chunky_png/spec/chunky_png/point_spec.rb +76 -0
- data/vendor/chunky_png/spec/chunky_png/rmagick_spec.rb +23 -0
- data/vendor/chunky_png/spec/chunky_png/vector_spec.rb +104 -0
- data/vendor/chunky_png/spec/chunky_png_spec.rb +8 -0
- data/vendor/chunky_png/spec/png_suite/background_chunks/bgai4a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/background_chunks/bgai4a16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/background_chunks/bgan6a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/background_chunks/bgan6a16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/background_chunks/bgbn4a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/background_chunks/bggn4a16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/background_chunks/bgwn6a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/background_chunks/bgyn6a16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g01.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g02.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g04.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g16.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi2c08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi2c16.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi3p01.rgba +1 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi3p02.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi3p04.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi3p08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi4a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi4a08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi4a16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi4a16.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi6a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi6a08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi6a16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi6a16.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g01.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g02.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g04.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g16.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn2c08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn2c16.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn3p01.rgba +1 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn3p02.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn3p04.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn3p08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn4a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn4a08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn4a16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn4a16.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn6a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn6a08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn6a16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn6a16.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/broken/x00n0g01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/broken/xcrn0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/broken/xlfn0g04.png +13 -0
- data/vendor/chunky_png/spec/png_suite/chunk_ordering/oi1n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/chunk_ordering/oi1n2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/chunk_ordering/oi2n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/chunk_ordering/oi2n2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/chunk_ordering/oi4n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/chunk_ordering/oi4n2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/chunk_ordering/oi9n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/chunk_ordering/oi9n2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/compression_levels/z00n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/compression_levels/z03n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/compression_levels/z06n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/compression_levels/z09n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f00n0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f00n0g08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f00n0g08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f00n0g08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f00n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f00n2c08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f00n2c08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f00n2c08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f01n0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f01n0g08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f01n0g08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f01n0g08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f01n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f01n2c08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f01n2c08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f01n2c08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f02n0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f02n0g08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f02n0g08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f02n0g08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f02n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f02n2c08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f02n2c08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f02n2c08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f03n0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f03n0g08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f03n0g08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f03n0g08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f03n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f03n2c08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f03n2c08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f03n2c08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f04n0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f04n0g08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f04n0g08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f04n0g08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f04n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f04n2c08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f04n2c08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f04n2c08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g03n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g03n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g03n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g04n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g04n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g04n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g05n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g05n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g05n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g07n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g07n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g07n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g10n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g10n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g10n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g25n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g25n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g25n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/metadata/cm0n0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/metadata/cm7n0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/metadata/cm9n0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ccwn2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ccwn3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cdfn2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cdhn2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cdsn2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cdun2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ch1n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ch2n3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cs3n2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cs3n3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cs5n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cs5n3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cs8n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cs8n3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ct0n0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ct1n0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ctzn0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/pp0n2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/pp0n6a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ps1n0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ps1n2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ps2n0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ps2n2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s01i3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s01n3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s02i3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s02n3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s03i3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s03n3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s04i3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s04n3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s05i3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s05n3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s06i3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s06n3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s07i3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s07n3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s08i3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s08n3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s09i3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s09n3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s32i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s32n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s33i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s33n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s34i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s34n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s35i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s35n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s36i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s36n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s37i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s37n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s38i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s38n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s39i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s39n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s40i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s40n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbbn1g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbbn2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbbn3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbgn2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbgn3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbrn2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbwn1g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbwn3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbyn3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tp0n1g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tp0n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tp0n3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tp1n3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite_spec.rb +121 -0
- data/vendor/chunky_png/spec/resources/adam7.png +0 -0
- data/vendor/chunky_png/spec/resources/bezier_five_point.png +0 -0
- data/vendor/chunky_png/spec/resources/bezier_four_point.png +0 -0
- data/vendor/chunky_png/spec/resources/bezier_four_point_flipped.png +0 -0
- data/vendor/chunky_png/spec/resources/bezier_four_point_s.png +0 -0
- data/vendor/chunky_png/spec/resources/bezier_six_point.png +0 -0
- data/vendor/chunky_png/spec/resources/bezier_three_point.png +0 -0
- data/vendor/chunky_png/spec/resources/bezier_three_point_flipped.png +0 -0
- data/vendor/chunky_png/spec/resources/circles.png +0 -0
- data/vendor/chunky_png/spec/resources/clock.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_base.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_bl_xdown_ydown.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_bl_xdown_yup.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_bl_xup_yup.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_mask.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_mask_updated.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_nn_xdown_ydown.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_nn_xdown_yup.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_nn_xup_yup.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_updated.png +0 -0
- data/vendor/chunky_png/spec/resources/composited.png +0 -0
- data/vendor/chunky_png/spec/resources/cropped.png +0 -0
- data/vendor/chunky_png/spec/resources/damaged_chunk.png +0 -0
- data/vendor/chunky_png/spec/resources/damaged_signature.png +13 -0
- data/vendor/chunky_png/spec/resources/lines.png +0 -0
- data/vendor/chunky_png/spec/resources/operations.png +0 -0
- data/vendor/chunky_png/spec/resources/operations_border.png +0 -0
- data/vendor/chunky_png/spec/resources/operations_grayscale.png +0 -0
- data/vendor/chunky_png/spec/resources/partial_circles.png +0 -0
- data/vendor/chunky_png/spec/resources/pixelstream.bgr +67 -0
- data/vendor/chunky_png/spec/resources/pixelstream.rgb +67 -1
- data/vendor/chunky_png/spec/resources/pixelstream.rgba +67 -0
- data/vendor/chunky_png/spec/resources/pixelstream_best_compression.png +0 -0
- data/vendor/chunky_png/spec/resources/pixelstream_fast_rgba.png +0 -0
- data/vendor/chunky_png/spec/resources/pixelstream_reference.png +0 -0
- data/vendor/chunky_png/spec/resources/polygon_filled_horizontal.png +0 -0
- data/vendor/chunky_png/spec/resources/polygon_filled_vertical.png +0 -0
- data/vendor/chunky_png/spec/resources/polygon_triangle_filled.png +0 -0
- data/vendor/chunky_png/spec/resources/polygon_unfilled.png +0 -0
- data/vendor/chunky_png/spec/resources/rect.png +0 -0
- data/vendor/chunky_png/spec/resources/replaced.png +0 -0
- data/vendor/chunky_png/spec/resources/text_chunk.png +0 -0
- data/vendor/chunky_png/spec/resources/ztxt_chunk.png +0 -0
- data/vendor/chunky_png/spec/spec_helper.rb +52 -0
- data/vendor/chunky_png/tasks/benchmarks.rake +26 -0
- data/vendor/oily_png/Gemfile +4 -0
- data/vendor/oily_png/LICENSE +20 -0
- data/vendor/oily_png/README.rdoc +26 -0
- data/vendor/oily_png/Rakefile +19 -0
- data/vendor/oily_png/ext/oily_png/color.c +58 -0
- data/vendor/oily_png/ext/oily_png/color.h +29 -0
- data/vendor/oily_png/ext/oily_png/extconf.rb +3 -0
- data/vendor/oily_png/ext/oily_png/oily_png_ext.c +59 -0
- data/vendor/oily_png/ext/oily_png/oily_png_ext.h +72 -0
- data/vendor/oily_png/ext/oily_png/operations.c +122 -0
- data/vendor/oily_png/ext/oily_png/operations.h +36 -0
- data/vendor/oily_png/ext/oily_png/png_decoding.c +374 -0
- data/vendor/oily_png/ext/oily_png/png_decoding.h +27 -0
- data/vendor/oily_png/ext/oily_png/png_encoding.c +302 -0
- data/vendor/oily_png/ext/oily_png/png_encoding.h +19 -0
- data/vendor/oily_png/ext/oily_png/resampling.c +213 -0
- data/vendor/oily_png/ext/oily_png/resampling.h +25 -0
- data/vendor/oily_png/lib/oily_png.rb +21 -0
- data/vendor/oily_png/lib/oily_png/canvas.rb +15 -0
- data/vendor/oily_png/lib/oily_png/version.rb +3 -0
- data/vendor/oily_png/oily_png.gemspec +39 -0
- data/vendor/oily_png/spec/color_spec.rb +38 -0
- data/vendor/oily_png/spec/decoding_spec.rb +51 -0
- data/vendor/oily_png/spec/encoding_spec.rb +135 -0
- data/vendor/oily_png/spec/operations_spec.rb +52 -0
- data/vendor/oily_png/spec/resampling_spec.rb +51 -0
- data/vendor/oily_png/spec/resources/basi0g01.png +0 -0
- data/vendor/oily_png/spec/resources/basi0g02.png +0 -0
- data/vendor/oily_png/spec/resources/basi0g04.png +0 -0
- data/vendor/oily_png/spec/resources/basi0g08.png +0 -0
- data/vendor/oily_png/spec/resources/basi0g16.png +0 -0
- data/vendor/oily_png/spec/resources/basi2c08.png +0 -0
- data/vendor/oily_png/spec/resources/basi2c16.png +0 -0
- data/vendor/oily_png/spec/resources/basi3p01.png +0 -0
- data/vendor/oily_png/spec/resources/basi3p02.png +0 -0
- data/vendor/oily_png/spec/resources/basi3p04.png +0 -0
- data/vendor/oily_png/spec/resources/basi3p08.png +0 -0
- data/vendor/oily_png/spec/resources/basi4a08.png +0 -0
- data/vendor/oily_png/spec/resources/basi4a16.png +0 -0
- data/vendor/oily_png/spec/resources/basi6a08.png +0 -0
- data/vendor/oily_png/spec/resources/basi6a16.png +0 -0
- data/vendor/oily_png/spec/resources/basn0g01.png +0 -0
- data/vendor/oily_png/spec/resources/basn0g02.png +0 -0
- data/vendor/oily_png/spec/resources/basn0g04.png +0 -0
- data/vendor/oily_png/spec/resources/basn0g08.png +0 -0
- data/vendor/oily_png/spec/resources/basn0g16.png +0 -0
- data/vendor/oily_png/spec/resources/basn2c08.png +0 -0
- data/vendor/oily_png/spec/resources/basn2c16.png +0 -0
- data/vendor/oily_png/spec/resources/basn3p01.png +0 -0
- data/vendor/oily_png/spec/resources/basn3p02.png +0 -0
- data/vendor/oily_png/spec/resources/basn3p04.png +0 -0
- data/vendor/oily_png/spec/resources/basn3p08.png +0 -0
- data/vendor/oily_png/spec/resources/basn4a08.png +0 -0
- data/vendor/oily_png/spec/resources/basn4a16.png +0 -0
- data/vendor/oily_png/spec/resources/basn6a08.png +0 -0
- data/vendor/oily_png/spec/resources/basn6a16.png +0 -0
- data/vendor/oily_png/spec/resources/composited.png +0 -0
- data/vendor/oily_png/spec/resources/gray.png +0 -0
- data/vendor/oily_png/spec/resources/interlaced.png +0 -0
- data/vendor/oily_png/spec/resources/nonsquare.png +0 -0
- data/vendor/oily_png/spec/resources/operations.png +0 -0
- data/vendor/oily_png/spec/resources/replaced.png +0 -0
- data/vendor/oily_png/spec/resources/s01i3p01.png +0 -0
- data/vendor/oily_png/spec/resources/s01n3p01.png +0 -0
- data/vendor/oily_png/spec/resources/s02i3p01.png +0 -0
- data/vendor/oily_png/spec/resources/s02n3p01.png +0 -0
- data/vendor/oily_png/spec/resources/s03i3p01.png +0 -0
- data/vendor/oily_png/spec/resources/s03n3p01.png +0 -0
- data/vendor/oily_png/spec/resources/s04i3p01.png +0 -0
- data/vendor/oily_png/spec/resources/s04n3p01.png +0 -0
- data/vendor/oily_png/spec/resources/s05i3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s05n3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s06i3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s06n3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s07i3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s07n3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s08i3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s08n3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s09i3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s09n3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s32i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s32n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s33i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s33n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s34i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s34n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s35i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s35n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s36i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s36n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s37i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s37n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s38i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s38n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s39i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s39n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s40i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s40n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/square.png +0 -0
- data/vendor/oily_png/spec/resources/tbbn1g04.png +0 -0
- data/vendor/oily_png/spec/resources/tbbn2c16.png +0 -0
- data/vendor/oily_png/spec/resources/tbbn3p08.png +0 -0
- data/vendor/oily_png/spec/resources/tbgn2c16.png +0 -0
- data/vendor/oily_png/spec/resources/tbgn3p08.png +0 -0
- data/vendor/oily_png/spec/resources/tbrn2c08.png +0 -0
- data/vendor/oily_png/spec/resources/tbwn1g16.png +0 -0
- data/vendor/oily_png/spec/resources/tbwn3p08.png +0 -0
- data/vendor/oily_png/spec/resources/tbyn3p08.png +0 -0
- data/vendor/oily_png/spec/resources/tp0n1g08.png +0 -0
- data/vendor/oily_png/spec/resources/tp0n2c08.png +0 -0
- data/vendor/oily_png/spec/resources/tp0n3p08.png +0 -0
- data/vendor/oily_png/spec/resources/tp1n3p08.png +0 -0
- data/vendor/oily_png/spec/spec_helper.rb +40 -0
- data/vendor/oily_png/tasks/testing.rake +49 -0
- data/vendor/psd.rb/CONTRIBUTING.md +7 -0
- data/vendor/psd.rb/Gemfile +2 -0
- data/vendor/psd.rb/Guardfile +8 -0
- data/vendor/psd.rb/LICENSE.txt +22 -0
- data/vendor/psd.rb/README.md +235 -0
- data/vendor/psd.rb/Rakefile +6 -0
- data/vendor/psd.rb/circle.yml +6 -0
- data/vendor/psd.rb/examples/build_image.rb +16 -0
- data/vendor/psd.rb/examples/export_image.rb +12 -0
- data/vendor/psd.rb/examples/export_layer_images.rb +19 -0
- data/vendor/psd.rb/examples/export_node.rb +7 -0
- data/vendor/psd.rb/examples/export_text_data.rb +13 -0
- data/vendor/psd.rb/examples/guides.rb +17 -0
- data/vendor/psd.rb/examples/images/comp-example.psd +0 -0
- data/vendor/psd.rb/examples/images/example-cmyk.psd +0 -0
- data/vendor/psd.rb/examples/images/example-greyscale.psd +0 -0
- data/vendor/psd.rb/examples/images/example-nocompat.psd +0 -0
- data/vendor/psd.rb/examples/images/example.psd +0 -0
- data/vendor/psd.rb/examples/images/example16.psd +0 -0
- data/vendor/psd.rb/examples/images/guides.psd +0 -0
- data/vendor/psd.rb/examples/layer_comps.rb +20 -0
- data/vendor/psd.rb/examples/parse.rb +36 -0
- data/vendor/psd.rb/examples/path.rb +7 -0
- data/vendor/psd.rb/examples/profile.rb +15 -0
- data/vendor/psd.rb/examples/slices.rb +17 -0
- data/vendor/psd.rb/examples/tree.rb +8 -0
- data/vendor/psd.rb/examples/unimplemented_info.rb +9 -0
- data/vendor/psd.rb/lib/psd.rb +173 -0
- data/vendor/psd.rb/lib/psd/blend_mode.rb +80 -0
- data/vendor/psd.rb/lib/psd/channel_image.rb +115 -0
- data/vendor/psd.rb/lib/psd/color.rb +125 -0
- data/vendor/psd.rb/lib/psd/descriptor.rb +200 -0
- data/vendor/psd.rb/lib/psd/file.rb +104 -0
- data/vendor/psd.rb/lib/psd/header.rb +69 -0
- data/vendor/psd.rb/lib/psd/helpers.rb +51 -0
- data/vendor/psd.rb/lib/psd/image.rb +123 -0
- data/vendor/psd.rb/lib/psd/image_exports/png.rb +31 -0
- data/vendor/psd.rb/lib/psd/image_formats/layer_raw.rb +21 -0
- data/vendor/psd.rb/lib/psd/image_formats/layer_rle.rb +24 -0
- data/vendor/psd.rb/lib/psd/image_formats/raw.rb +12 -0
- data/vendor/psd.rb/lib/psd/image_formats/rle.rb +63 -0
- data/vendor/psd.rb/lib/psd/image_modes/cmyk.rb +31 -0
- data/vendor/psd.rb/lib/psd/image_modes/greyscale.rb +22 -0
- data/vendor/psd.rb/lib/psd/image_modes/rgb.rb +32 -0
- data/vendor/psd.rb/lib/psd/layer.rb +77 -0
- data/vendor/psd.rb/lib/psd/layer/blend_modes.rb +30 -0
- data/vendor/psd.rb/lib/psd/layer/blending_ranges.rb +62 -0
- data/vendor/psd.rb/lib/psd/layer/channel_image.rb +15 -0
- data/vendor/psd.rb/lib/psd/layer/exporting.rb +28 -0
- data/vendor/psd.rb/lib/psd/layer/helpers.rb +77 -0
- data/vendor/psd.rb/lib/psd/layer/info.rb +74 -0
- data/vendor/psd.rb/lib/psd/layer/mask.rb +19 -0
- data/vendor/psd.rb/lib/psd/layer/name.rb +33 -0
- data/vendor/psd.rb/lib/psd/layer/path_components.rb +22 -0
- data/vendor/psd.rb/lib/psd/layer/position_and_channels.rb +47 -0
- data/vendor/psd.rb/lib/psd/layer_info.rb +27 -0
- data/vendor/psd.rb/lib/psd/layer_info/blend_clipping_elements.rb +13 -0
- data/vendor/psd.rb/lib/psd/layer_info/blend_interior_elements.rb +13 -0
- data/vendor/psd.rb/lib/psd/layer_info/fill_opacity.rb +13 -0
- data/vendor/psd.rb/lib/psd/layer_info/layer_group.rb +30 -0
- data/vendor/psd.rb/lib/psd/layer_info/layer_id.rb +13 -0
- data/vendor/psd.rb/lib/psd/layer_info/layer_name_source.rb +14 -0
- data/vendor/psd.rb/lib/psd/layer_info/layer_section_divider.rb +48 -0
- data/vendor/psd.rb/lib/psd/layer_info/legacy_typetool.rb +88 -0
- data/vendor/psd.rb/lib/psd/layer_info/locked.rb +19 -0
- data/vendor/psd.rb/lib/psd/layer_info/metadata_setting.rb +35 -0
- data/vendor/psd.rb/lib/psd/layer_info/object_effects.rb +16 -0
- data/vendor/psd.rb/lib/psd/layer_info/placed_layer.rb +13 -0
- data/vendor/psd.rb/lib/psd/layer_info/reference_point.rb +16 -0
- data/vendor/psd.rb/lib/psd/layer_info/typetool.rb +165 -0
- data/vendor/psd.rb/lib/psd/layer_info/unicode_name.rb +17 -0
- data/vendor/psd.rb/lib/psd/layer_info/vector_mask.rb +25 -0
- data/vendor/psd.rb/lib/psd/layer_info/vector_mask_2.rb +10 -0
- data/vendor/psd.rb/lib/psd/layer_info/vector_stroke.rb +12 -0
- data/vendor/psd.rb/lib/psd/layer_info/vector_stroke_content.rb +15 -0
- data/vendor/psd.rb/lib/psd/layer_mask.rb +129 -0
- data/vendor/psd.rb/lib/psd/lazy_execute.rb +60 -0
- data/vendor/psd.rb/lib/psd/logger.rb +40 -0
- data/vendor/psd.rb/lib/psd/mask.rb +74 -0
- data/vendor/psd.rb/lib/psd/node.rb +70 -0
- data/vendor/psd.rb/lib/psd/node_exporting.rb +20 -0
- data/vendor/psd.rb/lib/psd/node_group.rb +86 -0
- data/vendor/psd.rb/lib/psd/node_layer.rb +81 -0
- data/vendor/psd.rb/lib/psd/node_root.rb +93 -0
- data/vendor/psd.rb/lib/psd/nodes/ancestry.rb +98 -0
- data/vendor/psd.rb/lib/psd/nodes/build_preview.rb +17 -0
- data/vendor/psd.rb/lib/psd/nodes/has_children.rb +13 -0
- data/vendor/psd.rb/lib/psd/nodes/lock_to_origin.rb +7 -0
- data/vendor/psd.rb/lib/psd/nodes/parse_layers.rb +18 -0
- data/vendor/psd.rb/lib/psd/nodes/search.rb +91 -0
- data/vendor/psd.rb/lib/psd/path_record.rb +180 -0
- data/vendor/psd.rb/lib/psd/renderer.rb +91 -0
- data/vendor/psd.rb/lib/psd/renderer/blender.rb +53 -0
- data/vendor/psd.rb/lib/psd/renderer/canvas.rb +95 -0
- data/vendor/psd.rb/lib/psd/renderer/canvas_management.rb +26 -0
- data/vendor/psd.rb/lib/psd/renderer/clipping_mask.rb +41 -0
- data/vendor/psd.rb/lib/psd/renderer/compose.rb +361 -0
- data/vendor/psd.rb/lib/psd/renderer/layer_styles.rb +56 -0
- data/vendor/psd.rb/lib/psd/renderer/layer_styles/color_overlay.rb +65 -0
- data/vendor/psd.rb/lib/psd/renderer/layer_styles/drop_shadow.rb +75 -0
- data/vendor/psd.rb/lib/psd/renderer/mask.rb +46 -0
- data/vendor/psd.rb/lib/psd/resource.rb +26 -0
- data/vendor/psd.rb/lib/psd/resource_section.rb +22 -0
- data/vendor/psd.rb/lib/psd/resources.rb +69 -0
- data/vendor/psd.rb/lib/psd/resources/guides.rb +35 -0
- data/vendor/psd.rb/lib/psd/resources/layer_comps.rb +42 -0
- data/vendor/psd.rb/lib/psd/resources/slices.rb +132 -0
- data/vendor/psd.rb/lib/psd/section.rb +26 -0
- data/vendor/psd.rb/lib/psd/util.rb +18 -0
- data/vendor/psd.rb/lib/psd/version.rb +3 -0
- data/vendor/psd.rb/psd.gemspec +32 -0
- data/vendor/psd.rb/spec/files/blendmodes.psd +0 -0
- data/vendor/psd.rb/spec/files/empty-layer-subgroups.psd +0 -0
- data/vendor/psd.rb/spec/files/empty-layer.psd +0 -0
- data/vendor/psd.rb/spec/files/example.psd +0 -0
- data/vendor/psd.rb/spec/files/guides.psd +0 -0
- data/vendor/psd.rb/spec/files/locked.psd +0 -0
- data/vendor/psd.rb/spec/files/one_layer.psd +0 -0
- data/vendor/psd.rb/spec/files/path.psd +0 -0
- data/vendor/psd.rb/spec/files/pixel.psd +0 -0
- data/vendor/psd.rb/spec/files/simplest.psd +0 -0
- data/vendor/psd.rb/spec/files/slices.psd +0 -0
- data/vendor/psd.rb/spec/files/text.psd +0 -0
- data/vendor/psd.rb/spec/guides_spec.rb +34 -0
- data/vendor/psd.rb/spec/hierarchy_spec.rb +152 -0
- data/vendor/psd.rb/spec/image_spec.rb +86 -0
- data/vendor/psd.rb/spec/lazy_execute_spec.rb +20 -0
- data/vendor/psd.rb/spec/locked_spec.rb +78 -0
- data/vendor/psd.rb/spec/parsing_spec.rb +163 -0
- data/vendor/psd.rb/spec/psd_spec.rb +37 -0
- data/vendor/psd.rb/spec/slices_spec.rb +57 -0
- data/vendor/psd.rb/spec/spec_helper.rb +13 -0
- data/vendor/psd.rb/spec/text_spec.rb +27 -0
- data/vendor/psd_native/Gemfile +4 -0
- data/vendor/psd_native/Guardfile +6 -0
- data/vendor/psd_native/LICENSE.txt +22 -0
- data/vendor/psd_native/README.md +48 -0
- data/vendor/psd_native/Rakefile +13 -0
- data/vendor/psd_native/ext/psd_native/blender.c +57 -0
- data/vendor/psd_native/ext/psd_native/blender.h +6 -0
- data/vendor/psd_native/ext/psd_native/canvas.c +9 -0
- data/vendor/psd_native/ext/psd_native/canvas.h +6 -0
- data/vendor/psd_native/ext/psd_native/clipping_mask.c +57 -0
- data/vendor/psd_native/ext/psd_native/clipping_mask.h +6 -0
- data/vendor/psd_native/ext/psd_native/color.c +20 -0
- data/vendor/psd_native/ext/psd_native/color.h +18 -0
- data/vendor/psd_native/ext/psd_native/compose.c +394 -0
- data/vendor/psd_native/ext/psd_native/compose.h +43 -0
- data/vendor/psd_native/ext/psd_native/extconf.rb +3 -0
- data/vendor/psd_native/ext/psd_native/file.c +20 -0
- data/vendor/psd_native/ext/psd_native/file.h +9 -0
- data/vendor/psd_native/ext/psd_native/image_mode_cmyk.c +64 -0
- data/vendor/psd_native/ext/psd_native/image_mode_cmyk.h +6 -0
- data/vendor/psd_native/ext/psd_native/image_mode_greyscale.c +27 -0
- data/vendor/psd_native/ext/psd_native/image_mode_greyscale.h +6 -0
- data/vendor/psd_native/ext/psd_native/image_mode_rgb.c +49 -0
- data/vendor/psd_native/ext/psd_native/image_mode_rgb.h +6 -0
- data/vendor/psd_native/ext/psd_native/layer_raw.c +20 -0
- data/vendor/psd_native/ext/psd_native/layer_raw.h +6 -0
- data/vendor/psd_native/ext/psd_native/mask.c +52 -0
- data/vendor/psd_native/ext/psd_native/mask.h +6 -0
- data/vendor/psd_native/ext/psd_native/psd_native_ext.c +87 -0
- data/vendor/psd_native/ext/psd_native/psd_native_ext.h +31 -0
- data/vendor/psd_native/ext/psd_native/rle_decoding.c +53 -0
- data/vendor/psd_native/ext/psd_native/rle_decoding.h +6 -0
- data/vendor/psd_native/ext/psd_native/util.c +17 -0
- data/vendor/psd_native/ext/psd_native/util.h +8 -0
- data/vendor/psd_native/lib/psd_native.rb +35 -0
- data/vendor/psd_native/lib/psd_native/compose.rb +19 -0
- data/vendor/psd_native/lib/psd_native/version.rb +3 -0
- data/vendor/psd_native/psd_native.gemspec +35 -0
- data/vendor/psd_native/spec/files/example.psd +0 -0
- data/vendor/psd_native/spec/files/one_layer.psd +0 -0
- data/vendor/psd_native/spec/files/path.psd +0 -0
- data/vendor/psd_native/spec/files/pixel.psd +0 -0
- data/vendor/psd_native/spec/files/simplest.psd +0 -0
- data/vendor/psd_native/spec/files/text.psd +0 -0
- data/vendor/psd_native/spec/image_spec.rb +86 -0
- data/vendor/psd_native/spec/psd_spec.rb +37 -0
- data/vendor/psd_native/spec/spec_helper.rb +13 -0
- data/vendor/psd_native/spec/util_spec.rb +15 -0
- metadata +767 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
def micro_harness_input
|
2
|
+
[1, 2, 3, 4, 5, 6, 7, 8]
|
3
|
+
end
|
4
|
+
|
5
|
+
def micro_harness_iterations
|
6
|
+
1_000_000
|
7
|
+
end
|
8
|
+
|
9
|
+
def micro_harness_sample(input)
|
10
|
+
input.pack('CSLQcslq').sum
|
11
|
+
end
|
12
|
+
|
13
|
+
def micro_harness_expected
|
14
|
+
36
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'bench9000/micro-harness'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
def micro_harness_input
|
2
|
+
s = "abcdefghij" * 1_000_000
|
3
|
+
t = s.dup
|
4
|
+
|
5
|
+
# Ensure to unshare the underlying buffers
|
6
|
+
t[0] = 'z'
|
7
|
+
t[0] = 'a'
|
8
|
+
|
9
|
+
[s, t]
|
10
|
+
end
|
11
|
+
|
12
|
+
def micro_harness_iterations
|
13
|
+
100
|
14
|
+
end
|
15
|
+
|
16
|
+
def micro_harness_sample(input)
|
17
|
+
s = input[0]
|
18
|
+
t = input[1]
|
19
|
+
|
20
|
+
r = s == t
|
21
|
+
r ? 1 : 0
|
22
|
+
end
|
23
|
+
|
24
|
+
def micro_harness_expected
|
25
|
+
1
|
26
|
+
end
|
27
|
+
|
28
|
+
require 'bench9000/micro-harness'
|
@@ -0,0 +1,981 @@
|
|
1
|
+
# Copyright 2008 the V8 project authors. All rights reserved.
|
2
|
+
# Copyright 1996 John Maloney and Mario Wolczko.
|
3
|
+
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation; either version 2 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU General Public License
|
15
|
+
# along with this program; if not, write to the Free Software
|
16
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
17
|
+
|
18
|
+
|
19
|
+
# This implementation of the DeltaBlue benchmark is derived
|
20
|
+
# from the Smalltalk implementation by John Maloney and Mario
|
21
|
+
# Wolczko. Some parts have been translated directly, whereas
|
22
|
+
# others have been modified more aggresively to make it feel
|
23
|
+
# more like a JavaScript program.
|
24
|
+
|
25
|
+
# Transliterated directly to Ruby by Chris Seaton
|
26
|
+
|
27
|
+
def alert(message)
|
28
|
+
puts message
|
29
|
+
abort
|
30
|
+
end
|
31
|
+
|
32
|
+
#DeltaBlue = BenchmarkSuite.new('DeltaBlue', [66118], [
|
33
|
+
# Benchmark.new('DeltaBlue', true, false, deltaBlue)
|
34
|
+
#])
|
35
|
+
|
36
|
+
# A JavaScript implementation of the DeltaBlue constraint-solving
|
37
|
+
# algorithm, as described in:
|
38
|
+
#
|
39
|
+
# "The DeltaBlue Algorithm: An Incremental Constraint Hierarchy Solver"
|
40
|
+
# Bjorn N. Freeman-Benson and John Maloney
|
41
|
+
# January 1990 Communications of the ACM,
|
42
|
+
# also available as University of Washington TR 89-08-06.
|
43
|
+
#
|
44
|
+
# Beware: this benchmark is written in a grotesque style where
|
45
|
+
# the constraint model is built by side-effects from constructors.
|
46
|
+
# I've kept it this way to avoid deviating too much from the original
|
47
|
+
# implementation.
|
48
|
+
|
49
|
+
|
50
|
+
# --- O b j e c t M o d e l --- */
|
51
|
+
|
52
|
+
class OrderedCollection
|
53
|
+
|
54
|
+
def initialize
|
55
|
+
@elms = Array.new()
|
56
|
+
end
|
57
|
+
|
58
|
+
def add(elm)
|
59
|
+
@elms.push(elm)
|
60
|
+
end
|
61
|
+
|
62
|
+
def at(index)
|
63
|
+
return @elms[index]
|
64
|
+
end
|
65
|
+
|
66
|
+
def size()
|
67
|
+
return @elms.length
|
68
|
+
end
|
69
|
+
|
70
|
+
def removeFirst()
|
71
|
+
return @elms.pop()
|
72
|
+
end
|
73
|
+
|
74
|
+
def remove(elm)
|
75
|
+
index = 0
|
76
|
+
skipped = 0
|
77
|
+
i = 0
|
78
|
+
while i < @elms.length
|
79
|
+
value = @elms[i]
|
80
|
+
if (value != elm)
|
81
|
+
@elms[index] = value
|
82
|
+
index+= 1
|
83
|
+
else
|
84
|
+
skipped+= 1
|
85
|
+
end
|
86
|
+
i += 1
|
87
|
+
end
|
88
|
+
i = 0
|
89
|
+
while i < skipped
|
90
|
+
@elms.pop()
|
91
|
+
i += 1
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
# --- *
|
98
|
+
# S t r e n g t h
|
99
|
+
# --- */
|
100
|
+
|
101
|
+
# *
|
102
|
+
# Strengths are used to measure the relative importance of constraints.
|
103
|
+
# New strengths may be inserted in the strength hierarchy without
|
104
|
+
# disrupting current constraints. Strengths cannot be created outside
|
105
|
+
# this class, so pointer comparison can be used for value comparison.
|
106
|
+
# /
|
107
|
+
|
108
|
+
class Strength
|
109
|
+
|
110
|
+
attr_reader :strengthValue
|
111
|
+
|
112
|
+
def initialize(strengthValue, name)
|
113
|
+
@strengthValue = strengthValue
|
114
|
+
@name = name
|
115
|
+
end
|
116
|
+
|
117
|
+
def self.stronger(s1, s2)
|
118
|
+
return s1.strengthValue < s2.strengthValue
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.weaker(s1, s2)
|
122
|
+
return s1.strengthValue > s2.strengthValue
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.weakestOf(s1, s2)
|
126
|
+
return weaker(s1, s2) ? s1 : s2
|
127
|
+
end
|
128
|
+
|
129
|
+
def self.strongest(s1, s2)
|
130
|
+
return stronger(s1, s2) ? s1 : s2
|
131
|
+
end
|
132
|
+
|
133
|
+
def nextWeaker
|
134
|
+
case (@strengthValue)
|
135
|
+
when 0; return WEAKEST
|
136
|
+
when 1; return WEAK_DEFAULT
|
137
|
+
when 2; return NORMAL
|
138
|
+
when 3; return STRONG_DEFAULT
|
139
|
+
when 4; return PREFERRED
|
140
|
+
when 5; return REQUIRED
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# Strength constants.
|
145
|
+
REQUIRED = new(0, "required")
|
146
|
+
STONG_PREFERRED = new(1, "strongPreferred")
|
147
|
+
PREFERRED = new(2, "preferred")
|
148
|
+
STRONG_DEFAULT = new(3, "strongDefault")
|
149
|
+
NORMAL = new(4, "normal")
|
150
|
+
WEAK_DEFAULT = new(5, "weakDefault")
|
151
|
+
WEAKEST = new(6, "weakest")
|
152
|
+
|
153
|
+
end
|
154
|
+
|
155
|
+
# --- *
|
156
|
+
# C o n s t r a i n t
|
157
|
+
# --- */
|
158
|
+
|
159
|
+
# *
|
160
|
+
# An abstract class representing a system-maintainable relationship
|
161
|
+
# (or "constraint") between a set of variables. A constraint supplies
|
162
|
+
# a strength instance variable; concrete subclasses provide a means
|
163
|
+
# of storing the constrained variables and other information required
|
164
|
+
# to represent a constraint.
|
165
|
+
# /
|
166
|
+
|
167
|
+
class Constraint
|
168
|
+
|
169
|
+
attr_reader :strength
|
170
|
+
|
171
|
+
def initialize(strength)
|
172
|
+
@strength = strength
|
173
|
+
end
|
174
|
+
|
175
|
+
# *
|
176
|
+
# Activate this constraint and attempt to satisfy it.
|
177
|
+
# /
|
178
|
+
def addConstraint
|
179
|
+
addToGraph()
|
180
|
+
$planner.incrementalAdd(self)
|
181
|
+
end
|
182
|
+
|
183
|
+
# *
|
184
|
+
# Attempt to find a way to enforce this constraint. If successful,
|
185
|
+
# record the solution, perhaps modifying the current dataflow
|
186
|
+
# graph. Answer the constraint that this constraint overrides, if
|
187
|
+
# there is one, or nil, if there isn't.
|
188
|
+
# Assume: I am not already satisfied.
|
189
|
+
# /
|
190
|
+
def satisfy(mark)
|
191
|
+
chooseMethod(mark)
|
192
|
+
if (!isSatisfied())
|
193
|
+
alert("Could not satisfy a required constraint!") if (@strength == Strength::REQUIRED)
|
194
|
+
return nil
|
195
|
+
end
|
196
|
+
markInputs(mark)
|
197
|
+
out = output()
|
198
|
+
overridden = out.determinedBy
|
199
|
+
overridden.markUnsatisfied() if (overridden != nil)
|
200
|
+
out.determinedBy = self
|
201
|
+
alert("Cycle encountered") if (!$planner.addPropagate(self, mark))
|
202
|
+
out.mark = mark
|
203
|
+
return overridden
|
204
|
+
end
|
205
|
+
|
206
|
+
def destroyConstraint
|
207
|
+
if (isSatisfied())
|
208
|
+
$planner.incrementalRemove(self)
|
209
|
+
else
|
210
|
+
removeFromGraph()
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
# *
|
215
|
+
# Normal constraints are not input constraints. An input constraint
|
216
|
+
# is one that depends on external state, such as the mouse, the
|
217
|
+
# keybord, a clock, or some arbitraty piece of imperative code.
|
218
|
+
# /
|
219
|
+
def isInput
|
220
|
+
return false
|
221
|
+
end
|
222
|
+
|
223
|
+
end
|
224
|
+
|
225
|
+
# --- *
|
226
|
+
# U n a r y C o n s t r a i n t
|
227
|
+
# --- */
|
228
|
+
|
229
|
+
# *
|
230
|
+
# Abstract superclass for constraints having a single possible output
|
231
|
+
# variable.
|
232
|
+
# /
|
233
|
+
|
234
|
+
class UnaryConstraint < Constraint
|
235
|
+
|
236
|
+
def initialize(v, strength)
|
237
|
+
super(strength)
|
238
|
+
@myOutput = v
|
239
|
+
@satisfied = false
|
240
|
+
addConstraint()
|
241
|
+
end
|
242
|
+
|
243
|
+
#UnaryConstraint.inheritsFrom(Constraint)
|
244
|
+
|
245
|
+
# *
|
246
|
+
# Adds this constraint to the constraint graph
|
247
|
+
# /
|
248
|
+
def addToGraph
|
249
|
+
@myOutput.addConstraint(self)
|
250
|
+
@satisfied = false
|
251
|
+
end
|
252
|
+
|
253
|
+
# *
|
254
|
+
# Decides if this constraint can be satisfied and records that
|
255
|
+
# decision.
|
256
|
+
# /
|
257
|
+
def chooseMethod(mark)
|
258
|
+
@satisfied = (@myOutput.mark != mark) && Strength::stronger(@strength, @myOutput.walkStrength)
|
259
|
+
end
|
260
|
+
|
261
|
+
# *
|
262
|
+
# Returns true if this constraint is satisfied in the current solution.
|
263
|
+
# /
|
264
|
+
def isSatisfied
|
265
|
+
return @satisfied
|
266
|
+
end
|
267
|
+
|
268
|
+
def markInputs(mark)
|
269
|
+
# has no inputs
|
270
|
+
end
|
271
|
+
|
272
|
+
# *
|
273
|
+
# Returns the current output variable.
|
274
|
+
# /
|
275
|
+
def output
|
276
|
+
return @myOutput
|
277
|
+
end
|
278
|
+
|
279
|
+
# *
|
280
|
+
# Calculate the walkabout strength, the stay flag, and, if it is
|
281
|
+
# 'stay', the value for the current output of this constraint. Assume
|
282
|
+
# this constraint is satisfied.
|
283
|
+
# /
|
284
|
+
def recalculate
|
285
|
+
@myOutput.walkStrength = @strength
|
286
|
+
@myOutput.stay = !isInput()
|
287
|
+
execute() if (@myOutput.stay)# Stay optimization
|
288
|
+
end
|
289
|
+
|
290
|
+
# *
|
291
|
+
# Records that this constraint is unsatisfied
|
292
|
+
# /
|
293
|
+
def markUnsatisfied
|
294
|
+
@satisfied = false
|
295
|
+
end
|
296
|
+
|
297
|
+
def inputsKnown(x)
|
298
|
+
return true
|
299
|
+
end
|
300
|
+
|
301
|
+
def removeFromGraph
|
302
|
+
@myOutput.removeConstraint(self) if (@myOutput != nil)
|
303
|
+
@satisfied = false
|
304
|
+
end
|
305
|
+
|
306
|
+
end
|
307
|
+
|
308
|
+
# --- *
|
309
|
+
# S t a y C o n s t r a i n t
|
310
|
+
# --- */
|
311
|
+
|
312
|
+
# *
|
313
|
+
# Variables that should, with some level of preference, stay the same.
|
314
|
+
# Planners may exploit the fact that instances, if satisfied, will not
|
315
|
+
# change their output during plan execution. This is called "stay
|
316
|
+
# optimization".
|
317
|
+
# /
|
318
|
+
|
319
|
+
class StayConstraint < UnaryConstraint
|
320
|
+
|
321
|
+
def initialize(v, str)
|
322
|
+
super(v, str)
|
323
|
+
end
|
324
|
+
|
325
|
+
#StayConstraint.inheritsFrom(UnaryConstraint)
|
326
|
+
|
327
|
+
def execute
|
328
|
+
# Stay constraints do nothing
|
329
|
+
end
|
330
|
+
|
331
|
+
end
|
332
|
+
|
333
|
+
# --- *
|
334
|
+
# E d i t C o n s t r a i n t
|
335
|
+
# --- */
|
336
|
+
|
337
|
+
# *
|
338
|
+
# A unary input constraint used to mark a variable that the client
|
339
|
+
# wishes to change.
|
340
|
+
# /
|
341
|
+
|
342
|
+
class EditConstraint < UnaryConstraint
|
343
|
+
|
344
|
+
def initialize(v, str)
|
345
|
+
super(v, str)
|
346
|
+
end
|
347
|
+
|
348
|
+
#EditConstraint.inheritsFrom(UnaryConstraint)
|
349
|
+
|
350
|
+
# *
|
351
|
+
# Edits indicate that a variable is to be changed by imperative code.
|
352
|
+
# /
|
353
|
+
def isInput
|
354
|
+
return true
|
355
|
+
end
|
356
|
+
|
357
|
+
def execute
|
358
|
+
# Edit constraints do nothing
|
359
|
+
end
|
360
|
+
|
361
|
+
end
|
362
|
+
|
363
|
+
# --- *
|
364
|
+
# B i n a r y C o n s t r a i n t
|
365
|
+
# --- */
|
366
|
+
|
367
|
+
module Direction
|
368
|
+
NONE = 0
|
369
|
+
FORWARD = 1
|
370
|
+
BACKWARD = -1
|
371
|
+
end
|
372
|
+
|
373
|
+
class BinaryConstraint < Constraint
|
374
|
+
|
375
|
+
# *
|
376
|
+
# Abstract superclass for constraints having two possible output
|
377
|
+
# variables.
|
378
|
+
# /
|
379
|
+
def initialize(var1, var2, strength)
|
380
|
+
super(strength)
|
381
|
+
@v1 = var1
|
382
|
+
@v2 = var2
|
383
|
+
@direction = Direction::NONE
|
384
|
+
addConstraint()
|
385
|
+
end
|
386
|
+
|
387
|
+
#BinaryConstraint.inheritsFrom(Constraint)
|
388
|
+
|
389
|
+
# *
|
390
|
+
# Decides if this constraint can be satisfied and which way it
|
391
|
+
# should flow based on the relative strength of the variables related,
|
392
|
+
# and record that decision.
|
393
|
+
# /
|
394
|
+
def chooseMethod(mark)
|
395
|
+
if (@v1.mark == mark)
|
396
|
+
@direction = (@v2.mark != mark && Strength::stronger(@strength, @v2.walkStrength)) ? Direction::FORWARD : Direction::NONE
|
397
|
+
return
|
398
|
+
end
|
399
|
+
if (@v2.mark == mark)
|
400
|
+
@direction = (@v1.mark != mark && Strength::stronger(@strength, @v1.walkStrength)) ? Direction::BACKWARD : Direction::NONE
|
401
|
+
return
|
402
|
+
end
|
403
|
+
if (Strength::weaker(@v1.walkStrength, @v2.walkStrength))
|
404
|
+
@direction = Strength::stronger(@strength, @v1.walkStrength) ? Direction::BACKWARD : Direction::NONE
|
405
|
+
else
|
406
|
+
@direction = Strength::stronger(@strength, @v2.walkStrength) ? Direction::FORWARD : Direction::BACKWARD
|
407
|
+
end
|
408
|
+
end
|
409
|
+
|
410
|
+
# *
|
411
|
+
# Add this constraint to the constraint graph
|
412
|
+
# /
|
413
|
+
def addToGraph
|
414
|
+
@v1.addConstraint(self)
|
415
|
+
@v2.addConstraint(self)
|
416
|
+
@direction = Direction::NONE
|
417
|
+
end
|
418
|
+
|
419
|
+
# *
|
420
|
+
# Answer true if this constraint is satisfied in the current solution.
|
421
|
+
# /
|
422
|
+
def isSatisfied
|
423
|
+
return @direction != Direction::NONE
|
424
|
+
end
|
425
|
+
|
426
|
+
# *
|
427
|
+
# Mark the input variable with the given mark.
|
428
|
+
# /
|
429
|
+
def markInputs(mark)
|
430
|
+
input().mark = mark
|
431
|
+
end
|
432
|
+
|
433
|
+
# *
|
434
|
+
# Returns the current input variable
|
435
|
+
# /
|
436
|
+
def input
|
437
|
+
return (@direction == Direction::FORWARD) ? @v1 : @v2
|
438
|
+
end
|
439
|
+
|
440
|
+
# *
|
441
|
+
# Returns the current output variable
|
442
|
+
# /
|
443
|
+
def output
|
444
|
+
return (@direction == Direction::FORWARD) ? @v2 : @v1
|
445
|
+
end
|
446
|
+
|
447
|
+
# *
|
448
|
+
# Calculate the walkabout strength, the stay flag, and, if it is
|
449
|
+
# 'stay', the value for the current output of this
|
450
|
+
# constraint. Assume this constraint is satisfied.
|
451
|
+
# /
|
452
|
+
def recalculate
|
453
|
+
ihn = input()
|
454
|
+
out = output()
|
455
|
+
out.walkStrength = Strength::weakestOf(@strength, ihn.walkStrength)
|
456
|
+
out.stay = ihn.stay
|
457
|
+
execute() if (out.stay)
|
458
|
+
end
|
459
|
+
|
460
|
+
# *
|
461
|
+
# Record the fact that this constraint is unsatisfied.
|
462
|
+
# /
|
463
|
+
def markUnsatisfied
|
464
|
+
@direction = Direction::NONE
|
465
|
+
end
|
466
|
+
|
467
|
+
def inputsKnown(mark)
|
468
|
+
i = input()
|
469
|
+
return i.mark == mark || i.stay || i.determinedBy == nil
|
470
|
+
end
|
471
|
+
|
472
|
+
def removeFromGraph
|
473
|
+
@v1.removeConstraint(self) if (@v1 != nil)
|
474
|
+
@v2.removeConstraint(self) if (@v2 != nil)
|
475
|
+
@direction = Direction::NONE
|
476
|
+
end
|
477
|
+
|
478
|
+
end
|
479
|
+
|
480
|
+
# --- *
|
481
|
+
# S c a l e C o n s t r a i n t
|
482
|
+
# --- */
|
483
|
+
|
484
|
+
# *
|
485
|
+
# Relates two variables by the linear scaling relationship: "v2 =
|
486
|
+
# (v1 * scale) + offset". Either v1 or v2 may be changed to maintain
|
487
|
+
# this relationship but the scale factor and offset are considered
|
488
|
+
# read-only.
|
489
|
+
# /
|
490
|
+
|
491
|
+
class ScaleConstraint < BinaryConstraint
|
492
|
+
|
493
|
+
def initialize(src, scale, offset, dest, strength)
|
494
|
+
@direction = Direction::NONE
|
495
|
+
@scale = scale
|
496
|
+
@offset = offset
|
497
|
+
super(src, dest, strength)
|
498
|
+
end
|
499
|
+
|
500
|
+
#ScaleConstraint.inheritsFrom(BinaryConstraint)
|
501
|
+
|
502
|
+
# *
|
503
|
+
# Adds this constraint to the constraint graph.
|
504
|
+
# /
|
505
|
+
def addToGraph
|
506
|
+
super
|
507
|
+
@scale.addConstraint(self)
|
508
|
+
@offset.addConstraint(self)
|
509
|
+
end
|
510
|
+
|
511
|
+
def removeFromGraph
|
512
|
+
super
|
513
|
+
@scale.removeConstraint(self) if (@scale != nil)
|
514
|
+
@offset.removeConstraint(self) if (@offset != nil)
|
515
|
+
end
|
516
|
+
|
517
|
+
def markInputs(mark)
|
518
|
+
super(mark)
|
519
|
+
@scale.mark = @offset.mark = mark
|
520
|
+
end
|
521
|
+
|
522
|
+
# *
|
523
|
+
# Enforce this constraint. Assume that it is satisfied.
|
524
|
+
# /
|
525
|
+
def execute
|
526
|
+
if (@direction == Direction::FORWARD)
|
527
|
+
@v2.value = @v1.value * @scale.value + @offset.value
|
528
|
+
else
|
529
|
+
@v1.value = (@v2.value - @offset.value) / @scale.value
|
530
|
+
end
|
531
|
+
end
|
532
|
+
|
533
|
+
# *
|
534
|
+
# Calculate the walkabout strength, the stay flag, and, if it is
|
535
|
+
# 'stay', the value for the current output of this constraint. Assume
|
536
|
+
# this constraint is satisfied.
|
537
|
+
# /
|
538
|
+
def recalculate
|
539
|
+
ihn = input()
|
540
|
+
out = output()
|
541
|
+
out.walkStrength = Strength.weakestOf(@strength, ihn.walkStrength)
|
542
|
+
out.stay = ihn.stay && @scale.stay && @offset.stay
|
543
|
+
execute() if (out.stay)
|
544
|
+
end
|
545
|
+
|
546
|
+
end
|
547
|
+
|
548
|
+
# --- *
|
549
|
+
# E q u a l i t y C o n s t r a i n t
|
550
|
+
# --- */
|
551
|
+
|
552
|
+
# *
|
553
|
+
# Constrains two variables to have the same value.
|
554
|
+
# /
|
555
|
+
|
556
|
+
class EqualityConstraint < BinaryConstraint
|
557
|
+
|
558
|
+
def initialize(var1, var2, strength)
|
559
|
+
super(var1, var2, strength)
|
560
|
+
end
|
561
|
+
|
562
|
+
#EqualityConstraint.inheritsFrom(BinaryConstraint)
|
563
|
+
|
564
|
+
# *
|
565
|
+
# Enforce this constraint. Assume that it is satisfied.
|
566
|
+
# /
|
567
|
+
def execute
|
568
|
+
output().value = input().value
|
569
|
+
end
|
570
|
+
|
571
|
+
end
|
572
|
+
|
573
|
+
# --- *
|
574
|
+
# V a r i a b l e
|
575
|
+
# --- */
|
576
|
+
|
577
|
+
# *
|
578
|
+
# A constrained variable. In addition to its value, it maintain the
|
579
|
+
# structure of the constraint graph, the current dataflow graph, and
|
580
|
+
# various parameters of interest to the DeltaBlue incremental
|
581
|
+
# constraint solver.
|
582
|
+
# */
|
583
|
+
|
584
|
+
class Variable
|
585
|
+
|
586
|
+
attr_accessor :mark, :walkStrength, :determinedBy, :stay, :value, :constraints
|
587
|
+
|
588
|
+
def initialize(name, initialValue = nil)
|
589
|
+
@value = initialValue || 0
|
590
|
+
@constraints = OrderedCollection.new()
|
591
|
+
@determinedBy = nil
|
592
|
+
@mark = 0
|
593
|
+
@walkStrength = Strength::WEAKEST
|
594
|
+
@stay = true
|
595
|
+
@name = name
|
596
|
+
end
|
597
|
+
|
598
|
+
# *
|
599
|
+
# Add the given constraint to the set of all constraints that refer
|
600
|
+
# this variable.
|
601
|
+
# /
|
602
|
+
def addConstraint(c)
|
603
|
+
@constraints.add(c)
|
604
|
+
end
|
605
|
+
|
606
|
+
# *
|
607
|
+
# Removes all traces of c from this variable.
|
608
|
+
# /
|
609
|
+
def removeConstraint(c)
|
610
|
+
@constraints.remove(c)
|
611
|
+
@determinedBy = nil if (@determinedBy == c)
|
612
|
+
end
|
613
|
+
|
614
|
+
end
|
615
|
+
|
616
|
+
# --- *
|
617
|
+
# P l a n n e r
|
618
|
+
# --- */
|
619
|
+
|
620
|
+
# *
|
621
|
+
# The DeltaBlue planner
|
622
|
+
# /
|
623
|
+
|
624
|
+
class Planner
|
625
|
+
|
626
|
+
def initialize()
|
627
|
+
@currentMark = 0
|
628
|
+
end
|
629
|
+
|
630
|
+
# *
|
631
|
+
# Attempt to satisfy the given constraint and, if successful,
|
632
|
+
# incrementally update the dataflow graph. Details: If satifying
|
633
|
+
# the constraint is successful, it may override a weaker constraint
|
634
|
+
# on its output. The algorithm attempts to resatisfy that
|
635
|
+
# constraint using some other method. This process is repeated
|
636
|
+
# until either a) it reaches a variable that was not previously
|
637
|
+
# determined by any constraint or b) it reaches a constraint that
|
638
|
+
# is too weak to be satisfied using any of its methods. The
|
639
|
+
# variables of constraints that have been processed are marked with
|
640
|
+
# a unique mark value so that we know where we've been. This allows
|
641
|
+
# the algorithm to avoid getting into an infinite loop even if the
|
642
|
+
# constraint graph has an inadvertent cycle.
|
643
|
+
# /
|
644
|
+
def incrementalAdd(c)
|
645
|
+
mark = newMark()
|
646
|
+
overridden = c.satisfy(mark)
|
647
|
+
while (overridden != nil)
|
648
|
+
overridden = overridden.satisfy(mark)
|
649
|
+
end
|
650
|
+
end
|
651
|
+
|
652
|
+
# *
|
653
|
+
# Entry point for retracting a constraint. Remove the given
|
654
|
+
# constraint and incrementally update the dataflow graph.
|
655
|
+
# Details: Retracting the given constraint may allow some currently
|
656
|
+
# unsatisfiable downstream constraint to be satisfied. We therefore collect
|
657
|
+
# a list of unsatisfied downstream constraints and attempt to
|
658
|
+
# satisfy each one in turn. This list is traversed by constraint
|
659
|
+
# strength, strongest first, as a heuristic for avoiding
|
660
|
+
# unnecessarily adding and then overriding weak constraints.
|
661
|
+
# Assume: c is satisfied.
|
662
|
+
# /
|
663
|
+
def incrementalRemove(c)
|
664
|
+
out = c.output()
|
665
|
+
c.markUnsatisfied()
|
666
|
+
c.removeFromGraph()
|
667
|
+
unsatisfied = removePropagateFrom(out)
|
668
|
+
strength = Strength::REQUIRED
|
669
|
+
while true
|
670
|
+
i = 0
|
671
|
+
while i < unsatisfied.size()
|
672
|
+
u = unsatisfied.at(i)
|
673
|
+
incrementalAdd(u) if (u.strength == strength)
|
674
|
+
i += 1
|
675
|
+
end
|
676
|
+
strength = strength.nextWeaker()
|
677
|
+
break unless (strength != Strength::WEAKEST)
|
678
|
+
end
|
679
|
+
end
|
680
|
+
|
681
|
+
# *
|
682
|
+
# Select a previously unused mark value.
|
683
|
+
# /
|
684
|
+
def newMark
|
685
|
+
return @currentMark += 1
|
686
|
+
end
|
687
|
+
|
688
|
+
# *
|
689
|
+
# Extract a plan for resatisfaction starting from the given source
|
690
|
+
# constraints, usually a set of input constraints. This method
|
691
|
+
# assumes that stay optimization is desired; the plan will contain
|
692
|
+
# only constraints whose output variables are not stay. Constraints
|
693
|
+
# that do no computation, such as stay and edit constraints, are
|
694
|
+
# not included in the plan.
|
695
|
+
# Details: The outputs of a constraint are marked when it is added
|
696
|
+
# to the plan under construction. A constraint may be appended to
|
697
|
+
# the plan when all its input variables are known. A variable is
|
698
|
+
# known if either a) the variable is marked (indicating that has
|
699
|
+
# been computed by a constraint appearing earlier in the plan), b)
|
700
|
+
# the variable is 'stay' (i.e. it is a constant at plan execution
|
701
|
+
# time), or c) the variable is not determined by any
|
702
|
+
# constraint. The last provision is for past states of history
|
703
|
+
# variables, which are not stay but which are also not computed by
|
704
|
+
# any constraint.
|
705
|
+
# Assume: sources are all satisfied.
|
706
|
+
# /
|
707
|
+
def makePlan(sources)
|
708
|
+
mark = newMark()
|
709
|
+
plan = Plan.new()
|
710
|
+
todo = sources
|
711
|
+
while (todo.size() > 0)
|
712
|
+
c = todo.removeFirst()
|
713
|
+
if (c.output().mark != mark && c.inputsKnown(mark))
|
714
|
+
plan.addConstraint(c)
|
715
|
+
c.output().mark = mark
|
716
|
+
addConstraintsConsumingTo(c.output(), todo)
|
717
|
+
end
|
718
|
+
end
|
719
|
+
return plan
|
720
|
+
end
|
721
|
+
|
722
|
+
# *
|
723
|
+
# Extract a plan for resatisfying starting from the output of the
|
724
|
+
# given constraints, usually a set of input constraints.
|
725
|
+
# /
|
726
|
+
def extractPlanFromConstraints(constraints)
|
727
|
+
sources = OrderedCollection.new()
|
728
|
+
i = 0
|
729
|
+
while i < constraints.size()
|
730
|
+
c = constraints.at(i)
|
731
|
+
sources.add(c) if (c.isInput() && c.isSatisfied())
|
732
|
+
i += 1
|
733
|
+
end
|
734
|
+
return makePlan(sources)
|
735
|
+
end
|
736
|
+
|
737
|
+
# *
|
738
|
+
# Recompute the walkabout strengths and stay flags of all variables
|
739
|
+
# downstream of the given constraint and recompute the actual
|
740
|
+
# values of all variables whose stay flag is true. If a cycle is
|
741
|
+
# detected, remove the given constraint and answer
|
742
|
+
# false. Otherwise, answer true.
|
743
|
+
# Details: Cycles are detected when a marked variable is
|
744
|
+
# encountered downstream of the given constraint. The sender is
|
745
|
+
# assumed to have marked the inputs of the given constraint with
|
746
|
+
# the given mark. Thus, encountering a marked node downstream of
|
747
|
+
# the output constraint means that there is a path from the
|
748
|
+
# constraint's output to one of its inputs.
|
749
|
+
# /
|
750
|
+
def addPropagate(c, mark)
|
751
|
+
todo = OrderedCollection.new()
|
752
|
+
todo.add(c)
|
753
|
+
while (todo.size() > 0)
|
754
|
+
d = todo.removeFirst()
|
755
|
+
if (d.output().mark == mark)
|
756
|
+
incrementalRemove(c)
|
757
|
+
return false
|
758
|
+
end
|
759
|
+
d.recalculate()
|
760
|
+
addConstraintsConsumingTo(d.output(), todo)
|
761
|
+
end
|
762
|
+
return true
|
763
|
+
end
|
764
|
+
|
765
|
+
|
766
|
+
# *
|
767
|
+
# Update the walkabout strengths and stay flags of all variables
|
768
|
+
# downstream of the given constraint. Answer a collection of
|
769
|
+
# unsatisfied constraints sorted in order of decreasing strength.
|
770
|
+
# /
|
771
|
+
def removePropagateFrom(out)
|
772
|
+
out.determinedBy = nil
|
773
|
+
out.walkStrength = Strength::WEAKEST
|
774
|
+
out.stay = true
|
775
|
+
unsatisfied = OrderedCollection.new()
|
776
|
+
todo = OrderedCollection.new()
|
777
|
+
todo.add(out)
|
778
|
+
while (todo.size() > 0)
|
779
|
+
v = todo.removeFirst()
|
780
|
+
i = 0
|
781
|
+
while i < v.constraints.size()
|
782
|
+
c = v.constraints.at(i)
|
783
|
+
unsatisfied.add(c) if (!c.isSatisfied())
|
784
|
+
i += 1
|
785
|
+
end
|
786
|
+
determining = v.determinedBy
|
787
|
+
i = 0
|
788
|
+
while i < v.constraints.size()
|
789
|
+
next_ = v.constraints.at(i)
|
790
|
+
if (next_ != determining && next_.isSatisfied())
|
791
|
+
next_.recalculate()
|
792
|
+
todo.add(next_.output())
|
793
|
+
end
|
794
|
+
i += 1
|
795
|
+
end
|
796
|
+
end
|
797
|
+
return unsatisfied
|
798
|
+
end
|
799
|
+
|
800
|
+
def addConstraintsConsumingTo(v, coll)
|
801
|
+
determining = v.determinedBy
|
802
|
+
cc = v.constraints
|
803
|
+
i = 0
|
804
|
+
while i < cc.size()
|
805
|
+
c = cc.at(i)
|
806
|
+
coll.add(c) if (c != determining && c.isSatisfied())
|
807
|
+
i += 1
|
808
|
+
end
|
809
|
+
end
|
810
|
+
|
811
|
+
end
|
812
|
+
|
813
|
+
# --- *
|
814
|
+
# P l a n
|
815
|
+
# --- */
|
816
|
+
|
817
|
+
# *
|
818
|
+
# A Plan is an ordered list of constraints to be executed in sequence
|
819
|
+
# to resatisfy all currently satisfiable constraints in the face of
|
820
|
+
# one or more changing inputs.
|
821
|
+
# /
|
822
|
+
|
823
|
+
class Plan
|
824
|
+
|
825
|
+
def initialize()
|
826
|
+
@v = OrderedCollection.new()
|
827
|
+
end
|
828
|
+
|
829
|
+
def addConstraint(c)
|
830
|
+
@v.add(c)
|
831
|
+
end
|
832
|
+
|
833
|
+
def size
|
834
|
+
return @v.size()
|
835
|
+
end
|
836
|
+
|
837
|
+
def constraintAt(index)
|
838
|
+
return @v.at(index)
|
839
|
+
end
|
840
|
+
|
841
|
+
def execute
|
842
|
+
i = 0
|
843
|
+
while i < size()
|
844
|
+
c = constraintAt(i)
|
845
|
+
c.execute()
|
846
|
+
i += 1
|
847
|
+
end
|
848
|
+
end
|
849
|
+
|
850
|
+
end
|
851
|
+
|
852
|
+
# --- *
|
853
|
+
# M a i n
|
854
|
+
# --- */
|
855
|
+
|
856
|
+
# *
|
857
|
+
# This is the standard DeltaBlue benchmark. A long chain of equality
|
858
|
+
# constraints is constructed with a stay constraint on one end. An
|
859
|
+
# edit constraint is then added to the opposite end and the time is
|
860
|
+
# measured for adding and removing this constraint, and extracting
|
861
|
+
# and executing a constraint satisfaction plan. There are two cases.
|
862
|
+
# In case 1, the added constraint is stronger than the stay
|
863
|
+
# constraint and values must propagate down the entire length of the
|
864
|
+
# chain. In case 2, the added constraint is weaker than the stay
|
865
|
+
# constraint so it cannot be accomodated. The cost in this case is,
|
866
|
+
# of course, very low. Typical situations lie somewhere between these
|
867
|
+
# two extremes.
|
868
|
+
# /
|
869
|
+
def chainTest(n)
|
870
|
+
$planner = Planner.new()
|
871
|
+
prev = nil
|
872
|
+
first = nil
|
873
|
+
last = nil
|
874
|
+
|
875
|
+
# Build chain of n equality constraints
|
876
|
+
i = 0
|
877
|
+
while i <= n
|
878
|
+
name = "v" + i.to_s
|
879
|
+
v = Variable.new(name)
|
880
|
+
if (prev != nil)
|
881
|
+
EqualityConstraint.new(prev, v, Strength::REQUIRED)
|
882
|
+
end
|
883
|
+
first = v if (i == 0)
|
884
|
+
last = v if (i == n)
|
885
|
+
prev = v
|
886
|
+
i += 1
|
887
|
+
end
|
888
|
+
|
889
|
+
StayConstraint.new(last, Strength::STRONG_DEFAULT)
|
890
|
+
edit = EditConstraint.new(first, Strength::PREFERRED)
|
891
|
+
edits = OrderedCollection.new()
|
892
|
+
edits.add(edit)
|
893
|
+
plan = $planner.extractPlanFromConstraints(edits)
|
894
|
+
i = 0
|
895
|
+
while i < 100
|
896
|
+
first.value = i
|
897
|
+
plan.execute()
|
898
|
+
alert("Chain test failed.") if (last.value != i)
|
899
|
+
i += 1
|
900
|
+
end
|
901
|
+
end
|
902
|
+
|
903
|
+
# *
|
904
|
+
# This test constructs a two sets of variables related to each
|
905
|
+
# other by a simple linear transformation (scale and offset). The
|
906
|
+
# time is measured to change a variable on either side of the
|
907
|
+
# mapping and to change the scale and offset factors.
|
908
|
+
# /
|
909
|
+
def projectionTest(n)
|
910
|
+
$planner = Planner.new()
|
911
|
+
scale = Variable.new("scale", 10)
|
912
|
+
offset = Variable.new("offset", 1000)
|
913
|
+
src = nil
|
914
|
+
dst = nil
|
915
|
+
|
916
|
+
dests = OrderedCollection.new()
|
917
|
+
i = 0
|
918
|
+
while i < n
|
919
|
+
src = Variable.new("src" + i.to_s, i)
|
920
|
+
dst = Variable.new("dst" + i.to_s, i)
|
921
|
+
dests.add(dst)
|
922
|
+
StayConstraint.new(src, Strength::NORMAL)
|
923
|
+
ScaleConstraint.new(src, scale, offset, dst, Strength::REQUIRED)
|
924
|
+
i += 1
|
925
|
+
end
|
926
|
+
|
927
|
+
change(src, 17)
|
928
|
+
alert("Projection 1 failed") if (dst.value != 1170)
|
929
|
+
change(dst, 1050)
|
930
|
+
alert("Projection 2 failed") if (src.value != 5)
|
931
|
+
change(scale, 5)
|
932
|
+
i = 0
|
933
|
+
while i < n - 1
|
934
|
+
alert("Projection 3 failed") if (dests.at(i).value != i * 5 + 1000)
|
935
|
+
i += 1
|
936
|
+
end
|
937
|
+
change(offset, 2000)
|
938
|
+
i = 0
|
939
|
+
while i < n - 1
|
940
|
+
alert("Projection 4 failed") if (dests.at(i).value != i * 5 + 2000)
|
941
|
+
i += 1
|
942
|
+
end
|
943
|
+
end
|
944
|
+
|
945
|
+
def change(v, newValue)
|
946
|
+
edit = EditConstraint.new(v, Strength::PREFERRED)
|
947
|
+
edits = OrderedCollection.new()
|
948
|
+
edits.add(edit)
|
949
|
+
plan = $planner.extractPlanFromConstraints(edits)
|
950
|
+
i = 0
|
951
|
+
while i < 10
|
952
|
+
v.value = newValue
|
953
|
+
plan.execute()
|
954
|
+
i += 1
|
955
|
+
end
|
956
|
+
edit.destroyConstraint()
|
957
|
+
end
|
958
|
+
|
959
|
+
# Global variable holding the current planner.
|
960
|
+
$planner = nil
|
961
|
+
|
962
|
+
def deltaBlue()
|
963
|
+
chainTest(100)
|
964
|
+
projectionTest(100)
|
965
|
+
end
|
966
|
+
|
967
|
+
def harness_input
|
968
|
+
10_000
|
969
|
+
end
|
970
|
+
|
971
|
+
def harness_sample(input)
|
972
|
+
chainTest(input)
|
973
|
+
projectionTest(input)
|
974
|
+
end
|
975
|
+
|
976
|
+
def harness_verify(output)
|
977
|
+
# Self-verifies
|
978
|
+
true
|
979
|
+
end
|
980
|
+
|
981
|
+
require 'bench9000/harness'
|