The Process

Each gallery was created with generally the same multi-phase process – though the final manual stages has evolved.  The following describes the current process.

  1. Generate levels with my level generator.  Typically, I have the program generate 12,000 levels (10,000 for a couple galleries, 20,000 for the 100×100 double set) before moving on to the next phase.
  2. 60 (30 for the first few sets, and 120 for the 100×100 set) of the most unique levels are selected by my program via a process I call similarity filtering (see:  Similarity Maps).
  3. About 12 images are generated for each level with between 2 and 6 different settings.  The color of the dots is randomized for each image based on the theme regardless of the settings.
  4. A multi-step manual process to select images for the gallery detailed below.

The Automated Phase 

The first 3 steps are all done by my program.  Once I decide on the board size for the next set – within a couple minutes I can start the first step and if left unattended, the program will go through all 3 stages without intervention (this never happens though, since I stop the program often when I need to use the computer for something else).   If I tell it what to do next – after it generates images for one set, it will automatically start making levels for the next set.  

My PC is almost always processing – it is working on the next set while I am doing the manual work for the previous one. 

Time

Initially the whole process took a few hours for a set.  This was up to about a day by the 50×50 set, reaching 3-4 days by the 80×80 set. 

100×100 was supposed to be the set to end all sets – which is why I made it a double set.  It took 3 weeks of processing before I saw an image.  Despite the varying board sizes, the following 3 sets from 95×85 through 111×99 (not released) have taken about 10 days each.  

Up until 80×80 I had generally been increasing the board size in small increments.  The problem was that as I spent more time manually on each set, I wasn’t able to keep up with my program (and I was frankly burned out from looking at so many images, which is why I welcomed the “break” before the 100×100 set).  

Two sets (80×64 and 85×68) fared the same fate that many of the pages on this site have:  I started working on the next set before I finished them, and never got back to them.  The fact that I liked the following sets (75×75 and 80×80) better contributed to this.  

Generating the Levels

I only look at images for about 1 out of 200 levels generated by my program.  Of all the stages in the process – the level generation takes by far the longest, accounting for over 90% of the first 3 steps. 

  • 80×80 took about 3 days to generate 12000 levels at ~175/hour
  • 100×100 took about 20 days to generate 20000 levels at 1000 levels per day (~45/hour that would run for 22-24 hours a day depending on if I needed to use my computer for something else). 
  • 95×85 took about 8 days to generate 12000 levels, averaging about 70/hour.  The 1st 5200 levels averaged 85-90/hour, but a code change that added more randomness decreased that to just under 60/hour.  
  • 101×99 was all over the place with different settings plus 5 days of processing on an Amazon Web Services VM.  In all it took about 9 calendar days and 14 computer days to generate 12000 levels at a rate of as little as 25/hour to as high as 80/hour (average: 37/hour). 
  • The unreleased 111×99 set experimented with a code change that effectively removes phantom dots.  It also took 8-9 days at almost exactly the same rate as the 95×85 set.

I’ve found that increasing the board dimensions by 10 both ways typically doubles the processing time – 100×100 was almost exactly 1/4 the speed of 80/80, for example.  

Since 101×99 – I’ve been trying to improve the speed without sacrificing quality.  I managed about a 25% increase without any sacrifices – which made up for less than half of the speed lost due to the increased randomization.  “Fixing” a wacky bug that introduced phantom dots tripled the speed but also had a major impact on the levels.    

Similarity Filtering

Similarity filtering is more consistent because I haven’t touch the code since the 50×50 set.  Prior to this set, I changed a couple of settings to make the early stages of filtering faster (accepting slightly less accurate results), along with a couple other minor optimizations to the code.  

It took 12 hours for the process to select 60 levels out of 12000 levels generated at a size of 111×99.  This has scaled quite well with board size especially compared to level generation.  64×64 took 3 hours for example.  Because similarity filtering compares levels against each other – you would expect the time to scale with the square of the board size.  Increasing the size by a factor of 2.7 increased the time by 4 – much less than the 7.3 you would expect.  This is because the main factor isn’t the grid size – it’s the number of lines.  Larger board sizes average longer lines.

Image Generation

Image generating takes relatively the least amount of time of all the phases.  

It took 3.5 hours to generate the initial set of 720 images for the 111×99 set I am working on.

Image generation has undergone a couple code optimizations that increased the speed significantly:

  • calculation of the similarity map values is done once per level – it used to be done once per level.  The map values are saved to disc so that if I generate new images for a level, it won’t have to redo the calculation. 
  • similarity shading is generated once per level per settings file per.  Usually, multiple images are generated for a level with the same settings – but the color of the lines (not the shading) randomized between each.  It does have to calculate the shading each time I start a new set. 

The last factor is why I’ve gone from using about 6 different settings to only 2:  it takes about 4 times as long to generate the first image for a settings file as it does subsequent images.  It’s also part of the reason I generate 40+ images for individual levels.

The Manual Phase 

The manual phase usually begins with 12 images for 60 levels – a total of 720 images.  While I am calling it manual, at various times I will have the program generate new images for certain levels.  

  1. Pick 2 of my favorite images for each level – I used to pick only 1 image, but decided to include 1 image with cyan shading and 1 image with magenta shading.
  2. Sort the levels into 3 or 4 tiers ranging from my initial favorites in the first tier to levels that I won’t look at again.  
  3. Generate more images for the top 2 tiers (usually, about 40 for the top tier and 20 for the 2nd tier).  Eventually these are weaned down to 1 cyan and 1 magenta for each – though occasionally, I will pick more than 1 for each shading. 
  4. The remaining images are combined into 1 folder that I put on my tablet (usually ~80-90 images to start).  
  5. Over a period of a few days I’ll wean this down even further.  Some levels won’t get an image at all, some will get 1 image, others will get 2 and maybe a couple get 3 or more. 
  6. During this period, I’ll occasionally generate even more images for a couple levels that I feel could have better colors.  As of the 101×99 gallery, I mostly stopped doing this in favor of making manual line edits within the program.  Occasionally I’ll make minor post image adjustments on my phone or tablet (mainly to boost contrast, but sometimes will play around with other effects). 

On average I look at about 2500-3000 images generated by my program for each gallery.  

I started using a new color palette for the lines.  Since magenta and cyan shaded images now share the same theme, there is considerably less difference between them, so there is a good chance that I will stop separating them into categories.  

Evolution of the Manual Phase

For the very first few sets – there was no manual phase.  I generated 1 image for each level and put it in the gallery (I no longer include these in the menu, but you can see 30×24 for an example).  

I then started generating images with different settings for each level and selected my favorite for each – 45×45 is an example of this.  

From 60×60 and 70×56 on is when I stopped including all levels picked by my program and started generating many more versions of the levels that I did like.  

Although I added the ability to individually change the color of each line before the 100×100 set, it wasn’t until 2 sets later that I made significant use of it.  This looks like another major time sink. 

The Pain

I won’t lie – the manual process can be extremely tedious and painful.

The main culprit?  My cell phone.  Yes, I am a cell phone addict.  If my cell phone is more than 2 feet away from me I start to panic.  If I can’t find it for 5 seconds, I start having convulsions.  My games were designed for my phone – and though it’s somewhat shameful for me to admit, this art is kind of too.  

Yet – a large part of the manual work is done on my computer.  The images look completely different on my cheap monitors compared to my phone.   I bought a 10.1″ tablet even specifically for this, but regret not spending more than the $200 (1/4th of the cost of my phone, which has to mean something).  The display just isn’t nearly as sharp.  

I’ve written programs on my computer that help me with the manual process – I am not using windows explorer to look at 50 versions of each image and select the best one.   Stage 3 of the manual phase is the most painful though – while at stage 1, I pick 1 or 2 images per level, at this stage I will look at 50 or so images for each level on my computer with a yes/no button for each.  Because they look so different on my PC, I end up selecting Yes far more than I probably should  and about 1/3rd of the images make it onto my phone.