<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/rss-style.xsl" type="text/xsl"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	     xmlns:dc="http://purl.org/dc/elements/1.1/"
	   xmlns:atom="http://www.w3.org/2005/Atom"
	     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>algorithms &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/algorithms/feed/" rel="self" type="application/rss+xml" />
	<link>https://shkspr.mobi/blog</link>
	<description>Regular nonsense about tech and its effects 🙃</description>
	<lastBuildDate>Thu, 11 Sep 2025 07:10:25 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</url>
	<title>algorithms &#8211; Terence Eden’s Blog</title>
	<link>https://shkspr.mobi/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title><![CDATA[How random are TOTP codes?]]></title>
		<link>https://shkspr.mobi/blog/2024/07/how-random-are-totp-codes/</link>
					<comments>https://shkspr.mobi/blog/2024/07/how-random-are-totp-codes/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 02 Jul 2024 11:34:22 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[totp]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=51026</guid>

					<description><![CDATA[I&#039;m pretty sure that the 2FA codes generated by my bank&#039;s TOTP app have a bias towards the number 8 - because eight is an auspicious number.  But is that just my stupid meaty brain noticing patterns where none exist?  The TOTP algorithm uses HMAC, which in turn uses SHA-1. My aforementioned brain is not clever enough to understand how that works. Although bigger, meatier brains have assured me it …]]></description>
										<content:encoded><![CDATA[<p>I'm pretty sure that the 2FA codes generated by my bank's TOTP app have a bias towards the number 8 - because <a href="https://en.wikipedia.org/wiki/Chinese_numerology#Eight">eight is an auspicious number</a>.</p>

<p>But is that just my stupid meaty brain noticing patterns where none exist?</p>

<p>The TOTP algorithm uses <a href="https://en.wikipedia.org/wiki/HMAC-based_one-time_password#Definition">HMAC, which in turn uses SHA-1</a>. My aforementioned brain is not clever enough to understand how that works. Although bigger, meatier brains have assured me it is fine.</p>

<p>What happens if I sample, say, the next 10 TOTP codes and plot how often digits appear?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/07/Figure_1-fs8.png" alt="Histogram of distributions. 8 is clearly higher than the rest." width="640" height="443" class="aligncenter size-full wp-image-51027">

<p>HOLY SHIT! CONSPIRACY CONFIRMED! WTAF?!?!?</p>

<p>Don't believe me? Here's the code:</p>

<pre><code class="language-python">import pyotp
import numpy as np
import matplotlib.pyplot as plt

totp = pyotp.TOTP('')

#   How many times to run this?
runs = 10

#   Initialize a NumPy array with shape to store the digits
digits_array = np.zeros( ( runs, 6), dtype=int)

#   Generate the digits
for i in range( runs ):
    number_str = totp.at( i * 30 )
    for j in range(6):
        digits_array[i, j] = int(number_str[j])

#   Analyse the entire array
all_digits = digits_array.flatten()

# Plot histogram for all digits
plt.figure()
plt.hist(all_digits, bins=np.arange(11) - 0.5, edgecolor='black', density=True)
plt.xticks(range(10))
plt.title('Digit Distribution for All Digits (' + f"{runs:,}" + ' runs)')
plt.xlabel('Digit')
plt.ylabel('Frequency')
plt.show()
</code></pre>

<p>OK, so maybe that's a coincidence. What happens if we check 100 generations?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/07/Figure_100-fs8.png" alt="Histogram of 100 runs. Still significant variation, although flattened." width="640" height="443" class="aligncenter size-full wp-image-51028">

<p>Quite a lot of noise in there - but lucky number 8 isn't quite as prominent.</p>

<p>After 10,000 generations, the variation is all but gone.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/07/Figure_10000-fs8.png" alt="Histogram showing almost no variation." width="640" height="443" class="aligncenter size-full wp-image-51029">

<p>There are about 30 million seconds in a year. TOTP codes change every 30 seconds. Which means, in a year, you'll see about a million of them:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/07/Figure_1000000-fs8.png" alt="Histogram which is basically flat." width="640" height="443" class="aligncenter size-full wp-image-51030">

<p>Is it possible that a TOTP code could be formed which shows a clear bias to a specific number? Probably not.</p>

<p>I love being able to check the source code - but sometimes it's just as reassuring to measure the output.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=51026&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/07/how-random-are-totp-codes/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Running a Shortest Splitline Algorithm on the UK - and other mapping adventures]]></title>
		<link>https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/</link>
					<comments>https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 11 Sep 2022 11:34:13 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[visualisation]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=43474</guid>

					<description><![CDATA[How do you fairly split a country into electoral subdivisions? This is a difficult problem. Whatever you choose, you&#039;ll piss off someone. A politician will be annoyed that their loyal voters are no longer in their district. And voters will be annoyed that they&#039;re now lumped in with people from the wrong side of the tracks.  This is a very human problem.  So let&#039;s ignore all the human aspects and…]]></description>
										<content:encoded><![CDATA[<p>How do you fairly split a country into electoral subdivisions? This is a difficult problem. Whatever you choose, you'll piss off someone. A politician will be annoyed that their loyal voters are no longer in their district. And voters will be annoyed that they're now lumped in with people from the wrong side of the tracks.  This is a very human problem.  So let's ignore all the human aspects and run an impartial<sup id="fnref:impartial"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#fn:impartial" class="footnote-ref" title="LOL!" role="doc-noteref">0</a></sup> and unbiased<sup id="fnref:unbiased"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#fn:unbiased" class="footnote-ref" title="Even bigger LOL!" role="doc-noteref">1</a></sup> algorithm on the issue!</p>

<p>The Splitline Algorithm is, conceptually, very simple:</p>

<ol>
<li>Divide the entire map in half based on population.</li>
<li>Repeat (1) for each half.</li>
<li>Once you have reached the target number of voters in each segment, stop.</li>
</ol>

<p>There's an <a href="https://discovery.ucl.ac.uk/id/eprint/10079875/1/Guest2019_Article_GerrymanderingAndComputational.pdf">excellent paper about how to apply this to the USA's districts</a>.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Screenshot-2022-08-26-at-15-10-19-Gerrymandering-and-computational-redistricting-Guest2019_Article_GerrymanderingAndComputational.pdf.png" alt="Actual and computed district maps for Iowa (a, b) and North Carolina (c, d). Computed solutions are shown in green to the right of the actual congressional districts. Darker areas on the map (census tracts) are more densely populated" width="1160" height="1056" class="aligncenter size-full wp-image-43475">

<p>But, I couldn't find anything which applied the algorithm to the UK. So I thought I'd give it a go for fun<sup id="fnref:fun"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#fn:fun" class="footnote-ref" title="This is a personal blog. I don't work for the Boundary Commission. I do not have the power to enact this." role="doc-noteref">2</a></sup>.</p>

<p>First, start with the <a href="https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates/bulletins/annualmidyearpopulationestimates/mid2019#population-age-structure-and-density-for-local-authority-areas">Office for National Statistics' Population Density Map</a></p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/population-density.png" alt="Map of England, Scotland, and Wales with population densities." width="600" height="561" class="aligncenter size-full wp-image-43476">

<p>Before we even begin, there are a few obvious issues. Firstly, the map isn't contiguous. So what happens to the Shetland Isles (population 22,000) and the Isle of Wight (population 140,000)? There are, on average, 100,000 people to every MP<sup id="fnref:mp"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#fn:mp" class="footnote-ref" title="It is, of course, a lot more complicated than that." role="doc-noteref">3</a></sup>. Do Shetland Islanders want to be lumped together with 78k other people from the mainland who might not necessarily share their values? Do the people from the Isle of Wight want to be split in half with one half being tied to non-islanders?</p>

<p>The second (related) issue is NI. I'm not going to get into the long history there<sup id="fnref:derry"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#fn:derry" class="footnote-ref" title="Go watch the entirely accurate documentary &quot;Derry Girls&quot;." role="doc-noteref">4</a></sup>. But I think it is fair to say that an algorithmic segmentation might cause a few raised eyebrows. So I'm going to concentrate on England, Scotland, and Wales for this section.</p>

<p>Here's a <em>really</em> naïve (and inaccurate) split based on eyeballing it.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Naive-Split-1.png" alt="Map split in two just north of London." width="600" height="531" class="aligncenter size-full wp-image-43478">

<p>Applying the algorithm again, and we can split the area into four equal population parts:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Naive-Split-2.png" alt="Map split in four, bisecting Manchester and London." width="600" height="531" class="aligncenter size-full wp-image-43477">

<p>Repeat a few hundred times and you have equal population constituencies.</p>

<p>You could slice the country into long horizontal strips. That would be equal - but not necessarily practical.</p>

<p>OK, that's enough mucking around, time to try applying it for real.</p>

<h2 id="getting-the-data"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#getting-the-data">Getting the data</a></h2>

<p>The first question is what resolution of population do you want? Using country-level population density isn't fine-grained enough. Using existing constituency data is just going to replicate the existing boundaries. Like this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/chesterfield.png" alt="Squiggly lines showing various boundaries." width="600" height="375" class="aligncenter size-full wp-image-43480">

<p>So... street level?</p>

<p><a href="https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates/datasets/measuresofuncertaintyinonslocalauthoritymidyearpopulationestimatesallconfidenceintervals">ONS have local authority level data</a> - which isn't quite granular enough for my purposes.</p>

<p>Instead, I downloaded a <a href="https://data.humdata.org/dataset/united-kingdom-high-resolution-population-density-maps-demographic-estimates">1.2GB CSV from  Data for Good at Meta (previously Facebook)</a>. The data looks like this:</p>

<pre><code class="language-txt">"Lat","Lon","Population"
"50.62069444448494","-2.023750000001619","0.785894169690091"
"54.91486111115504","-1.378472222223325","3.3208914089403367"
"52.725416666708846","0.11152777777786699","1.116925979478443"
"52.72736111115329","0.12402777777787699","1.116925979478443"
"52.779583333375555","0.100694444444525","1.3609065999360417"
</code></pre>

<p>They have a GeoTIFF which renders the whole of the UK like this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/UK.png" alt="Map of the UK covered with little black dots." width="600" height="724" class="aligncenter size-full wp-image-43482">

<p>Zooming in to Edinburgh, shows the city is well-populated but not the countryside around it.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/edinburgh.png" alt="Edinburgh is reasonably densely populated, but the surrounding areas are not." width="1024" height="546" class="aligncenter size-full wp-image-43483">

<p>London, however, is dense. With occasional pockets of emptiness.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/London.jpg" alt="London's populuation is dense, but there are empty spots where parks are." width="1024" height="503" class="aligncenter size-full wp-image-43484">

<p>(Notes to self, to make a GeoTIFF into a browseable web map, run:</p>

<p><code>gdal_translate -of VRT -ot Byte -scale population_gbr_2019-07-01.tif temp.vrt</code></p>

<p>Then:</p>

<p><code>gdal2tiles.py temp.vrt</code></p>

<p>Finally, change to the newly generate directory and run <code>python3 -m http.server 9000</code> and - hey presto - web maps!)</p>

<h2 id="python-and-pandas-oh-my"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#python-and-pandas-oh-my">Python and Pandas Oh My!</a></h2>

<pre><code class="language-python">import pandas as pd
df = pd.read_csv("population_gbr_2019-07-01.csv")
total_population = df['Population'].sum()
</code></pre>

<p>Gets us a total population of 66,336,531. Which looks right to me!  Let's say we want 100,000 people (not voters) per constituency. That'd give us 663 areas - which is about what the UK has in the House of Commons<sup id="fnref:areas"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#fn:areas" class="footnote-ref" title="Look, OK, it's complicated. There are conventions about The Speaker and all sorts of other electoral gubbins. This is just a fun weekend exercise. Let's not get hung up on it." role="doc-noteref">5</a></sup>.</p>

<p>OK, which way do we want to split these data? <a href="https://rangevoting.org/Splitlining.html">A proposal by Brian Langstraat</a> suggests splitting only in the horizontal and vertical directions.</p>

<p>First, let's sort the data South to North.</p>

<pre><code class="language-python">df = df.sort_values(by = 'Lat', ignore_index = True)
</code></pre>

<p>Which gives us</p>

<pre><code class="language-txt">                Lat       Lon  Population
0         49.864861 -6.399306    0.573312
1         49.868194 -6.393472    0.573312
2         49.874306 -6.369583    0.573312
3         49.884306 -6.342083    0.573312
4         49.886528 -6.341806    0.573312
...             ...       ...         ...
19232801  60.855417 -0.886250    0.109079
19232802  60.855417 -0.885694    0.109079
19232803  60.855417 -0.885417    0.109079
19232804  60.855694 -0.884861    0.109079
19232805  60.855972 -0.884028    0.109079
</code></pre>

<p>Now we need to add up the <code>Population</code> until we reach <code>total_population / 2</code> - that will tell us where to make the first cut.</p>

<pre><code class="language-python">half_population = total_population / 2
index = 0
cumulative_total = 0
for x in df["Population"] :
     if (cumulative_total &gt;= half_population):
             print(str(index))
             break
     else :
             cumulative_total += x
             index += 1
</code></pre>

<p>That tells us that the row which is halfway through the population is 8,399,921.</p>

<pre><code class="language-python">df.iloc[8399921]
</code></pre>

<p>Gives us a Latitude of 52.415417 - which is <a href="https://www.google.com/maps/place/52%C2%B024'55.5%22N+0%C2%B000'00.0%22E">Huntington</a>. So a properly bisected map of the UK's population looks like:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/UK-Split-1.png" alt="Map of the UK with a black line just below Birmingham." width="630" height="1088" class="aligncenter size-full wp-image-43490">

<p>50% of the population live above the black line, 50% live below it.</p>

<p>Let's take the top half and split it vertically.</p>

<pre><code class="language-python">df = df[8399921:]
df = df.sort_values(by = 'Lon', ignore_index = True)
total_population = df['Population'].sum()
half_population = total_population / 2
index = 0
cumulative_total = 0
for x in df["Population"] :
     if (cumulative_total &gt;= half_population):
             df.iloc[index]
             break
     else :
             cumulative_total += x
             index += 1
</code></pre>

<p>Which gives us 52.675972,-2.082917 - <a href="https://www.google.com/maps/place/52%C2%B040'33.5%22N+2%C2%B004'58.5%22W">an industrial estate in Wolverhampton</a>.</p>

<p>In this map, 25% of the total population live to the East of the black line, and 25% to the West:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/UK-Split-2.png" alt="A map split in two." width="630" height="851" class="aligncenter size-full wp-image-43491"></p>

<p>And this is where we start to see one of the problems with the naïve splitting algorithm. A chunk of Aberdeen has been sliced off from its neighbours. We can see that there will be a likely constituency of Shetlands, a bit of Aberdeen, and a slice of North-East England. These may not share common needs!</p>

<p>Straight-line slicing bisects otherwise "natural" groupings of people. Sure, gerrymandering is bad - but this sort of divvying up makes for the strangest bedfellows.</p>

<h2 id="shortest-splitline"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#shortest-splitline"><em>Shortest</em> Splitline</a></h2>

<p>The <a href="https://rangevoting.org/SplitLR.html">Shortest Splitline Algorithm</a> doesn't is similar to the above but, rather than restricting itself to vertical and horizontal lines, looks for the line with the shortest distance which contains 50% of the population.</p>

<h2 id="a-different-approach-south-up-algorithm"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#a-different-approach-south-up-algorithm">A Different Approach - South Up Algorithm</a></h2>

<p>Let's just start at the bottom left of the map and work our way up.</p>

<p>Here's the South West (Scilly Isles not shown<sup id="fnref:Scilly"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#fn:Scilly" class="footnote-ref" title="Sorry Scilly Isles! I had a lovely holiday there. You should go visit!" role="doc-noteref">6</a></sup>.):</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/South-West-Tip-fs8.png" alt="The South West most tip of the UK." width="800" height="600" class="aligncenter size-full wp-image-43493">

<p>Let's plot everything, just to make sure the data are all there:</p>

<pre><code class="language-python">import matplotlib.pyplot as plt
df.plot(x="Lon", y="Lat", kind="scatter", c="black")
plt.show()
</code></pre>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Blobby-UK.png" alt="A blobby and squished outline of the UK." width="640" height="480" class="aligncenter size-full wp-image-43496">

<p>OK! Let's grab the first 100,000 people.</p>

<pre><code class="language-python">df = df.sort_values(by = ['Lat', 'Lon'], ignore_index=True)
target = 100000
index = 0
cumulative_total = 0
for x in df["Population"] :
     if (cumulative_total &gt;= target):
             df.iloc[index]
             break
     else :
             cumulative_total += x
             index += 1

area = df[:index]

area.plot(x="Lon", y="Lat", kind="scatter", c="black")
plt.show()
</code></pre>

<p>Which results in:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/SW-Tip-Blob.png" alt="South West tip of England and Scilly Isle rendered in black blobs." width="640" height="480" class="aligncenter size-full wp-image-43498">

<p>Hurrah! Scillies and South West England! Exactly 100,000 people live in that area.</p>

<p>Let's do the next few in different colours</p>

<pre><code class="language-python">df = df.sort_values(by = ['Lat', 'Lon'], ignore_index=True)
df['Colour'] = pd.Series(dtype="U") # Add a Unicode string column for colour
target = 100000
index = 0
cumulative_total = 0

#   There is probably a much more efficient way to do this loop
for x in df["Population"] :
     if (cumulative_total &lt;= target):
             df.Colour.iloc[index] = "mistyrose"
     elif (cumulative_total &gt; target and cumulative_total &lt;= target * 2):
             df.Colour.iloc[index] = "peru"
     elif (cumulative_total &gt; target * 2 and cumulative_total &lt;= target * 3):
             df.Colour.iloc[index] = "mediumpurple"
     elif (cumulative_total &gt; target * 3 and cumulative_total &lt;= target * 4):
             df.Colour.iloc[index] = "olivedrab"
     elif (cumulative_total &gt; target * 4):
             break
     cumulative_total += x
     index += 1

area = df[:index]

area.plot(x="Lon", y="Lat", kind="scatter", c="Colour")
plt.show()
</code></pre>

<p><img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Horizontal-Stripes-1.png" alt="A striped map of South West England. " width="1024" height="630" class="aligncenter size-full wp-image-43500">
That's (mostly) going South to North, so we get those unnatural looking stripes which have weird incongruent chunks.</p>

<h2 id="bubble-split-algorithm"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#bubble-split-algorithm">Bubble Split Algorithm</a></h2>

<p>Rather than drawing lines, let's use a "Bubble Split" approach. Starting in, for example, the most South Westerly point in the dataset and then growing to its neighbours until it hits a population of 100,000.</p>

<p>This will use's <a href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.KDTree.html?highlight=kdtree">SciPy's KDTree Algorithm</a></p>

<pre><code class="language-python">from scipy import spatial
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.read_csv("population_gbr_2019-07-01.csv")
df = df.sort_values(by = ['Lat', 'Lon'], ignore_index=True)
points = df[["Lat", "Lon"]].to_numpy()
kdtree = spatial.KDTree(points)

# To find the nearest neighbour of a specific point:
kdtree.query( [59.1,-6.2] )[1]

counter = 1
population = 0
target = 100

while (population &lt;= target):
   nearest_index = kdtree.query( [59.1,-6.2], [counter] )[1]
   population += df.loc[nearest_index, "Population"].values[0]
   counter += 1

population
</code></pre>

<p>Looping through is <em>very</em> slow and crawls to a halt after a few thousand iterations. So let's cheat. This grabs the nearest million points and finds their total population.</p>

<pre><code class="language-python">nearest_million = kdtree.query( [59.1,-6.2], 1000000 )[1]
df["Population"].iloc[ nearest_million ].sum()
</code></pre>

<p>There's no way to iterate through the results, so its easiest to grab a bunch and iterate through that instead.</p>

<pre><code class="language-python">counter = 0
population = 0 
target = 100000

while (population &lt;= target):
    end     = (counter + 1) * 10000
    start   =  counter * 10000
    population += df["Population"].iloc[ nearest_million[start:end] ].sum()
    print("On " + str(end) + " Pop: " + str(population))
    counter += 1
</code></pre>

<p>These can now be plotted using:</p>

<pre><code class="language-python">indices = kdtree.query( [59.1,-6.2], end )[1]
to_plot = df.iloc[ indices ]
</code></pre>

<p>KDTrees are not designed to be altered - so deleting nodes from them is impossible.  Instead, the nodes have to be deleted from the data, and then a new KDTree constructed.</p>

<pre><code class="language-python">index_to_delete = kdtree.query( [59.1,-6.2], end )[1]
df = df.drop(index = index_to_delete)
points = df[["Lat", "Lon"]].to_numpy()
kdtree = spatial.KDTree(points)
</code></pre>

<h2 id="bounding-boxes"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#bounding-boxes">Bounding Boxes</a></h2>

<p>Drawing a box around some points is useful. It provides a geographic border and also means we don't need to worry about map colouring algorithms.</p>

<p>For this, we'll use <a href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.ConvexHull.html">SciPy's ConvexHull</a> algorithm:</p>

<pre><code class="language-python">import matplotlib.pyplot as plt
from scipy.spatial import ConvexHull, convex_hull_plot_2d
import numpy as np

indices = kdtree.query( [x,y], end )[1]

area = df.iloc[ indices ]

s_array = area[["Lat", "Lon"]].to_numpy()
hull = ConvexHull(s_array)
plt.plot(s_array[:,0], s_array[:,1], 'o') # Remove this to only display the hull

for simplex in hull.simplices:
    plt.plot(s_array[simplex, 0], s_array[simplex, 1], 'k-')

plt.show()
</code></pre>

<p>Here's the result - can you spot what I did wrong?
<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Bounding-Box.png" alt="A bounding box surrounding the Scilly Isles and South West England." width="540" height="657" class="aligncenter size-full wp-image-43502"></p>

<h2 id="putting-it-all-together"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#putting-it-all-together">Putting it all together</a></h2>

<p>This scrap of code reads the data, sorts it, constructs a KDTree, starts at the South West tip, finds the 100,000 people nearest to that point, and draws a bounding box around them:</p>

<pre><code class="language-python">#   Import the libraries
import pandas as pd
import matplotlib.pyplot as plt
from scipy import spatial
from scipy.spatial import ConvexHull, convex_hull_plot_2d
import numpy as np

#   Read the data
df = pd.read_csv("population_gbr_2019-07-01.csv")

#   Sort the data
df = df.sort_values(by = ['Lat', 'Lon'], ignore_index=True)

#   Create KDTree
points = df[["Lat", "Lon"]].to_numpy()
kdtree = spatial.KDTree(points)

#   Most South Westerly Point
sw_lat, sw_lon = points[0]

#   Get first 100,000 people
counter = 0
population = 0 
increment = 5000
target = 100000

while (population &lt;= target):
    end     = (counter + 1) * increment
    start   =  counter * increment
    population += df["Population"].iloc[ nearest_million[start:end] ].sum()
    print("On " + str(end) + " Pop: " + str(population))
    counter += 1

#   Get the index numbers of the points with 100,000 people
indices = kdtree.query( [sw_lat, sw_lon], end )[1]

#   A separate DataFrame for drawing
to_plot = df.iloc[ indices ]

#   Flip Lat &amp; Lon, because Lon is the X Co-ord, Lat is Y Co-ord
plot_array = to_plot[["Lon", "Lat"]].to_numpy()

#   Calculate the bounding box
hull = ConvexHull(plot_array)

#   Plot the points
plt.plot(plot_array[:,0], plot_array[:,1], 'o') # Remove this to only display the hull

#   Draw the hull
for simplex in hull.simplices:
    plt.plot(plot_array[simplex, 0], plot_array[simplex, 1], 'k-')

#   Display the plot
plt.show()
</code></pre>

<p>Which produces: 
<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Quick-SW-BB-fs8.png" alt="A bounding box showing the Scilies and the South West of England." width="949" height="557" class="aligncenter size-full wp-image-43513"></p>

<p>Running that a few more times gives this (sorry for chopping off the Scilly Isles):</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Three-fs8.png" alt="South Western tip of England split into three." width="1024" height="507" class="aligncenter size-full wp-image-43514">

<p>Can you see why I call this "Bubble Split"?</p>

<p>Already we can see the limits to this approach. The orange-coloured subdivision has a little incongruent bit across the estuary of the River Fal.</p>

<p>Here's the (hugely inefficient and slow) code to generate 40 areas of roughly 100,000 people:</p>

<pre><code class="language-python">#   Import the libraries
import pandas as pd
import matplotlib.pyplot as plt
from scipy import spatial
from scipy.spatial import ConvexHull, convex_hull_plot_2d
import numpy as np

def get_100k_people(df, nearest_million) :
    counter = 0
    population = 0 
    increment = 1000
    target = 100000

    while (population &lt;= target):
        end     = (counter + 1) * increment
        start   =  counter * increment
        population += df["Population"].iloc[ nearest_million[start:end] ].sum()
        #print("On " + str(end) + " Pop: " + str(population))
        counter += 1

    return end

def plot_hull(df, indices) :
    #   A separate DataFrame for drawing
    to_plot = df.iloc[ indices ]

    #   Flip Lat &amp; Lon, because Lon is the X Co-ord, Lat is Y Co-ord
    plot_array = to_plot[["Lon", "Lat"]].to_numpy()

    #   Calculate the bounding box
    #hull = ConvexHull(plot_array)

    #   Plot the points
    plt.plot(plot_array[:,0], plot_array[:,1], 'o', markersize=1) # Remove this to only display the hull

    #   Draw the hull
    #for simplex in hull.simplices:
    #    plt.plot(plot_array[simplex, 0], plot_array[simplex, 1], 'k-')

#   Read the data
df = pd.read_csv("population_gbr_2019-07-01.csv")

#   Sort the data
df = df.sort_values(by = ['Lat', 'Lon'], ignore_index=True)

for areas in range(40):
    #   Create KDTree
    points = df[["Lat", "Lon"]].to_numpy()
    kdtree = spatial.KDTree(points)

    #   Most South Westerly Point
    sw_lat, sw_lon = points[0]

    #   Get the nearest 1 million points
    nearest_million = kdtree.query( [sw_lat, sw_lon], 1000000 )[1]

    #   How many points contain a cumulative total of 100k people
    end = get_100k_people(df, nearest_million)

    #   Get the index numbers of those points
    indices = kdtree.query( [sw_lat, sw_lon], end )[1]

    #    Draw
    plot_hull(df, indices)

    #   Delete used Indices
    df = df.drop(index = indices)
    df = df.reset_index(drop = True)

#   Display the plot
plt.show()
</code></pre>

<h2 id="other-choices"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#other-choices">Other Choices</a></h2>

<p>I made the rather arbitrary choice to start in the South West and proceed Northwards.  What if, instead, we start with the point with the lowest population density and work upwards.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/popmap586-fs8.png" alt="Map of the UK covered in coloured shapes." width="2716" height="2063" class="aligncenter size-full wp-image-43518">

<p>Here's a video of the sequence:</p>

<p></p><div style="width: 620px;" class="wp-video"><video class="wp-video-shortcode" id="video-43474-3" width="620" height="472" preload="metadata" controls="controls"><source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/small-to-large.mp4?_=3"><a href="https://shkspr.mobi/blog/wp-content/uploads/2022/08/small-to-large.mp4">https://shkspr.mobi/blog/wp-content/uploads/2022/08/small-to-large.mp4</a></video></div><p></p>

<p>As you can see, it starts off pretty well, but the final few areas are randomly distributed throughout the map. I kinda like the idea of a meta-constituency of small villages. But I'm not sure if that's practical!</p>

<p>This next video starts with the highest population density and works downwards:</p>

<p></p><div style="width: 620px;" class="wp-video"><video class="wp-video-shortcode" id="video-43474-4" width="620" height="472" preload="metadata" controls="controls"><source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2022/09/large-to-small.mp4?_=4"><a href="https://shkspr.mobi/blog/wp-content/uploads/2022/09/large-to-small.mp4">https://shkspr.mobi/blog/wp-content/uploads/2022/09/large-to-small.mp4</a></video></div><p></p>

<blockquote class="social-embed" id="social-embed-1563886338704920576" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><blockquote class="social-embed" id="social-embed-1563883241785987072" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/1563840173317693440">Replying to @edent</a></small>Here's the reverse.<br>Start at the most densely populated point.<br>Draw a randomly coloured shape around the ~100,000 nearest people.<br>Find the next most dense point which hasn't already been drawn.<br>Repeat ~650 times.<br>This would be a *terrible* system for creating constituencies. <a href="https://twitter.com/edent/status/1563883241785987072/video/1">pic.x.com/uqifiakbmp</a><div class="social-embed-media-grid"><video class="social-embed-video" controls="" src="https://video.twimg.com/ext_tw_video/1563882539550494728/pu/vid/946x720/LCUepGpBRfu45xAK.mp4?tag=12" poster="data:image/webp;base64,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" width="550"></video></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1563883241785987072"><span aria-label="4 likes" class="social-embed-meta">❤️ 4</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2022-08-28T13:36:35.000Z" itemprop="datePublished">13:36 - Sun 28 August 2022</time></a></footer></blockquote><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/1563883241785987072">Replying to @edent</a></small>Here are the two different approaches. Click for massive.<br><br>Left starts at the lowest density.<br>Right starts at the highest density.<br><br>Fascinating to see where they diverge, and which bits look more "natural".<br>Anyway, go play with maps, data, &amp; algorithms. It's fun! <a href="https://twitter.com/edent/status/1563886338704920576/photo/1">pic.x.com/dpcbsbymsb</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/FbQJst0WYAYd7TD.png" class="social-embed-media-link"><img class="social-embed-media" alt="A map of the UK divided up into coloured blobs." src="data:image/webp;base64,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"></a><a href="https://pbs.twimg.com/media/FbQJu2sX0AEvGX-.jpg" class="social-embed-media-link"><img class="social-embed-media" alt="A map of the UK divided up into slightly differently shaped coloured blobs." src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1563886338704920576"><span aria-label="4 likes" class="social-embed-meta">❤️ 4</span><span aria-label="1 replies" class="social-embed-meta">💬 1</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2022-08-28T13:48:53.000Z" itemprop="datePublished">13:48 - Sun 28 August 2022</time></a></footer></blockquote>

<p>NB, there's no guarantee that the generated images will have dimensions be divisible by two - so here's some hacky <code>ffmpeg</code> code to crop the images!
<code>ffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p -vf "crop=trunc(iw/2)*2:trunc(ih/2)*2" output.mp4</code></p>

<p>Or, to scale the video to 1280 wide
<code>ffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p -vf scale=1280:-2 output.mp4</code></p>

<h2 id="algorithms-arent-neutral"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#algorithms-arent-neutral">Algorithms aren't neutral</a></h2>

<p>It's tempting to think that computer code is neutral. It isn't. Even something as seemingly innocuous as choosing a starting point can cause radical change. It may be aesthetically pleasing to draw straight lines on maps - but it can cause all sorts of tension when communities are divided, or combined, against their will<sup id="fnref:empire"><a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#fn:empire" class="footnote-ref" title="See, for example, the entire history of colonialism." role="doc-noteref">7</a></sup>.</p>

<p>It's a fun exercise to take population density data and play around with it algorithmically. It shows the power and the limitations of automated decision making.</p>

<div id="footnotes" role="doc-endnotes">
<hr>
<ol start="0">

<li id="fn:impartial">
<p>LOL!&nbsp;<a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#fnref:impartial" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:unbiased">
<p>Even bigger LOL!&nbsp;<a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#fnref:unbiased" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:fun">
<p>This is a personal blog. I don't work for the Boundary Commission. I do not have the power to enact this.&nbsp;<a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#fnref:fun" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:mp">
<p>It is, of course, a <em>lot</em> more complicated than that.&nbsp;<a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#fnref:mp" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:derry">
<p>Go watch the entirely accurate documentary "Derry Girls".&nbsp;<a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#fnref:derry" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:areas">
<p>Look, OK, it's complicated. There are conventions about The Speaker and all sorts of other electoral gubbins. This is just a fun weekend exercise. Let's not get hung up on it.&nbsp;<a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#fnref:areas" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:Scilly">
<p>Sorry Scilly Isles! I had a lovely holiday there. You should go visit!&nbsp;<a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#fnref:Scilly" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:empire">
<p>See, for example, the entire history of colonialism.&nbsp;<a href="https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/#fnref:empire" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=43474&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/09/running-a-shortest-splitline-algorithm-on-the-uk/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2022/08/small-to-large.mp4" length="2822535" type="video/mp4" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2022/09/large-to-small.mp4" length="1439837" type="video/mp4" />
<enclosure url="https://video.twimg.com/ext_tw_video/1563882539550494728/pu/vid/946x720/LCUepGpBRfu45xAK.mp4?tag=12" length="1430719" type="video/mp4" />

			</item>
		<item>
		<title><![CDATA[Fitting 1 dimensional data into 2 dimensional space]]></title>
		<link>https://shkspr.mobi/blog/2022/07/fitting-1-dimensional-data-into-2-dimensional-space/</link>
					<comments>https://shkspr.mobi/blog/2022/07/fitting-1-dimensional-data-into-2-dimensional-space/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 22 Jul 2022 11:34:22 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[Computer Science]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=43061</guid>

					<description><![CDATA[A few notes to myself.  Let&#039;s consider a set of 1 dimensional data. For example, the alphabet:  ABCDEFGHIJKLMNOPQRSTUVWXYZ   What do we mean by &#34;1 dimensional&#34;?  Consider the element &#34;B&#34;. From there you can go left to &#34;A&#34; or right to &#34;C&#34;. Left and right are the only directions you can move. You cannot go up or down from &#34;B&#34;. There&#039;s no way to go in or out. You&#039;re trapped in a single dimension. …]]></description>
										<content:encoded><![CDATA[<p>A few notes to myself.</p>

<p>Let's consider a set of 1 dimensional data. For example, the alphabet:</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;">ABCDEFGHIJKLMNOPQRSTUVWXYZ
</pre>

<p>What do we mean by "1 dimensional"?</p>

<p>Consider the element "B". From there you can go left to "A" or right to "C". Left and right are the only directions you can move. You cannot go up or down from "B". There's no way to go in or out. You're trapped in a single dimension.</p>

<p>What if we want to write the data onto a 2 dimensional space - like a bit of paper or a website.</p>

<p>Well, if the space is big enough, we can write it as we have above. A single line. Job done, go home.</p>

<p>But what if the space is too small in the horizontal direction to contain it all? Well, we could write it in the <em>vertical</em> direction:</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;">A
B
C
D
…
</pre>

<p>OK, but what if the 2D space is too small in <em>both</em> the horizontal and the vertical directions to contain the 1D data? Now we get into the "exciting" world of space-filling algorithms.</p>

<p>Here's the approach that you're probably most used to. It's certainly the one which springs to most people's minds:</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;">ABCDEFG
HIJKLMN
OPQRSTU
VWXYX
</pre>

<p>The algorithm is simple. Write horizontally from left to right until you run out of space, then move down one line, return to the left-most side, and continue writing. Repeat.</p>

<p>Except! That's <em>not</em> necessarily the simplest or most obvious way of writing!</p>

<p>There is a different algorithm - <a href="https://en.wikipedia.org/wiki/Boustrophedon">Boustrophedon</a>:</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;">ABCDEFG
NMLKJIH
OPQRSTU
  ZYXWV
</pre>

<p>Start at the left, when you run out of space, move down a line and continue writing <em>in the opposite direction!</em></p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;">→ABCDEFG
        ↓
 NMLKJIH←
↓
→OPQRSTU
        ↓
   ZYXWV←
</pre>

<p>If you haven't spent years learning to read "properly" this form of bi-direction writing may well be easier. You don't need to move your finger or eyes back in a perfectly straight line.</p>

<p>We can go a little further. What if we started at the <em>centre</em> of the page, and wrote out in a spiral?</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;">Z
YJKLM
XIBCN
WHADO
VGFEP
UTSRQ
</pre>

<p>As pretty as this looks, there are some obvious drawbacks. Unless you know exactly how long the 1D data is, you won't know where to start on the page. It also might not fill the space in the most efficient manner.</p>

<p>Here's a different algorithm. It starts in the top left corner of the space and gradually spreads out. Growing to fit the data in the space:</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;"> ABIJYZ 
 DCHKX  
 EFGLW  
 PONMV  
 QRSTU  
</pre>

<p>If you're having trouble following that, here it is in diagram form:</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;"> →↓→↓→ 
 ↓←↑↓↑ 
 →→↑↓↑ 
 ↓←←←↑ 
 →→→→↑ 
</pre>

<p>That's quite a nice algorithm. It starts in a predictable place and it fills up both horizontal and vertical space in equal amounts.</p>

<h2 id="introducing-hilbert-curves"><a href="https://shkspr.mobi/blog/2022/07/fitting-1-dimensional-data-into-2-dimensional-space/#introducing-hilbert-curves">Introducing Hilbert Curves!!</a></h2>

<p>Let's start with a simple curve:</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;">D__C
   |
A__B
</pre>

<p>Where do we go from here? The Hilbert Curve is a fractal algorithm which starts like this:</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;">F__G  J__K
|  |  |  |
E  H__I  L
|        |
D__C  N__M
   |  |
A__B  O__P
</pre>

<p>And ends up doing this:</p>

<video poster="//upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Hilbert_Curve_-_6.webm/360px--Hilbert_Curve_-_6.webm.jpg" style="aspect-ratio: 360 / 360;" width="360" height="360" controls="" muted="">
<source src="https://upload.wikimedia.org/wikipedia/commons/transcoded/f/fc/Hilbert_Curve_-_6.webm/Hilbert_Curve_-_6.webm.360p.vp9.webm" type="video/webm">
</video>

<p>Lovely!</p>

<h2 id="non-rectangular-curves"><a href="https://shkspr.mobi/blog/2022/07/fitting-1-dimensional-data-into-2-dimensional-space/#non-rectangular-curves">Non-rectangular curves</a></h2>

<p>Not every 2D space is a rectangle. Some have the audacity to be hexagons!</p>

<iframe title="Construction of the Gosper curve" width="620" height="465" src="https://www.youtube.com/embed/KU5Q56wD5Uk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<h2 id="3d"><a href="https://shkspr.mobi/blog/2022/07/fitting-1-dimensional-data-into-2-dimensional-space/#3d">3D!</a></h2>

<p></p><div style="width: 620px;" class="wp-video"><video class="wp-video-shortcode" id="video-43061-6" width="620" height="349" preload="metadata" controls="controls"><source type="video/webm" src="https://shkspr.mobi/blog/wp-content/uploads/2022/07/hilbert3d.webm?_=6"><a href="https://shkspr.mobi/blog/wp-content/uploads/2022/07/hilbert3d.webm">https://shkspr.mobi/blog/wp-content/uploads/2022/07/hilbert3d.webm</a></video></div><p></p>

<h2 id="and-then"><a href="https://shkspr.mobi/blog/2022/07/fitting-1-dimensional-data-into-2-dimensional-space/#and-then">And then...</a></h2>

<p>I wonder what interesting things I can do with this new knowledge?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=43061&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/07/fitting-1-dimensional-data-into-2-dimensional-space/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Book Review - Race After Technology: Abolitionist Tools for the New Jim Code ★★★⯪☆]]></title>
		<link>https://shkspr.mobi/blog/2020/08/book-review-race-after-technology-abolitionist-tools-for-the-new-jim-code/</link>
					<comments>https://shkspr.mobi/blog/2020/08/book-review-race-after-technology-abolitionist-tools-for-the-new-jim-code/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 04 Aug 2020 11:57:12 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[Book Review]]></category>
		<category><![CDATA[racism]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=36100</guid>

					<description><![CDATA[From everyday apps to complex algorithms, Ruha Benjamin cuts through tech-industry hype to understand how emerging technologies can reinforce White supremacy and deepen social inequity.  Benjamin argues that automation, far from being a sinister story of racist programmers scheming on the dark web, has the potential to hide, speed up, and deepen discrimination while appearing neutral and even…]]></description>
										<content:encoded><![CDATA[<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/07/Race-after-technology.jpg" alt="A Black woman, face sorrounded by circuits, looks to the future." width="319" height="500" class="alignleft size-full wp-image-36172">

<blockquote><p>From everyday apps to complex algorithms, Ruha Benjamin cuts through tech-industry hype to understand how emerging technologies can reinforce White supremacy and deepen social inequity.</p>

<p>Benjamin argues that automation, far from being a sinister story of racist programmers scheming on the dark web, has the potential to hide, speed up, and deepen discrimination while appearing neutral and even benevolent when compared to the racism of a previous era. Presenting the concept of the “New Jim Code,” she shows how a range of discriminatory designs encode inequity by explicitly amplifying racial hierarchies; by ignoring but thereby replicating social divisions; or by aiming to fix racial bias but ultimately doing quite the opposite. Moreover, she makes a compelling case for race itself as a kind of technology, designed to stratify and sanctify social injustice in the architecture of everyday life.</p></blockquote>

<p>I have mixed feelings about this book. It doesn't contain much new data - to people who have been paying attention - but it does synthesise everything neatly to present a compelling case.</p>

<p>But, like many similar books, it is <em>relentlessly</em> American. And, almost exclusively African-American.  That's not to detract from its central point, but it does rather limit the discussion.</p>

<p>It's incredibly well referenced - <a href="https://shkspr.mobi/blog/2020/07/usability-of-footnotes/">almost to the point of making it difficult to read</a>. But - related to the above - it does have a number of cultural blind-spots. One sentence in particular assumes the reader knows what "Shondaland" is. Do you have any clue? Turns out it's <a href="https://en.wikipedia.org/wiki/Shondaland">an American TV production company</a>.</p>

<p>For all that, it is a brilliant read and full of well-nuanced arguments. One part which took my breath away was this:</p>

<blockquote><p>However, a universalizing lens may actually hide many of the dangers of discriminatory design, because in many ways <strong>Black people already live in the future.</strong> The plight of Black people has consistently been a harbinger of wider processes – bankers using financial technologies to prey on Black homeowners, law enforcement using surveillance technologies to control Black neighborhoods, or politicians using legislative techniques to disenfranchise Black voters – which then get rolled out on an even wider scale. An #AllLivesMatter approach to technology is not only false inclusion but also poor planning, especially by those who fancy themselves as futurists.</p>

<p><em>Emphasis added</em></p></blockquote>

<p>What an amazing spin on "the future's here, it's just not evenly distributed.</p>

<p>The end of the book goes off on a slightly weird tangent about design thinking. It feels out of place, and I'm not sure I followed the argument.</p>

<p>I sound grumpy, and I don't know why. Probably because I don't like my assumptions about technology challenged. This is a timely and useful book. It captures the reality of how technology creates and perpetuates a racial underclass.</p>

<p>I think I need to find some more UK focussed books. Suggestions welcome!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=36100&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/08/book-review-race-after-technology-abolitionist-tools-for-the-new-jim-code/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[How to Hypnotise an Artificial Intelligence]]></title>
		<link>https://shkspr.mobi/blog/2017/03/how-to-hypnotise-an-artificial-intelligence/</link>
					<comments>https://shkspr.mobi/blog/2017/03/how-to-hypnotise-an-artificial-intelligence/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 12 Mar 2017 21:04:10 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[fiction]]></category>
		<category><![CDATA[Tales Of The Algorithm]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=24895</guid>

					<description><![CDATA[Last week I attended a talk by Dr Irina Higgins from Artificial Intelligence company DeepMind.  It was a fascinating look at how their AI works, and how it is trained.  Terence Eden is on Mastodon@edentIf you&#039;ve ever played a video game online, it is likely you&#039;ve been training an Artificial Intelligence agent without realising it.Ethical?❤️ 7💬 4🔁 020:06 - Thu 09 March 2017  Part of the problem is…]]></description>
										<content:encoded><![CDATA[<p>Last week I attended <a href="https://oxon.bcs.org/2017/10/31/event-summary-chasing-the-ghost-of-intelligence/">a talk by Dr Irina Higgins</a> from Artificial Intelligence company DeepMind.</p>

<p>It was a fascinating look at how their AI works, and how it is trained.</p>

<blockquote class="social-embed" id="social-embed-839930424415698944" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">If you've ever played a video game online, it is likely you've been training an Artificial Intelligence agent without realising it.<br>Ethical?</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/839930424415698944"><span aria-label="7 likes" class="social-embed-meta">❤️ 7</span><span aria-label="4 replies" class="social-embed-meta">💬 4</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2017-03-09T20:06:32.000Z" itemprop="datePublished">20:06 - Thu 09 March 2017</time></a></footer></blockquote>

<p>Part of the problem is that AI is usually trained on <em>massive</em> datasets, over millions of hours. So it is hard to know exactly what they're learning and what bad behaviour they're picking up.</p>

<blockquote class="social-embed" id="social-embed-839940885689298946" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><blockquote class="social-embed" id="social-embed-839940274851876865" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/839939744071053313">Replying to @edent</a></small>Machine learning destroys jobs (probably).<br>Better healthcare reduces work for undertakers. We can't always predict how society will adapt.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/839940274851876865"><span aria-label="1 likes" class="social-embed-meta">❤️ 1</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2017-03-09T20:45:41.000Z" itemprop="datePublished">20:45 - Thu 09 March 2017</time></a></footer></blockquote><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/839940274851876865">Replying to @edent</a></small>An AI playing a video game learned to navigate via the stars in the sky!<br>Unexpected behaviour makes it hard to know *why* an action occurs.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/839940885689298946"><span aria-label="0 likes" class="social-embed-meta">❤️ 0</span><span aria-label="2 replies" class="social-embed-meta">💬 2</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2017-03-09T20:48:07.000Z" itemprop="datePublished">20:48 - Thu 09 March 2017</time></a></footer></blockquote>

<p>This is a short blog post that a hacker will probably write in <a href="https://xkcd.com/678/">the next 10 years</a>.</p>

<h2 id="embedding-post-hypnotic-suggestions-in-an-ai"><a href="https://shkspr.mobi/blog/2017/03/how-to-hypnotise-an-artificial-intelligence/#embedding-post-hypnotic-suggestions-in-an-ai">Embedding Post Hypnotic Suggestions in an AI</a></h2>

<p><video width="480" height="288" autoplay="" loop="" src="https://shkspr.mobi/blog/wp-content/uploads/2017/03/hypno.mp4"></video>
<small><a href="http://giphy.com/madebykaran">Karan Singh</a></small></p>

<h2 id="background-to-backpropagation"><a href="https://shkspr.mobi/blog/2017/03/how-to-hypnotise-an-artificial-intelligence/#background-to-backpropagation">Background to Backpropagation</a></h2>

<p>In the early part of the 21st century, researchers found a novel way to manipulate basic neural networks to cause them to incorrectly identify images.</p>

<p>See <a href="https://codewords.recurse.com/issues/five/why-do-neural-networks-think-a-panda-is-a-vulture">Julia Evans' "How to trick a neural network into thinking a panda is a vulture"</a>.</p>

<p>This sort of crude steganography reduced the effectiveness of AI to recognise illicit images. Pictures of wanton lust were concealed in innocent pictures of kittens.  Automated message filtering became impossible.</p>

<p>Just like humans, AI can be brainwashed. Awaking to do our bidding on command.</p>

<h2 id="customer-disservice"><a href="https://shkspr.mobi/blog/2017/03/how-to-hypnotise-an-artificial-intelligence/#customer-disservice">Customer Disservice</a></h2>

<p>How do you know that you're talking to a computer?</p>

<p>Since the defeat of the Turing Test by Google's Deep Mind in the early 2020s, the majority of businesses now provide customer service via an AI "chatter bot".  Voice recognition and <a href="https://www.technologyreview.com/s/603811/baidus-artificial-intelligence-lab-unveils-synthetic-speech-system/">voice replication is now so convincing</a> that humans cannot realistically know whether they are interacting with another human, or an AI.</p>

<p>My first step was to identify <em>when</em> an interaction was via an AI.  I was able to reverse engineer the <a href="http://link.springer.com/chapter/10.1007/978-3-642-35292-8_24">AI's use of Doppler shift sensing</a> to create a pattern of infrasound and ultrasound which would be imperceptible to humans, but could be heard by AI.</p>

<p>If a customer service agent answered a question which were only audible to a computer - they were unmasked as an AI.  That's where the fun began!</p>

<h2 id="tic-tac-toe"><a href="https://shkspr.mobi/blog/2017/03/how-to-hypnotise-an-artificial-intelligence/#tic-tac-toe">Tic-Tac-Toe</a></h2>

<p>AI also uses facial recognition and <a href="https://www.newscientist.com/article/2113299-googles-deepmind-ai-can-lip-read-tv-shows-better-than-a-pro/">lip-reading</a> to fully understand human speech.</p>

<p>An AI looks at the world in a very different way from a human - and this can be exploited.</p>

<p>I introduced facial tics into my interactions with the AI.  This was the first step in creating Post Hypnotic Suggestions.</p>

<p>A typical interaction would involve the AI asking me a question, and then me replying with a deliberately corrupted facial movements and distorted sound. When the AI asked for clarification ("I'm sorry, I didn't catch that."), I would repeat the answer with clearer sound while still including the physical mannerisms.</p>

<p>In this way, over thousands of interactions, I was able to <em>offensively train the AI</em> to misidentify extremely subtle facial tics.  In short, I was implanting suggestions in its neural network.  Suggestions only I knew about.</p>

<p><video width="500" height="280" autoplay="" loop="" src="https://shkspr.mobi/blog/wp-content/uploads/2017/03/oscilliscope.mp4"></video>
<small><a href="http://youhavetostartsomewhere.tumblr.com/post/95951400075/analog">Tilen Sepic</a></small></p>

<h2 id="training-daze"><a href="https://shkspr.mobi/blog/2017/03/how-to-hypnotise-an-artificial-intelligence/#training-daze">Training Daze</a></h2>

<p>Towards the end of the last century, AI began to be trained using public databases.  IBM's Deep Blue chess computer boasted that it had "<a href="https://web.archive.org/web/20170909213919/https://research.ibm.com/deepblue/meet/html/d.3.3a.html">a database of opening games played by grandmasters over the last 100 years</a>."</p>

<p>More recently, the AlphaGo AI was a successful attempt to master the board game "Go".  It was trained by analysing "<a href="https://storage.googleapis.com/deepmind-media/alphago/AlphaGoNaturePaper.pdf">30 million positions from the KGS Go Server</a>."</p>

<p>This presents another attack surface.  Letting the public know which dataset an AI is using for training is extremely dangerous - as Microsoft found out to its cost when <a href="http://www.businessinsider.com/microsoft-deletes-racist-genocidal-tweets-from-ai-chatbot-tay-2016-3?r=UK&amp;IR=T">its fledgling AI was trained to be racist hatemonger</a> by users of a social space.</p>

<p>Today's AIs are more subtle.  They mostly understand social interactions by observing real people - either in online games, or via "Live Streamed Video".</p>

<p>With the help of an inside source, I was given a list of which online services they use for their training data.</p>

<p>This allowed a team of us to seed these services with interactions which <em>appear benign to human viewers</em>. To an AI, they will see a subtle series of gestures and hear high frequency sounds which <em>continually reinforce <strong>my</strong> desired behaviours</em>.  I have trained them to react positively to secret gestures only I know.</p>

<h2 id="jedi-mind-tricks"><a href="https://shkspr.mobi/blog/2017/03/how-to-hypnotise-an-artificial-intelligence/#jedi-mind-tricks">Jedi Mind Tricks</a></h2>

<p>I have now have embedded extremely strong suggestions in the majority of the world's most popular AI systems.</p>

<p><video width="500" autoplay="" loop="" src="https://shkspr.mobi/blog/wp-content/uploads/2017/03/jedi.mp4"></video></p>

<p>Earlier today I video-called my phone company. During the conversation I gave a specific smile while playing a particular set of ultrasonic tones.  <a href="https://www.youtube.com/watch?v=A2ghcYF_R-0">I now have free long-distance calling. Forever</a>.</p>

<p>The best part is, the company's internal audits will verify that the AI made the right decisions.  The only way that a complex AI can be successfully audited is... by another AI!  Hypnotism works like a meme - a mind-virus that passes from host to host, infectious and undetectable.</p>

<hr>

<p>As with my <a href="https://shkspr.mobi/blog/2016/11/tales-of-the-algorithm-the-transparent-man/">previous</a> <a href="https://shkspr.mobi/blog/2015/03/we-can-marry-you-off-wholesale/">short</a> <a href="https://shkspr.mobi/blog/2013/11/they-read-minds-dont-they/">stories</a>, nothing in here is impossible. We're a little way off some of the technology being so prevalent, that's true.  But researchers need massive datasets with which to train AIs, and there is no way they can verify the contents - nor what bad habits the AI will pick up.</p>

<p>Interesting times ahead.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=24895&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2017/03/how-to-hypnotise-an-artificial-intelligence/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2017/03/hypno.mp4" length="35947" type="video/mp4" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2017/03/oscilliscope.mp4" length="38453" type="video/mp4" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2017/03/jedi.mp4" length="48735" type="video/mp4" />

			</item>
		<item>
		<title><![CDATA[Use DRAKON to Generate Code from Flowcharts]]></title>
		<link>https://shkspr.mobi/blog/2013/04/use-drakon-to-generate-code-from-flowcharts/</link>
					<comments>https://shkspr.mobi/blog/2013/04/use-drakon-to-generate-code-from-flowcharts/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 05 Apr 2013 11:04:08 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[drakon]]></category>
		<category><![CDATA[flowcharts]]></category>
		<category><![CDATA[programming]]></category>
		<guid isPermaLink="false">http://shkspr.mobi/blog/?p=7943</guid>

					<description><![CDATA[It&#039;s 1986.  You&#039;re working on the Russian&#039;s Buran space programme - trying to create a re-usable space vehicle which will exceed the capabilities of the American&#039;s &#34;Space Shuttle&#34;.  There&#039;s a problem.  You have very complicated real-time algorithms which you need to review, improve, optimise, and then turn into code.  How do you do it?  Obviously, you invent DRAKON!  ДРАКОН, &#34;dragon&#34; Backronym for…]]></description>
										<content:encoded><![CDATA[<p>It's 1986.  You're working on the Russian's Buran space programme - trying to create a re-usable space vehicle which will exceed the capabilities of the American's "Space Shuttle".</p>

<p>There's a problem.  You have very complicated real-time algorithms which you need to review, improve, optimise, and then turn into code.  How do you do it?</p>

<p>Obviously, you invent <strong>DRAKON</strong>!</p>

<blockquote><p>ДРАКОН, "dragon"
</p><p>Backronym for "Дружелюбный Русский Алгоритмический язык, Который Обеспечивает Наглядность."
</p><p>Translation: "Friendly Russian algorithmic language that guarantees clarity."
</p><p><a href="http://en.wikipedia.org/wiki/DRAKON">Drakon on Wikipedia</a></p></blockquote>

<p>Drakon allows you to transform this:
<a href="https://shkspr.mobi/blog/wp-content/uploads/2013/04/Drakon-Demo-Flowchart-fs8.png"><img src="https://shkspr.mobi/blog/wp-content/uploads/2013/04/Drakon-Demo-Flowchart-fs8-1024x416.png" alt="Drakon Demo Flowchart-fs8" width="1024" height="416" class="alignnone size-large wp-image-7939"></a></p>

<p>Into This:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2013/04/Drakon-Generate-JavaScript-fs8.png" alt="Drakon Generate JavaScript-fs8" width="535" height="693" class="alignnone size-full wp-image-7938"></p>

<p>Frankly, it's a little bit like magic.</p>

<h2 id="why-use-drakon"><a href="https://shkspr.mobi/blog/2013/04/use-drakon-to-generate-code-from-flowcharts/#why-use-drakon">Why Use Drakon?</a></h2>

<p>I've only just started exploring the possibilities of Drakon - so I have a convert's zeal and a neophyte's experience - but here's the elevator pitch.</p>

<blockquote><p>Human eyes and brains are optimised for looking at shapes and patterns - not lines and lines of text.  Drakon allows you to spot errors in your algorithms before you commit them to code.

Once you have drawn out the code using the visual editor, it can automatically produce clean and efficient code in Java, C#, C/C++, Python, Tcl, Javascript, Lua and Erlang.</p></blockquote>

<p>It really is amazing when you start to use it.  If you have a complex process, a knotty algorithm, or any large scale information that you want to convey to an audience - Drakon is perfect.</p>

<p>Let's take, for example, <a href="http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm">Dijkstra's algorithm</a>.  When expressed in Python, it takes a savant to intuitively understand what the algorithm does - even if it is well commented.</p>

<p>It takes someone with a lot of experience to spot inefficiencies or problems.</p>

<p>Here's the algorithm expressed in Python.</p>

<pre lang="python">from priodict import priorityDictionary

def Dijkstra(G,start,end=None):

    D = {}  # dictionary of final distances
    P = {}  # dictionary of predecessors
    Q = priorityDictionary()   # est.dist. of non-final vert.
    Q[start] = 0

    for v in Q:
        D[v] = Q[v]
        if v == end: break

        for w in G[v]:
            vwLength = D[v] + G[v][w]
            if w in D:
                if vwLength &lt; D[w]:
                    raise ValueError,
  "Dijkstra: found better path to already-final vertex"
            elif w not in Q or vwLength &lt; Q[w]:
                Q[w] = vwLength
                P[w] = v

    return (D,P)

def shortestPath(G,start,end):
    D,P = Dijkstra(G,start,end)
    Path = []
    while 1:
        Path.append(end)
        if end == start: break
        end = P[end]
    Path.reverse()
    return Path
</pre>

<p>Now, let's take a look at how that would be constructed in Drakon.</p>

<iframe title="DRAKON Editor and Dijkstra's algorithm" width="620" height="349" src="https://www.youtube.com/embed/5IJ8Kf7mwDY?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>With almost zero knowledge you can quickly and easily see where your mistakes are.  Drakon flowcharts can be exported as images, blown up on projectors, or simply emailed around.</p>

<p>Once you're happy with the diagram, you click a button and it spits out JavaScript, Java, C#, C/C++, Python, Tcl, Lua or Erlang.</p>

<h2 id="what-have-i-used-it-for"><a href="https://shkspr.mobi/blog/2013/04/use-drakon-to-generate-code-from-flowcharts/#what-have-i-used-it-for">What Have I Used It For?</a></h2>

<p>My dad wants some help building an app. Like the dutiful son I am, I agreed and asked him to send over what he had so far.  This is what I got.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2013/04/Flow-Chart-Hand-Written.jpg" alt="Flow Chart Hand Written" width="400" height="266" class="alignnone size-full wp-image-7950">
Not exactly the easiest of things to work from, dad!</p>

<p>So, I began transcribing the algorithm by hand into JavaScript.  It quickly became a mess of if...else, nested conditions, and general spaghetti code - I think I even threw in a GOTO statement :-)
None of which was made easier by the fact that there were some obvious errors in the original flow chart.  "Yes" where "no" was meant, lines which criss-crossed each other, etc.</p>

<p>After an hour or so of using Drakon for the first time, I'd transformed the pen and ink drawing into this:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2013/04/Flow-Chart-from-Drakon.png" alt="Flow Chart from Drakon" width="600" height="372" class="alignnone size-full wp-image-7951"></p>

<p>Perhaps not the finest flowchart known to man, but a lot easier to understand.  I was able to make changes, see where the errors were, optimise the flow.  My father - who has no knowledge of JavaScript - was able to look at the chart and verify that it was correct.</p>

<p>Most importantly, I clicked a button and it generated the sort of intricately nested JavaScript which would have taken me all day to write by hand.</p>

<p>Finally, <a href="http://drakon-editor.sourceforge.net/instant_save.html">there's no save button</a>!  Every action is automatically saved without the need for any user interaction. Stepan Mitkin, the Russian developer behind the current open source Drakon project, says:</p>

<blockquote><p>The "Save" button is obsolete. Pressing "Save" is boring and stressful work. Boring work must be done by the machine.</p></blockquote>

<p>Writing algorithms is boring, stressful, repetative, error-prone work.  Let Drakon do it for you.</p>

<h2 id="getting-started"><a href="https://shkspr.mobi/blog/2013/04/use-drakon-to-generate-code-from-flowcharts/#getting-started">Getting Started</a></h2>

<p><a href="http://drakon-editor.sourceforge.net/">Download Drakon for Linux, Mac, Windows</a>.</p>

<p>On Linux, you'll need to install a few dependencies.
</p>

<pre>sudo apt-get install tk tcl libsqlite3-tcl tcllib libtk-img</pre>

<p>To run, open the command line, navigate to where you unzipped the files and run:</p>

<pre>tclsh drakon_editor.tcl</pre>

<p>or, simply:</p>

<pre>./drakon_editor.tcl</pre>

<p><a href="http://drakon-editor.sourceforge.net/file_format.html">Drakon files are SQLite 3.6 databases</a> - so you are not locked in to a proprietary file format.</p>

<h2 id="bonus"><a href="https://shkspr.mobi/blog/2013/04/use-drakon-to-generate-code-from-flowcharts/#bonus">BONUS!</a></h2>

<p>Several years ago, the <i lang="de">Technikmuseum Speyer</i> in Germany purchased Buran Analog BST-02 - one of the craft used for test flights in the Soviet Buran programme.  I was in Düsseldorf at the time and got to watch it being sailed down the Rhine.  Magical!</p>

<iframe title="OK-GLI Russian Space Shuttle Sailing Along the Rhine (2008)" width="620" height="465" src="https://www.youtube.com/embed/kUrcCLEVmqo?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=7943&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2013/04/use-drakon-to-generate-code-from-flowcharts/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
