Refactoring layout.
This commit is contained in:
		
							parent
							
								
									1c44d7aec1
								
							
						
					
					
						commit
						e9377de01f
					
				
					 11 changed files with 407 additions and 320 deletions
				
			
		
							
								
								
									
										296
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										296
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							|  | @ -8,6 +8,12 @@ version = "1.0.2" | |||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "adler2" | ||||
| version = "2.0.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "aho-corasick" | ||||
| version = "1.1.3" | ||||
|  | @ -25,50 +31,51 @@ checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" | |||
| 
 | ||||
| [[package]] | ||||
| name = "anstream" | ||||
| version = "0.6.13" | ||||
| version = "0.6.15" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" | ||||
| checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" | ||||
| dependencies = [ | ||||
|  "anstyle", | ||||
|  "anstyle-parse", | ||||
|  "anstyle-query", | ||||
|  "anstyle-wincon", | ||||
|  "colorchoice", | ||||
|  "is_terminal_polyfill", | ||||
|  "utf8parse", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "anstyle" | ||||
| version = "1.0.6" | ||||
| version = "1.0.8" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" | ||||
| checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "anstyle-parse" | ||||
| version = "0.2.3" | ||||
| version = "0.2.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" | ||||
| checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" | ||||
| dependencies = [ | ||||
|  "utf8parse", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "anstyle-query" | ||||
| version = "1.0.2" | ||||
| version = "1.1.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" | ||||
| checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" | ||||
| dependencies = [ | ||||
|  "windows-sys", | ||||
|  "windows-sys 0.52.0", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "anstyle-wincon" | ||||
| version = "3.0.2" | ||||
| version = "3.0.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" | ||||
| checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" | ||||
| dependencies = [ | ||||
|  "anstyle", | ||||
|  "windows-sys", | ||||
|  "windows-sys 0.52.0", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
|  | @ -113,9 +120,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "autocfg" | ||||
| version = "1.1.0" | ||||
| version = "1.3.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" | ||||
| checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "av1-grain" | ||||
|  | @ -172,9 +179,9 @@ checksum = "236e6289eda5a812bc6b53c3b024039382a2895fbbeef2d748b2931546d392c4" | |||
| 
 | ||||
| [[package]] | ||||
| name = "bumpalo" | ||||
| version = "3.15.4" | ||||
| version = "3.16.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" | ||||
| checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "bytemuck" | ||||
|  | @ -202,9 +209,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" | |||
| 
 | ||||
| [[package]] | ||||
| name = "cc" | ||||
| version = "1.1.18" | ||||
| version = "1.1.21" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" | ||||
| checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0" | ||||
| dependencies = [ | ||||
|  "jobserver", | ||||
|  "libc", | ||||
|  | @ -240,9 +247,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "clap" | ||||
| version = "4.5.3" | ||||
| version = "4.5.17" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "949626d00e063efc93b6dca932419ceb5432f99769911c0b995f7e884c778813" | ||||
| checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" | ||||
| dependencies = [ | ||||
|  "clap_builder", | ||||
|  "clap_derive", | ||||
|  | @ -250,9 +257,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "clap_builder" | ||||
| version = "4.5.2" | ||||
| version = "4.5.17" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" | ||||
| checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" | ||||
| dependencies = [ | ||||
|  "anstream", | ||||
|  "anstyle", | ||||
|  | @ -262,9 +269,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "clap_derive" | ||||
| version = "4.5.3" | ||||
| version = "4.5.13" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "90239a040c80f5e14809ca132ddc4176ab33d5e17e49691793296e3fcb34d72f" | ||||
| checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" | ||||
| dependencies = [ | ||||
|  "heck", | ||||
|  "proc-macro2", | ||||
|  | @ -274,9 +281,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "clap_lex" | ||||
| version = "0.7.0" | ||||
| version = "0.7.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" | ||||
| checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "color_quant" | ||||
|  | @ -286,15 +293,15 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" | |||
| 
 | ||||
| [[package]] | ||||
| name = "colorchoice" | ||||
| version = "1.0.0" | ||||
| version = "1.0.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" | ||||
| checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "crc32fast" | ||||
| version = "1.4.0" | ||||
| version = "1.4.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" | ||||
| checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
| ] | ||||
|  | @ -356,9 +363,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "crossbeam-utils" | ||||
| version = "0.8.19" | ||||
| version = "0.8.20" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" | ||||
| checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "crunchy" | ||||
|  | @ -389,9 +396,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "either" | ||||
| version = "1.10.0" | ||||
| version = "1.13.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" | ||||
| checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "equivalent" | ||||
|  | @ -409,7 +416,7 @@ dependencies = [ | |||
|  "flume", | ||||
|  "half 2.4.1", | ||||
|  "lebe", | ||||
|  "miniz_oxide", | ||||
|  "miniz_oxide 0.7.4", | ||||
|  "rayon-core", | ||||
|  "smallvec", | ||||
|  "zune-inflate", | ||||
|  | @ -420,7 +427,7 @@ name = "factorio_blueprint" | |||
| version = "0.1.0" | ||||
| dependencies = [ | ||||
|  "base64", | ||||
|  "clap 4.5.3", | ||||
|  "clap 4.5.17", | ||||
|  "criterion", | ||||
|  "flate2", | ||||
|  "image", | ||||
|  | @ -442,12 +449,12 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "flate2" | ||||
| version = "1.0.28" | ||||
| version = "1.0.33" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" | ||||
| checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" | ||||
| dependencies = [ | ||||
|  "crc32fast", | ||||
|  "miniz_oxide", | ||||
|  "miniz_oxide 0.8.0", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
|  | @ -558,9 +565,9 @@ checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" | |||
| 
 | ||||
| [[package]] | ||||
| name = "indexmap" | ||||
| version = "2.4.0" | ||||
| version = "2.5.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" | ||||
| checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" | ||||
| dependencies = [ | ||||
|  "equivalent", | ||||
|  "hashbrown", | ||||
|  | @ -577,6 +584,12 @@ dependencies = [ | |||
|  "syn", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "is_terminal_polyfill" | ||||
| version = "1.70.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "itertools" | ||||
| version = "0.10.5" | ||||
|  | @ -597,9 +610,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "itoa" | ||||
| version = "1.0.10" | ||||
| version = "1.0.11" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" | ||||
| checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "jobserver" | ||||
|  | @ -618,18 +631,18 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" | |||
| 
 | ||||
| [[package]] | ||||
| name = "js-sys" | ||||
| version = "0.3.69" | ||||
| version = "0.3.70" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" | ||||
| checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" | ||||
| dependencies = [ | ||||
|  "wasm-bindgen", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "lazy_static" | ||||
| version = "1.4.0" | ||||
| version = "1.5.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" | ||||
| checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "lebe" | ||||
|  | @ -666,9 +679,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "log" | ||||
| version = "0.4.21" | ||||
| version = "0.4.22" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" | ||||
| checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "loop9" | ||||
|  | @ -690,9 +703,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "memchr" | ||||
| version = "2.7.1" | ||||
| version = "2.7.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" | ||||
| checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "minimal-lexical" | ||||
|  | @ -702,14 +715,23 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" | |||
| 
 | ||||
| [[package]] | ||||
| name = "miniz_oxide" | ||||
| version = "0.7.2" | ||||
| version = "0.7.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" | ||||
| checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" | ||||
| dependencies = [ | ||||
|  "adler", | ||||
|  "simd-adler32", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "miniz_oxide" | ||||
| version = "0.8.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" | ||||
| dependencies = [ | ||||
|  "adler2", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "new_debug_unreachable" | ||||
| version = "1.0.6" | ||||
|  | @ -775,9 +797,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "num-traits" | ||||
| version = "0.2.18" | ||||
| version = "0.2.19" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" | ||||
| checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" | ||||
| dependencies = [ | ||||
|  "autocfg", | ||||
| ] | ||||
|  | @ -790,9 +812,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" | |||
| 
 | ||||
| [[package]] | ||||
| name = "oorandom" | ||||
| version = "11.1.3" | ||||
| version = "11.1.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" | ||||
| checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "paste" | ||||
|  | @ -808,9 +830,9 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" | |||
| 
 | ||||
| [[package]] | ||||
| name = "plotters" | ||||
| version = "0.3.5" | ||||
| version = "0.3.7" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" | ||||
| checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" | ||||
| dependencies = [ | ||||
|  "num-traits", | ||||
|  "plotters-backend", | ||||
|  | @ -821,15 +843,15 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "plotters-backend" | ||||
| version = "0.3.5" | ||||
| version = "0.3.7" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" | ||||
| checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "plotters-svg" | ||||
| version = "0.3.5" | ||||
| version = "0.3.7" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" | ||||
| checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" | ||||
| dependencies = [ | ||||
|  "plotters-backend", | ||||
| ] | ||||
|  | @ -844,7 +866,7 @@ dependencies = [ | |||
|  "crc32fast", | ||||
|  "fdeflate", | ||||
|  "flate2", | ||||
|  "miniz_oxide", | ||||
|  "miniz_oxide 0.7.4", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
|  | @ -858,9 +880,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "proc-macro2" | ||||
| version = "1.0.79" | ||||
| version = "1.0.86" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" | ||||
| checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" | ||||
| dependencies = [ | ||||
|  "unicode-ident", | ||||
| ] | ||||
|  | @ -901,9 +923,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" | |||
| 
 | ||||
| [[package]] | ||||
| name = "quote" | ||||
| version = "1.0.35" | ||||
| version = "1.0.37" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" | ||||
| checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
| ] | ||||
|  | @ -989,9 +1011,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "rayon" | ||||
| version = "1.9.0" | ||||
| version = "1.10.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" | ||||
| checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" | ||||
| dependencies = [ | ||||
|  "either", | ||||
|  "rayon-core", | ||||
|  | @ -1009,9 +1031,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "regex" | ||||
| version = "1.10.4" | ||||
| version = "1.10.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" | ||||
| checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" | ||||
| dependencies = [ | ||||
|  "aho-corasick", | ||||
|  "memchr", | ||||
|  | @ -1021,9 +1043,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "regex-automata" | ||||
| version = "0.4.6" | ||||
| version = "0.4.7" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" | ||||
| checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" | ||||
| dependencies = [ | ||||
|  "aho-corasick", | ||||
|  "memchr", | ||||
|  | @ -1032,9 +1054,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "regex-syntax" | ||||
| version = "0.8.2" | ||||
| version = "0.8.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" | ||||
| checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "rgb" | ||||
|  | @ -1047,9 +1069,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "ryu" | ||||
| version = "1.0.17" | ||||
| version = "1.0.18" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" | ||||
| checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "same-file" | ||||
|  | @ -1068,9 +1090,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" | |||
| 
 | ||||
| [[package]] | ||||
| name = "serde" | ||||
| version = "1.0.197" | ||||
| version = "1.0.210" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" | ||||
| checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" | ||||
| dependencies = [ | ||||
|  "serde_derive", | ||||
| ] | ||||
|  | @ -1087,9 +1109,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "serde_derive" | ||||
| version = "1.0.197" | ||||
| version = "1.0.210" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" | ||||
| checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  | @ -1098,11 +1120,12 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "serde_json" | ||||
| version = "1.0.114" | ||||
| version = "1.0.128" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" | ||||
| checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" | ||||
| dependencies = [ | ||||
|  "itoa", | ||||
|  "memchr", | ||||
|  "ryu", | ||||
|  "serde", | ||||
| ] | ||||
|  | @ -1167,15 +1190,15 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "strsim" | ||||
| version = "0.11.0" | ||||
| version = "0.11.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" | ||||
| checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "syn" | ||||
| version = "2.0.53" | ||||
| version = "2.0.77" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" | ||||
| checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  | @ -1283,9 +1306,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "toml_edit" | ||||
| version = "0.22.20" | ||||
| version = "0.22.21" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" | ||||
| checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" | ||||
| dependencies = [ | ||||
|  "indexmap", | ||||
|  "serde", | ||||
|  | @ -1296,15 +1319,15 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "unicode-ident" | ||||
| version = "1.0.12" | ||||
| version = "1.0.13" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" | ||||
| checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "unicode-width" | ||||
| version = "0.1.11" | ||||
| version = "0.1.14" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" | ||||
| checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "unsafe-libyaml" | ||||
|  | @ -1314,9 +1337,9 @@ checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" | |||
| 
 | ||||
| [[package]] | ||||
| name = "utf8parse" | ||||
| version = "0.2.1" | ||||
| version = "0.2.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" | ||||
| checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "v_frame" | ||||
|  | @ -1353,19 +1376,20 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" | |||
| 
 | ||||
| [[package]] | ||||
| name = "wasm-bindgen" | ||||
| version = "0.2.92" | ||||
| version = "0.2.93" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" | ||||
| checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "once_cell", | ||||
|  "wasm-bindgen-macro", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "wasm-bindgen-backend" | ||||
| version = "0.2.92" | ||||
| version = "0.2.93" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" | ||||
| checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" | ||||
| dependencies = [ | ||||
|  "bumpalo", | ||||
|  "log", | ||||
|  | @ -1378,9 +1402,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "wasm-bindgen-macro" | ||||
| version = "0.2.92" | ||||
| version = "0.2.93" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" | ||||
| checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" | ||||
| dependencies = [ | ||||
|  "quote", | ||||
|  "wasm-bindgen-macro-support", | ||||
|  | @ -1388,9 +1412,9 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "wasm-bindgen-macro-support" | ||||
| version = "0.2.92" | ||||
| version = "0.2.93" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" | ||||
| checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  | @ -1401,15 +1425,15 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "wasm-bindgen-shared" | ||||
| version = "0.2.92" | ||||
| version = "0.2.93" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" | ||||
| checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "web-sys" | ||||
| version = "0.3.69" | ||||
| version = "0.3.70" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" | ||||
| checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" | ||||
| dependencies = [ | ||||
|  "js-sys", | ||||
|  "wasm-bindgen", | ||||
|  | @ -1439,11 +1463,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" | |||
| 
 | ||||
| [[package]] | ||||
| name = "winapi-util" | ||||
| version = "0.1.6" | ||||
| version = "0.1.9" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" | ||||
| checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" | ||||
| dependencies = [ | ||||
|  "winapi", | ||||
|  "windows-sys 0.59.0", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
|  | @ -1462,14 +1486,24 @@ dependencies = [ | |||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "windows-targets" | ||||
| version = "0.52.4" | ||||
| name = "windows-sys" | ||||
| version = "0.59.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" | ||||
| checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" | ||||
| dependencies = [ | ||||
|  "windows-targets", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "windows-targets" | ||||
| version = "0.52.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" | ||||
| dependencies = [ | ||||
|  "windows_aarch64_gnullvm", | ||||
|  "windows_aarch64_msvc", | ||||
|  "windows_i686_gnu", | ||||
|  "windows_i686_gnullvm", | ||||
|  "windows_i686_msvc", | ||||
|  "windows_x86_64_gnu", | ||||
|  "windows_x86_64_gnullvm", | ||||
|  | @ -1478,45 +1512,51 @@ dependencies = [ | |||
| 
 | ||||
| [[package]] | ||||
| name = "windows_aarch64_gnullvm" | ||||
| version = "0.52.4" | ||||
| version = "0.52.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" | ||||
| checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "windows_aarch64_msvc" | ||||
| version = "0.52.4" | ||||
| version = "0.52.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" | ||||
| checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "windows_i686_gnu" | ||||
| version = "0.52.4" | ||||
| version = "0.52.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" | ||||
| checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "windows_i686_gnullvm" | ||||
| version = "0.52.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "windows_i686_msvc" | ||||
| version = "0.52.4" | ||||
| version = "0.52.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" | ||||
| checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "windows_x86_64_gnu" | ||||
| version = "0.52.4" | ||||
| version = "0.52.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" | ||||
| checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "windows_x86_64_gnullvm" | ||||
| version = "0.52.4" | ||||
| version = "0.52.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" | ||||
| checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "windows_x86_64_msvc" | ||||
| version = "0.52.4" | ||||
| version = "0.52.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" | ||||
| checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "winnow" | ||||
|  |  | |||
|  | @ -22,25 +22,25 @@ fn main() { | |||
| 
 | ||||
|     dbg!(&p); | ||||
| 
 | ||||
|     let mut g = GeneticAlgorithm::new(&p, 20, 2, 0, &mut rng); | ||||
|     // let mut g = GeneticAlgorithm::new(&p, 20, 2, 0, &mut rng);
 | ||||
| 
 | ||||
|     for i in 0..100 { | ||||
|         println!("Generatrion {i}"); | ||||
|         g.generation(&mut rng); | ||||
|     } | ||||
| 
 | ||||
|     g.output_population(); | ||||
| 
 | ||||
|     // let mut m: Option<PathLayout> = None;
 | ||||
|     // for _ in 0..20 {
 | ||||
|     //     let g = genetic_algorithm2(&p, 10, 320, &mut rng);
 | ||||
| 
 | ||||
|     //     g.print_visualization();
 | ||||
|     //     g.png_visualization("test.png");
 | ||||
|     //     if m.as_ref().is_none_or(|m| g.score() < m.score()) {
 | ||||
|     //         m = Some(g);
 | ||||
|     //     }
 | ||||
|     // for i in 0..100 {
 | ||||
|     //     println!("Generatrion {i}");
 | ||||
|     //     g.generation(&mut rng);
 | ||||
|     // }
 | ||||
| 
 | ||||
|     // m.unwrap().print_visualization();
 | ||||
|     // g.output_population();
 | ||||
| 
 | ||||
|     let mut m: Option<PathLayout> = None; | ||||
|     for _ in 0..1 { | ||||
|         let g = genetic_algorithm2(&p, 10, 320, &mut rng); | ||||
| 
 | ||||
|         g.print_visualization(); | ||||
|         g.png_visualization("test.png"); | ||||
|         if m.as_ref().is_none_or(|m| g.score() < m.score()) { | ||||
|             m = Some(g); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     m.unwrap().print_visualization(); | ||||
| } | ||||
|  |  | |||
|  | @ -255,8 +255,7 @@ impl ConflictAvoidance { | |||
| 
 | ||||
|         let mut b = b.build(); | ||||
| 
 | ||||
|         // b.print();
 | ||||
|         // self.print();
 | ||||
|         // self.print_visualization();
 | ||||
| 
 | ||||
|         let mut min_cost = f64::INFINITY; | ||||
|         let mut solutions = Vec::new(); | ||||
|  | @ -271,6 +270,8 @@ impl ConflictAvoidance { | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // b.print_visualization();
 | ||||
| 
 | ||||
|         if b.solution_count() == 0 { | ||||
|             return None; | ||||
|         } | ||||
|  | @ -566,6 +567,17 @@ impl Visualize for ConflictAvoidance { | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if let Some((xrange, yrange)) = self.range.clone() { | ||||
|             for x in xrange { | ||||
|                 for y in yrange.clone() { | ||||
|                     v.overwrite_background( | ||||
|                         Position::new(x, y), | ||||
|                         Some(crate::common::visualize::Color::new(150, 150, 0)), | ||||
|                     ); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         for x in 0..self.map.width { | ||||
|             for y in 0..self.map.height { | ||||
|                 if conflicts.get(x, y) > &1 { | ||||
|  |  | |||
|  | @ -38,41 +38,37 @@ impl Problem { | |||
|     pub fn from_layout(l: &Layout) -> Self { | ||||
|         let mut p = Self::new(l.problem.size.x as usize, l.problem.size.y as usize); | ||||
| 
 | ||||
|         for ((pos, dir), b) in l.blocks.iter().zip(l.problem.blocks.iter()) { | ||||
|             let (npos, nsize) = Layout::normalize_pos((b, *pos, *dir)); | ||||
| 
 | ||||
|             let nend = npos + nsize - Position::new(1, 1); | ||||
|         for b in &l.blocks { | ||||
|             let aabb = b.get_aabb(); | ||||
| 
 | ||||
|             p.set_blocked_range( | ||||
|                 npos.x as usize, | ||||
|                 npos.y as usize, | ||||
|                 nend.x as usize, | ||||
|                 nend.y as usize, | ||||
|                 aabb.min().x as usize, | ||||
|                 aabb.min().y as usize, | ||||
|                 aabb.max().x as usize, | ||||
|                 aabb.max().y as usize, | ||||
|                 true, | ||||
|             ); | ||||
|         } | ||||
| 
 | ||||
|         for c in &l.problem.connections { | ||||
|             let startpos = Layout::transform( | ||||
|                 l.blocks[c.startblock].0, | ||||
|                 l.blocks[c.startblock].1, | ||||
|                 l.problem.blocks[c.startblock].output[c.startpoint].offset, | ||||
|             let start_transform = l.blocks[c.startblock].block_to_world(); | ||||
|             let startpos = l.problem.blocks[c.startblock].output[c.startpoint] | ||||
|                 .offset | ||||
|                 .transform(start_transform); | ||||
|             let startdir = l.problem.blocks[c.startblock].output[c.startpoint] | ||||
|                 .dir | ||||
|                 .transform(start_transform); | ||||
|             let end_transform = l.blocks[c.endblock].block_to_world(); | ||||
|             let endpos = l.problem.blocks[c.endblock].input[c.endpoint] | ||||
|                 .offset | ||||
|                 .transform(end_transform); | ||||
|             let enddir = l.problem.blocks[c.endblock].input[c.endpoint] | ||||
|                 .dir | ||||
|                 .transform(end_transform); | ||||
|             p.add_connection( | ||||
|                 (startpos, startdir), | ||||
|                 (endpos.in_direction(&enddir, -1), enddir), | ||||
|             ); | ||||
|             let startdir = Layout::rotate( | ||||
|                 l.problem.blocks[c.startblock].output[c.startpoint].dir, | ||||
|                 l.blocks[c.startblock].1, | ||||
|             ); | ||||
|             let enddir = Layout::rotate( | ||||
|                 l.problem.blocks[c.endblock].input[c.endpoint].dir, | ||||
|                 l.blocks[c.endblock].1, | ||||
|             ); | ||||
|             let endpos = Layout::transform( | ||||
|                 l.blocks[c.endblock].0, | ||||
|                 l.blocks[c.endblock].1, | ||||
|                 l.problem.blocks[c.endblock].input[c.endpoint].offset, | ||||
|             ) | ||||
|             .in_direction(&enddir, -1); | ||||
|             p.add_connection((startpos, startdir), (endpos, enddir)); | ||||
|         } | ||||
| 
 | ||||
|         p | ||||
|  |  | |||
|  | @ -60,6 +60,7 @@ fn main() { | |||
|         Mode::ConflictAvoidance => { | ||||
|             p.print_visualization(); | ||||
|             p.find_path(); | ||||
|             p.find_path(); | ||||
|             p.print_visualization(); | ||||
|             let mut c = ConflictAvoidance::new(&p); | ||||
|             c.print_visualization(); | ||||
|  |  | |||
							
								
								
									
										32
									
								
								src/bin/create_beltfinding_image.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/bin/create_beltfinding_image.rs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | |||
| use clap::Parser; | ||||
| use factorio_blueprint::{ | ||||
|     belt_finding::{conflict_avoidance::ConflictAvoidance, Problem}, | ||||
|     common::visualize::{image_grid, Visualize}, | ||||
| }; | ||||
| use std::{fs::File, path::PathBuf}; | ||||
| 
 | ||||
| #[derive(Parser)] | ||||
| struct Args { | ||||
|     inputfiles: Vec<PathBuf>, | ||||
|     outputfile: PathBuf, | ||||
| } | ||||
| 
 | ||||
| fn main() { | ||||
|     let args = Args::parse(); | ||||
| 
 | ||||
|     let visualizations: Vec<_> = args | ||||
|         .inputfiles | ||||
|         .iter() | ||||
|         .map(|f| { | ||||
|             let f = File::open(f).unwrap(); | ||||
|             let mut p = serde_json::from_reader::<File, Problem>(f).unwrap(); | ||||
| 
 | ||||
|             let c = ConflictAvoidance::new(&p); | ||||
|             c.visualize() | ||||
|         }) | ||||
|         .collect(); | ||||
| 
 | ||||
|     let image = image_grid(&visualizations, 50, 50, 5); | ||||
| 
 | ||||
|     image.save(args.outputfile).unwrap(); | ||||
| } | ||||
|  | @ -38,6 +38,7 @@ impl AABB { | |||
|         (self.max - self.min) + Position::new(1, 1) | ||||
|     } | ||||
| 
 | ||||
|     // Returns true in case the aabb overlap
 | ||||
|     pub fn collision(self, other: Self) -> bool { | ||||
|         self.min.x <= other.max.x | ||||
|             && self.max.x >= other.min.x | ||||
|  |  | |||
|  | @ -8,14 +8,21 @@ pub struct Block { | |||
| } | ||||
| 
 | ||||
| impl Block { | ||||
|     pub fn new(size: Position) -> Self { | ||||
|         Self { | ||||
|             pos: Position::new(0, 0), | ||||
|             dir: Direction::Up, | ||||
|             size, | ||||
|         } | ||||
|     pub fn new(pos: Position, dir: Direction, size: Position) -> Self { | ||||
|         Self { pos, dir, size } | ||||
|     } | ||||
| 
 | ||||
|     pub fn pos(&self) -> Position { | ||||
|         self.pos | ||||
|     } | ||||
| 
 | ||||
|     pub fn dir(&self) -> Direction { | ||||
|         self.dir | ||||
|     } | ||||
| 
 | ||||
|     pub fn size(&self) -> Position { | ||||
|         self.size | ||||
|     } | ||||
|     pub fn get_aabb(&self) -> AABB { | ||||
|         let npos = match self.dir { | ||||
|             Direction::Up => self.pos, | ||||
|  | @ -33,4 +40,32 @@ impl Block { | |||
| 
 | ||||
|         AABB::new(npos, npos + nsize - Position::new(1, 1)) | ||||
|     } | ||||
| 
 | ||||
|     pub fn world_to_block(&self) -> Transformation { | ||||
|         todo!() | ||||
|     } | ||||
| 
 | ||||
|     pub fn block_to_world(&self) -> Transformation { | ||||
|         Transformation::new(self.dir, self.pos) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod test { | ||||
|     use super::*; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn transformations() { | ||||
|         let b = Block::new(Position::new(10, 5), Direction::Right, Position::new(4, 3)); | ||||
| 
 | ||||
|         let t = b.block_to_world(); | ||||
| 
 | ||||
|         dbg!(t); | ||||
| 
 | ||||
|         let p = Position::new(3, 2); | ||||
| 
 | ||||
|         dbg!(p.transform(t)); | ||||
| 
 | ||||
|         assert!(false); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,5 +1,9 @@ | |||
| use crate::prelude::*; | ||||
| 
 | ||||
| pub trait Transformable { | ||||
|     fn transform(&self, t: Transformation) -> Self; | ||||
| } | ||||
| 
 | ||||
| #[derive(Clone, Copy, Debug)] | ||||
| pub struct Transformation { | ||||
|     rot: Direction, | ||||
|  | @ -11,9 +15,9 @@ impl Transformation { | |||
|         Self { rot, pos } | ||||
|     } | ||||
| 
 | ||||
|     pub fn transform_position(&self, pos: Position) -> Position { | ||||
|     pub fn transform_position(&self, pos: &Position) -> Position { | ||||
|         (match self.rot { | ||||
|             Direction::Up => pos, | ||||
|             Direction::Up => *pos, | ||||
|             Direction::Right => Position::new(-pos.y, pos.x), | ||||
|             Direction::Down => Position::new(-pos.x, -pos.y), | ||||
|             Direction::Left => Position::new(pos.y, -pos.x), | ||||
|  | @ -25,6 +29,37 @@ impl Transformation { | |||
|     } | ||||
| } | ||||
| 
 | ||||
| impl Transformable for Position { | ||||
|     fn transform(&self, t: Transformation) -> Self { | ||||
|         (match t.rot { | ||||
|             Direction::Up => *self, | ||||
|             Direction::Right => Position::new(-self.y, self.x), | ||||
|             Direction::Down => Position::new(-self.x, -self.y), | ||||
|             Direction::Left => Position::new(self.y, -self.x), | ||||
|         }) + t.pos | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl Transformable for Direction { | ||||
|     fn transform(&self, t: Transformation) -> Self { | ||||
|         match (t.rot, self) { | ||||
|             (Direction::Up, _) => Direction::Up, | ||||
|             (Direction::Right, Direction::Up) => Direction::Right, | ||||
|             (Direction::Right, Direction::Right) => Direction::Down, | ||||
|             (Direction::Right, Direction::Down) => Direction::Left, | ||||
|             (Direction::Right, Direction::Left) => Direction::Up, | ||||
|             (Direction::Down, Direction::Up) => Direction::Down, | ||||
|             (Direction::Down, Direction::Right) => Direction::Left, | ||||
|             (Direction::Down, Direction::Down) => Direction::Up, | ||||
|             (Direction::Down, Direction::Left) => Direction::Right, | ||||
|             (Direction::Left, Direction::Up) => Direction::Left, | ||||
|             (Direction::Left, Direction::Right) => Direction::Up, | ||||
|             (Direction::Left, Direction::Down) => Direction::Right, | ||||
|             (Direction::Left, Direction::Left) => Direction::Down, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod test { | ||||
|     use crate::prelude::*; | ||||
|  | @ -34,9 +69,9 @@ mod test { | |||
|         let p = Position::new(3, 5); | ||||
| 
 | ||||
|         let t = Transformation::new(Direction::Up, Position::new(-3, -5)); | ||||
|         assert_eq!(t.transform_position(p), Position::new(0, 0)); | ||||
|         assert_eq!(t.transform_position(&p), Position::new(0, 0)); | ||||
| 
 | ||||
|         let t = Transformation::new(Direction::Down, Position::new(-3, -5)); | ||||
|         assert_eq!(t.transform_position(p), Position::new(-6, -10)); | ||||
|         assert_eq!(t.transform_position(&p), Position::new(-6, -10)); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,12 +1,11 @@ | |||
| use std::sync::atomic::AtomicU32; | ||||
| use std::time::Instant; | ||||
| 
 | ||||
| use crate::belt_finding::common::PathField; | ||||
| use crate::belt_finding::conflict_avoidance::ConflictAvoidance; | ||||
| use crate::common::visualize::{image_grid, Color, Symbol, Visualization, Visualize}; | ||||
| use crate::prelude::*; | ||||
| use rand::{seq::SliceRandom, Rng}; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| use std::sync::atomic::AtomicU32; | ||||
| use std::time::Instant; | ||||
| 
 | ||||
| static OUTFILEINDEX: AtomicU32 = AtomicU32::new(0); | ||||
| 
 | ||||
|  | @ -152,7 +151,7 @@ pub fn valid_path_layout<'a, R: Rng + ?Sized>( | |||
| } | ||||
| 
 | ||||
| #[derive(Debug, Serialize, Deserialize)] | ||||
| pub(crate) struct Block { | ||||
| pub(crate) struct MacroBlock { | ||||
|     pub(crate) size: Position, | ||||
|     pub(crate) input: Vec<Interface>, | ||||
|     pub(crate) output: Vec<Interface>, | ||||
|  | @ -175,7 +174,7 @@ pub(crate) struct Connection { | |||
| #[derive(Debug, Serialize, Deserialize)] | ||||
| pub struct Problem { | ||||
|     pub(crate) size: Position, | ||||
|     pub(crate) blocks: Vec<Block>, | ||||
|     pub(crate) blocks: Vec<MacroBlock>, | ||||
|     pub(crate) connections: Vec<Connection>, | ||||
| } | ||||
| 
 | ||||
|  | @ -185,7 +184,7 @@ pub struct Problem { | |||
| #[derive(Debug, Clone)] | ||||
| pub struct Layout<'a> { | ||||
|     pub(crate) problem: &'a Problem, | ||||
|     pub(crate) blocks: Vec<(Position, Direction)>, | ||||
|     pub(crate) blocks: Vec<Block>, | ||||
| } | ||||
| 
 | ||||
| pub struct PathLayout<'a> { | ||||
|  | @ -331,7 +330,7 @@ impl Layout<'_> { | |||
| 
 | ||||
|     fn place_block<R: Rng + ?Sized>( | ||||
|         problem: &'_ Problem, | ||||
|         blocks: &mut Vec<(Position, Direction)>, | ||||
|         blocks: &mut Vec<Block>, | ||||
|         rng: &'_ mut R, | ||||
|     ) -> bool { | ||||
|         if problem.blocks.len() == blocks.len() { | ||||
|  | @ -361,12 +360,15 @@ impl Layout<'_> { | |||
|                 ), | ||||
|             }; | ||||
| 
 | ||||
|             let current = Block::new(pos, dir, problem.blocks[blocks.len()].size); | ||||
| 
 | ||||
|             let current_aabb = current.get_aabb(); | ||||
| 
 | ||||
|             if blocks | ||||
|                 .iter() | ||||
|                 .enumerate() | ||||
|                 .all(|(i, (p, d))| !Self::collision((&problem.blocks[i], *p, *d), (b, pos, dir))) | ||||
|                 .all(|b| !AABB::collision(b.get_aabb(), current_aabb)) | ||||
|             { | ||||
|                 blocks.push((pos, dir)); | ||||
|                 blocks.push(current); | ||||
| 
 | ||||
|                 if Self::place_block(problem, blocks, rng) { | ||||
|                     return true; | ||||
|  | @ -427,10 +429,16 @@ impl Layout<'_> { | |||
|             ), | ||||
|         }; | ||||
| 
 | ||||
|         if layout.blocks.iter().enumerate().all(|(j, (p, d))| { | ||||
|             j == i || !Self::collision((&layout.problem.blocks[j], *p, *d), (b, pos, dir)) | ||||
|         }) { | ||||
|             layout.blocks[i] = (pos, dir); | ||||
|         let current = Block::new(pos, dir, b.size); | ||||
|         let current_aabb = current.get_aabb(); | ||||
| 
 | ||||
|         if layout | ||||
|             .blocks | ||||
|             .iter() | ||||
|             .enumerate() | ||||
|             .all(|(j, b)| j == i || !AABB::collision(b.get_aabb(), current_aabb)) | ||||
|         { | ||||
|             layout.blocks[i] = current; | ||||
|             true | ||||
|         } else { | ||||
|             false | ||||
|  | @ -442,13 +450,15 @@ impl Layout<'_> { | |||
|         let b = &mut layout.blocks[i]; | ||||
|         let block = &layout.problem.blocks[i]; | ||||
| 
 | ||||
|         b.0 = match &b.1 { | ||||
|             Direction::Up => b.0 + block.size - Position::new(1, 1), | ||||
|             Direction::Right => b.0 + Position::new(1 - block.size.y, block.size.x - 1), | ||||
|             Direction::Down => b.0 - block.size + Position::new(1, 1), | ||||
|             Direction::Left => b.0 + Position::new(block.size.y - 1, 1 - block.size.x), | ||||
|         let new_pos = match b.dir() { | ||||
|             Direction::Up => b.pos() + block.size - Position::new(1, 1), | ||||
|             Direction::Right => b.pos() + Position::new(1 - block.size.y, block.size.x - 1), | ||||
|             Direction::Down => b.pos() - block.size + Position::new(1, 1), | ||||
|             Direction::Left => b.pos() + Position::new(block.size.y - 1, 1 - block.size.x), | ||||
|         }; | ||||
|         b.1 = b.1.reverse(); | ||||
|         let new_dir = b.dir().reverse(); | ||||
| 
 | ||||
|         *b = Block::new(new_pos, new_dir, b.size()); | ||||
| 
 | ||||
|         true | ||||
|     } | ||||
|  | @ -456,125 +466,44 @@ impl Layout<'_> { | |||
|     fn mutate_jiggle<R: Rng + ?Sized>(layout: &mut Layout, rng: &mut R) -> bool { | ||||
|         let i = rng.gen_range(0..layout.blocks.len()); | ||||
|         let dir = rng.gen::<Direction>(); | ||||
|         // let step = [(1, 10), (2, 5), (3, 5)]
 | ||||
|         //     .choose_weighted(rng, |i| i.1)
 | ||||
|         //     .unwrap()
 | ||||
|         //     .0;
 | ||||
|         let step = 1; | ||||
|         let step = [(1, 10), (2, 5), (3, 5)] | ||||
|             .choose_weighted(rng, |i| i.1) | ||||
|             .unwrap() | ||||
|             .0; | ||||
|         // let step = 1;
 | ||||
| 
 | ||||
|         let b = &layout.problem.blocks[i]; | ||||
|         let b = &layout.blocks[i]; | ||||
| 
 | ||||
|         let new_pos = layout.blocks[i].0.in_direction(&dir, step); | ||||
|         let current = Block::new(b.pos().in_direction(&dir, step), b.dir(), b.size()); | ||||
|         let current_aabb = current.get_aabb(); | ||||
| 
 | ||||
|         let (npos, nsize) = Self::normalize_pos((b, new_pos, layout.blocks[i].1)); | ||||
| 
 | ||||
|         if npos.x < 0 | ||||
|             || npos.y < 0 | ||||
|             || npos.x + nsize.x > layout.problem.size.x | ||||
|             || npos.y + nsize.y > layout.problem.size.y | ||||
|         if current_aabb.min().x < 0 | ||||
|             || current_aabb.min().y < 0 | ||||
|             || current_aabb.max().x >= layout.problem.size.x | ||||
|             || current_aabb.max().y >= layout.problem.size.y | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         if layout.blocks.iter().enumerate().all(|(j, (p, d))| { | ||||
|             j == i | ||||
|                 || !Self::collision( | ||||
|                     (&layout.problem.blocks[j], *p, *d), | ||||
|                     (b, new_pos, layout.blocks[i].1), | ||||
|                 ) | ||||
|         }) { | ||||
|             layout.blocks[i].0 = new_pos; | ||||
|         if layout | ||||
|             .blocks | ||||
|             .iter() | ||||
|             .enumerate() | ||||
|             .all(|(j, b)| j == i || !AABB::collision(b.get_aabb(), current_aabb)) | ||||
|         { | ||||
|             layout.blocks[i] = current; | ||||
|             true | ||||
|         } else { | ||||
|             false | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fn collision( | ||||
|         block1: (&Block, Position, Direction), | ||||
|         block2: (&Block, Position, Direction), | ||||
|     ) -> bool { | ||||
|         let (npos1, nsize1) = Self::normalize_pos(block1); | ||||
|         let (npos2, nsize2) = Self::normalize_pos(block2); | ||||
| 
 | ||||
|         npos1.x < npos2.x + nsize2.x | ||||
|             && npos1.x + nsize1.x > npos2.x | ||||
|             && npos1.y < npos2.y + nsize2.y | ||||
|             && npos1.y + nsize1.y > npos2.y | ||||
|     } | ||||
| 
 | ||||
|     pub(crate) fn normalize_pos(block: (&Block, Position, Direction)) -> (Position, Position) { | ||||
|         let npos = match block.2 { | ||||
|             Direction::Up => block.1, | ||||
|             Direction::Right => block.1.in_direction(&Direction::Left, block.0.size.y - 1), | ||||
|             Direction::Down => block.1 - (block.0.size - Position::new(1, 1)), | ||||
|             Direction::Left => block.1.in_direction(&Direction::Up, block.0.size.x - 1), | ||||
|         }; | ||||
|         let nsize = match block.2 { | ||||
|             Direction::Up | Direction::Down => block.0.size, | ||||
|             Direction::Right | Direction::Left => Position { | ||||
|                 x: block.0.size.y, | ||||
|                 y: block.0.size.x, | ||||
|             }, | ||||
|         }; | ||||
| 
 | ||||
|         (npos, nsize) | ||||
|     } | ||||
| 
 | ||||
|     pub fn score(&self) -> i32 { | ||||
|         let mut sum = 0; | ||||
| 
 | ||||
|         for c in &self.problem.connections { | ||||
|             let startpos = Self::transform( | ||||
|                 self.blocks[c.startblock].0, | ||||
|                 self.blocks[c.startblock].1, | ||||
|                 self.problem.blocks[c.startblock].output[c.startpoint].offset, | ||||
|             ); | ||||
|             let endpos = Self::transform( | ||||
|                 self.blocks[c.endblock].0, | ||||
|                 self.blocks[c.endblock].1, | ||||
|                 self.problem.blocks[c.endblock].input[c.endpoint].offset, | ||||
|             ); | ||||
| 
 | ||||
|             sum += (startpos.x - endpos.x).abs() + (startpos.y - endpos.y).abs(); | ||||
|         } | ||||
| 
 | ||||
|         sum | ||||
|     } | ||||
| 
 | ||||
|     pub(crate) fn transform(pos: Position, dir: Direction, offset: Position) -> Position { | ||||
|         match dir { | ||||
|             Direction::Up => pos + offset, | ||||
|             Direction::Right => pos + Position::new(-offset.y, offset.x), | ||||
|             Direction::Down => pos - offset, | ||||
|             Direction::Left => pos + Position::new(offset.y, -offset.x), | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub(crate) fn rotate(dir: Direction, rot: Direction) -> Direction { | ||||
|         match (rot, dir) { | ||||
|             (Direction::Up, _) => dir, | ||||
|             (Direction::Right, Direction::Up) => Direction::Right, | ||||
|             (Direction::Right, Direction::Right) => Direction::Down, | ||||
|             (Direction::Right, Direction::Down) => Direction::Left, | ||||
|             (Direction::Right, Direction::Left) => Direction::Up, | ||||
|             (Direction::Down, Direction::Up) => Direction::Down, | ||||
|             (Direction::Down, Direction::Right) => Direction::Left, | ||||
|             (Direction::Down, Direction::Down) => Direction::Up, | ||||
|             (Direction::Down, Direction::Left) => Direction::Right, | ||||
|             (Direction::Left, Direction::Up) => Direction::Left, | ||||
|             (Direction::Left, Direction::Right) => Direction::Up, | ||||
|             (Direction::Left, Direction::Down) => Direction::Right, | ||||
|             (Direction::Left, Direction::Left) => Direction::Down, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<'a> Visualize for Layout<'a> { | ||||
|     fn visualize(&self) -> Visualization { | ||||
|         let mut v = Visualization::new(self.problem.size); | ||||
| 
 | ||||
|         for (i, ((p, d), b)) in self | ||||
|         for (i, (b, mb)) in self | ||||
|             .blocks | ||||
|             .iter() | ||||
|             .zip(self.problem.blocks.iter()) | ||||
|  | @ -582,28 +511,34 @@ impl<'a> Visualize for Layout<'a> { | |||
|         { | ||||
|             let c = Color::index(i); | ||||
| 
 | ||||
|             let (npos, nsize) = Self::normalize_pos((b, *p, *d)); | ||||
|             let aabb = b.get_aabb(); | ||||
| 
 | ||||
|             for x in npos.x..(npos.x + nsize.x) { | ||||
|                 for y in npos.y..(npos.y + nsize.y) { | ||||
|             for x in aabb.min().x..=aabb.max().x { | ||||
|                 for y in aabb.min().y..=aabb.max().y { | ||||
|                     v.add_symbol(Position::new(x, y), Symbol::Block, Some(c), None); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             let pos = Self::transform(*p, *d, Position::new(0, 0)); | ||||
|             v.add_symbol(b.pos(), Symbol::Char('X'), Some(c), None); | ||||
| 
 | ||||
|             v.add_symbol(pos, Symbol::Char('X'), Some(c), None); | ||||
|             let transform = b.block_to_world(); | ||||
| 
 | ||||
|             for input in &b.input { | ||||
|                 let pos = Self::transform(*p, *d, input.offset); | ||||
| 
 | ||||
|                 v.add_symbol(pos, Symbol::Char('i'), Some(c), None); | ||||
|             for input in &mb.input { | ||||
|                 v.add_symbol( | ||||
|                     input.offset.transform(transform), | ||||
|                     Symbol::Char('i'), | ||||
|                     Some(c), | ||||
|                     None, | ||||
|                 ); | ||||
|             } | ||||
| 
 | ||||
|             for output in &b.output { | ||||
|                 let pos = Self::transform(*p, *d, output.offset); | ||||
| 
 | ||||
|                 v.add_symbol(pos, Symbol::Char('o'), Some(c), None); | ||||
|             for output in &mb.output { | ||||
|                 v.add_symbol( | ||||
|                     output.offset.transform(transform), | ||||
|                     Symbol::Char('o'), | ||||
|                     Some(c), | ||||
|                     None, | ||||
|                 ); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -12,6 +12,6 @@ pub mod prelude { | |||
|         block::Block, | ||||
|         direction::Direction, | ||||
|         position::{Position, PositionType}, | ||||
|         transformation::Transformation, | ||||
|         transformation::{Transformable, Transformation}, | ||||
|     }; | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue