Skip to content

Instantly share code, notes, and snippets.

@quantumjim
Last active January 29, 2022 16:28
Show Gist options
  • Save quantumjim/9fbd7918fc551f45304c22ec1feced3b to your computer and use it in GitHub Desktop.
Save quantumjim/9fbd7918fc551f45304c22ec1feced3b to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this first experiment we will look at one of the simplest and most useful types of content to generate: height maps.\n",
"\n",
"We will store these as Python dictionaries whose elements `Z[x,y]` will store the height at position `(x,y)`. Rather than just printing these dictionaries to screen, it would be nicer to see them as an image. So let's define a couple of functions to do just that."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"from PIL import Image\n",
"from IPython.display import display\n",
"\n",
"def height2image (Z, terrain=None ):\n",
" # converts a heightmap z into a PIL image\n",
" # for terrain=None, this is a black and white image with white for Z[x,y]=1 and black for Z[x,y]=0\n",
" # otherwise, the values in terrain are used as thresholds between sea and beach, beach and grass, etc\n",
" image = {}\n",
" for pos in Z:\n",
" if terrain:\n",
" if Z[pos]<terrain[0]:\n",
" image[pos] = (50,120,200)\n",
" elif Z[pos]<terrain[1]:\n",
" image[pos] = (220,220,10)\n",
" elif Z[pos]<terrain[2]:\n",
" image[pos] = (100,200,0)\n",
" elif Z[pos]<terrain[3]:\n",
" image[pos] = (75,150,0)\n",
" elif Z[pos]<terrain[4]:\n",
" image[pos] = (200,200,200) \n",
" else:\n",
" image[pos] = (255,255,255)\n",
" else:\n",
" z = int(255*Z[pos])\n",
" image[pos] = (z,z,z)\n",
" \n",
" X = max(Z.keys())[0]+1\n",
" Y = max(Z.keys())[1]+1\n",
" img = Image.new('RGB',(X,Y)) \n",
" for x in range(img.size[0]):\n",
" for y in range(img.size[1]):\n",
" img.load()[x,y] = image[x,y]\n",
" return img\n",
"\n",
"def plot_height (Z,terrain=[5/16,6/16,9/16,12/16,14/16],zoom=None):\n",
" # display a heightmap as the above image\n",
" # displayed image is a terrain map by default\n",
" img = height2image(Z,terrain=terrain)\n",
" if zoom:\n",
" img = img.resize((zoom*img.size[0],zoom*img.size[0]), Image.ANTIALIAS)\n",
" img.save('temp.png')\n",
" display(Image.open('temp.png'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can look at an example of how height maps are usually created. A popular approach is gradient noise, such as the simplex noise generated by the function below."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"from opensimplex import OpenSimplex\n",
"import random\n",
"\n",
"def simplex(L,period):\n",
" # create a heightmap for an L[0]xL[1] image using simplex noise\n",
" gen = OpenSimplex(seed=random.randint(0,10**20))\n",
" Z = {}\n",
" for x in range(L[0]):\n",
" for y in range(L[1]):\n",
" xx = period[0]*(x/L[0]-0.5)\n",
" yy = period[1]*(y/L[1]-0.5)\n",
" Z[x,y] = gen.noise2d(xx,yy)/2 + 0.5 \n",
" return Z"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The input `L` determines the size of the resulting image: using `L=[500,500]` will make an height map of $500\\times 500$ positions. This image will have an undulating landscape, with hills in white and valleys in black. The periodicity of this is controled by the input `period`. Let's print an example where this is `[10,10]`."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=500x500 at 0x1092EFFD0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"Zlow = simplex([500,500],[10,10])\n",
"plot_height( Zlow )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To get something more like a real mountain range, gradient noise of different frequencies can be combined with different weights. as a simple example, let's make a mix with 80% of the same frequency we saw before, and 20% of a higher frequency."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=500x500 at 0x10CC75128>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"Zhigh = simplex([500,500],[100,100])\n",
"Z = { pos: 0.8*Zlow[pos] + 0.2*Zhigh[pos] for pos in Zhigh }\n",
"plot_height( Z )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It is our aim to come up with something similar using quantum computing.\n",
"\n",
"First, we need to choose how many qubits to use. If we want to perform a simulation within the timescale of a loading screen, or to use a current prototype device, we shouldn't use too many. Let's start with 10."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"n = 10"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We want to use a small number of qubits, but we also want to generate images with thousands of points. To allow this, we can use the randomness that can appear in outputs of quantum computations. Specifically, for $n$ qubits the output is always a string of $n$ bits. This means $2^n$ different possible outputs. If the output has some randomness, this will be described by $2^n$ corresponding probabilities.\n",
"\n",
"This exponential number can allow us to squeeze as much as we can out of our qubits. By associating each bit string with a point, and the height of the map at that point can be used to define the probability of the string.\n",
"\n",
"The problem with this is getting all the heights out of our quantum program. This will require many repetitions to do statistics on the output and calculate the probablities. We refer to this as the number of `shots`."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"shots = 4**n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The exponential number of shots required means that this method is not scalable to large $n$: it has exactly the kind of exponentially increasing run time that quantum computers usually aim to free us from. The method we use here will serve as proof-of-principle for the current era of quantum computing. Future eras will need different methods.\n",
"\n",
"For now, we need to choose a way of assigning each of the possible bit strings to a point. The most natural way to do this would be to respect the [Hamming distance](https://en.wikipedia.org/wiki/Hamming_distance) of the bit strings. This is because the basic operations of quantum computing, single qubit gates and `cx` gates, only have the effect of flipping a single bit in a bit string. Strings that differ by only a single bit can therefore be regarded as 'closer' to each other than those that differ by more.\n",
"\n",
"With this in mind, the set of all $n$-bit strings represents a hypercube: a shape that exists in $n$-dimensional space. This is a bit exotic for our needs, since we want the generate a 2D terrain map like the one depicted above. We therefore need a way to squash a hypercube onto a 2D surface.\n",
"\n",
"This is done in the following cell. The dictionary `strings` is created, which has 2D coordinates `(x,y)` as keys and the corresponding bit string as values. The squashing procedure essentially uses the fact that a cube is two squares, with each point in one connected to its partner in the other. A tesseract is then two cubes connected similarly, and so on for higher dimensional hypercubes. But if we don't include all the possible connections, we can keep our not-quite-a-cube flat, and then do the same with the corresponding not-quite-a-tesseract, and so on.\n",
"\n",
"The result is a square lattice. The four neighbours of each point are four of the $n$ hypercube neighbours of the corresponding string. So the strings are only close to strings that they should be close to, though at the cost of being far away from some of their hypercube neighbours."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"def get_L(n):\n",
" # determine the size of the grid corresponding to n qubits\n",
" Lx = int(2**np.ceil(n/2))\n",
" Ly = int(2**np.floor(n/2))\n",
" return [Lx,Ly]\n",
"\n",
"def make_grid(n):\n",
" # make a dictionary for which every point in the grid is assigned a unique n bit string\n",
" # these are such that '0'*n is in the center, and each string neighbours only its neighbours on the hypercube\n",
" \n",
" [Lx,Ly] = get_L(n)\n",
"\n",
" strings = {}\n",
" for y in range(Ly):\n",
" for x in range(Lx):\n",
" strings[(x,y)] = ''\n",
"\n",
" for (x,y) in strings:\n",
" for j in range(n):\n",
" if (j%2)==0:\n",
" xx = np.floor(x/2**(j/2))\n",
" strings[(x,y)] = str( int( ( xx + np.floor(xx/2) )%2 ) ) + strings[(x,y)]\n",
" else:\n",
" yy = np.floor(y/2**((j-1)/2))\n",
" strings[(x,y)] = str( int( ( yy + np.floor(yy/2) )%2 ) ) + strings[(x,y)]\n",
"\n",
" center = '0'*n\n",
" current_center = strings[ ( int(np.floor(Lx/2)),int(np.floor(Ly/2)) ) ]\n",
" diff = ''\n",
" for j in range(n):\n",
" diff += '0'*(current_center[j]==center[j]) + '1'*(current_center[j]!=center[j])\n",
" for (x,y) in strings:\n",
" newstring = ''\n",
" for j in range(n):\n",
" newstring += strings[(x,y)][j]*(diff[j]=='0') + ('0'*(strings[(x,y)][j]=='1')+'1'*(strings[(x,y)][j]=='0'))*(diff[j]=='1')\n",
" strings[(x,y)] = newstring\n",
" \n",
" grid = {}\n",
" for y in range(Ly):\n",
" for x in range(Lx):\n",
" grid[strings[(x,y)]] = (x,y)\n",
" \n",
" return strings"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we know which bit strings correspond to which points, we need methods to convert the output of a quantum computer to a heightmap. We'll be using Qiskit to do our quantum computation, which gives an output as a `counts` dictionary. This simply tells us how many of the `shots` repetitions of a quantum program output each bit string. These are therefore essentially unnormalized estimates of the probabilities for each bit string.\n",
"\n",
"To convert a `counts` dictionary into a heightmap, we will simply set the height of a point to be the counts value of the corresponding bit string (an option to use the logarithm instead will also be included). We then normalize the heighmap to make the maximum height equal to 1, and the minimum equal to 0."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"def normalize_height(Z):\n",
" # scales heights so that the maximum is 1 and the minimum is 0\n",
" maxZ = max(Z.values())\n",
" minZ = min(Z.values())\n",
" for pos in Z:\n",
" Z[pos] = (Z[pos]-minZ)/(maxZ-minZ)\n",
" return Z\n",
"\n",
"def counts2height(counts,grid,log=False):\n",
" # set the height of a point to be the counts value of the corresponding bit string (or the logarithm) and normalize\n",
" Z = {}\n",
" for pos in grid:\n",
" try:\n",
" Z[pos] = counts[grid[pos]]\n",
" except:\n",
" Z[pos] = 0\n",
" if log:\n",
" for pos in Z:\n",
" Z[pos] = max(Z[pos],1/len(grid)**2)\n",
" Z[pos] = np.log( Z[pos] )/np.log(2)\n",
" Z = normalize_height(Z) \n",
" return Z"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We also need a method that will turn a height map into the input for a quantum computer. These inputs are quantum states, which are expressed as a list of $2^n$ values. We won't get into the technicalities of quantum states here. All you need to know is that the values in this list are known as amplitudes, and that the `j`th amplitude corresponds to the bit string that represents the integer `j`. Specifically, if we were to run the quantum computer immediately after loading the input, the amplitude for each string would be the square root of the probability of that string appearing in the output.\n",
"\n",
"To acheive this for our height map conversion, we set each probability to be the square root of the corresponding height value. Then we normalize to make sure that all the probabilities add up to 1."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"def height2state(Z,grid):\n",
" # converts a heightmap intp a quantum state\n",
" N = len(grid)\n",
" state = [0]*N\n",
"\n",
" for pos in Z:\n",
" state[ int(grid[pos],2) ] = np.sqrt( Z[pos] ) # amplitude is square root of height value\n",
" R = sum(np.absolute(state)**2)\n",
" state = [amp / np.sqrt(R) for amp in state] # amplitudes are normalized\n",
" return state"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If we use a simulator of a quantum computer instead of a real one, we can also get it to output a state instead of a `counts` dictionary. In this case we need a way of determining the counts values that we would have gotten. This is done with the function below."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"def state2counts (state,shots=None):\n",
" N = len(state)\n",
" n = int(np.log2(N))\n",
" if shots is None:\n",
" shots = N**2\n",
" counts = {}\n",
" for j in range(N):\n",
" string = bin(j)[2:]\n",
" string = '0'*(n-len(string)) + string\n",
" counts[string] = np.absolute(state[j])**2 * shots # square amplitudes to get probabilities\n",
" return counts"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To test out these new functions, let's use simplex noise to make a heightmap, generate a grid to associate each positon to a bit string, and then create the corresponding quantum state."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"L = get_L(n)\n",
"Z = simplex(L,[10,10])\n",
"\n",
"grid = make_grid(n)\n",
"state = height2state(Z,grid)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's turn that state into a `counts` dictionary, and make that into a height map."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=160x160 at 0x1164CF5F8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"counts = state2counts(state)\n",
"Z = counts2height(counts,grid)\n",
"plot_height(Z, terrain=None, zoom=5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That didn't do much of any use (we could have printed the original height map without all the conversions), but at least it seemed to work.\n",
"\n",
"Now let's do something more useful. We'll make a simple height map with arbitrary chosen points scattered here and there. We could generate these randomly, but it might be more fun to choose them manually. We'll do this with Jupyter widgets, as set up by the function below."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"import ipywidgets as widgets\n",
"from ipywidgets import Checkbox, ToggleButton, Layout, HBox, VBox\n",
"\n",
"def get_boxes(L,value=True):\n",
"\n",
" width = str(500/L[0])+'px'\n",
" height = str(500/L[1])+'px'\n",
"\n",
" box = {}\n",
" for y in range(L[1]):\n",
" for x in range(L[0]):\n",
" box[x,y] = widgets.ToggleButton(value=value,button_style='',layout=Layout(width=width, height=height))\n",
" \n",
" return box"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Using this, we'll make a grid of buttons: one for each pixel. Each is dark by default. Click on a few to make them light up. Once you are happy, continue to the next cell."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f6c0077f5bc44b0bb0773d4be1d699fa",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(HBox(children=(ToggleButton(value=True, layout=Layout(height='15.625px', width='15.625px')), To…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"box = get_boxes(L)\n",
"\n",
"VBox([ HBox([ box[x,y] for x in range(L[0]) ]) for y in range(L[1]) ])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we extract the result and turn it into and image."
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=160x160 at 0x116B36208>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def flat_height(L):\n",
" # create height map that is 0 everywhere\n",
" Z ={}\n",
" for x in range(L[0]):\n",
" for y in range(L[1]):\n",
" Z[x,y] = 0\n",
" return Z\n",
"\n",
"Z = flat_height(L)\n",
"for y in range(L[1]):\n",
" for x in range(L[0]):\n",
" if box[x,y].value==False:\n",
" Z[x,y] = 1\n",
" \n",
"plot_height( Z, terrain=None, zoom=5 )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This will be used as the seed for what I'm calling 'quantum tartan'. For this we convert the seed into a state to be be used as an input. Then a simple quantum program is run to blur out the seed using quantum interference. The output is then turned into a height map.\n",
"\n",
"The following function does this, using a simulator by default. To use a real device, get some [IBMQ credentials](https://github.com/Qiskit/qiskit-terra/blob/master/README.md) and set the `shots` argument in the function to the number of shots you'd like to use (must be greater than 1). Ideally this should be something like the value mentioned earlier, but note that 8192 is the maximum that cane be currently used on real devices.\n",
"\n",
"The `seed` argument of the function is the heighmap generated above. The `theta` argument controls the amount of quantum blur that is applied. A pre-made grid can be supplied to the function, or you can just let it generate one itself."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"from qiskit import *\n",
"import time\n",
"\n",
"def quantum_tartan (seed,theta,grid=None,shots=1,log=True):\n",
" \n",
" n = int(np.log2( len(seed) ))\n",
" \n",
" if grid is None:\n",
" grid = make_grid(n)\n",
"\n",
" state = height2state(seed,grid)\n",
"\n",
" q = QuantumRegister(n)\n",
" qc = QuantumCircuit(q)\n",
" qc.initialize(state,q)\n",
" qc.ry(2*np.pi*theta,q)\n",
" \n",
" if shots>1:\n",
" try:\n",
" IBMQ.load_accounts()\n",
" backend = IBMQ.get_backend('ibmq_16_melbourne')\n",
" except:\n",
" print('An IBMQ account is required to use a real device\\nSee https://github.com/Qiskit/qiskit-terra/blob/master/README.md')\n",
" else:\n",
" backend = Aer.get_backend('statevector_simulator')\n",
"\n",
" if shots>1:\n",
" c = ClassicalRegister(n)\n",
" qc.add_register(c)\n",
" qc.measure(q,c)\n",
" \n",
" start = time.time()\n",
" print('Quantum job initiated on',backend.name())\n",
" job = execute(qc, backend, shots=shots)\n",
" end = time.time()\n",
" print('Quantum job complete after',int(end-start),'seconds')\n",
" \n",
"\n",
" if shots>1:\n",
" counts = job.result().get_counts()\n",
" else:\n",
" counts = state2counts( job.result().get_statevector() )\n",
" \n",
" Z = counts2height(counts,grid,log=log) \n",
" \n",
" return Z, grid"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's try it out!"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Quantum job initiated on statevector_simulator\n",
"Quantum job complete after 0 seconds\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=160x160 at 0x116B4E9E8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"Z, grid = quantum_tartan(Z,0.01)\n",
"plot_height( Z, terrain=None, zoom=5 )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Running quantum simulations isn't the fastest thing in the world. And since there are far more people interested in quantum computing than there are quantum computers, getting a result back from current prototype devices can also involve a wait. We therefore need to get as much use out of our quantum results as possible.\n",
"\n",
"To do this, we can use the fact that there are many ways to squash a hypercube. The grid used to generate the image above is not unique, and we can easily get more by simply shuffling all the bit values. This is done by the following functions, in order to generate a new, shuffled version of the height map."
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=160x160 at 0x11CEF57F0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def shuffle_grid(grid):\n",
" \n",
" n = int( np.log(len(grid))/np.log(2) )\n",
" \n",
" order = [j for j in range(n)]\n",
" random.shuffle(order)\n",
" \n",
" new_grid = {}\n",
" for pos in grid:\n",
" new_string = ''\n",
" for j in order:\n",
" new_string = grid[pos][j] + new_string\n",
" new_grid[pos] = new_string\n",
" \n",
" return new_grid\n",
"\n",
"def shuffle_height (Z,grid):\n",
" \n",
" new_grid = shuffle_grid(grid)\n",
" new_Z = {}\n",
" for pos in Z:\n",
" string = grid[pos] \n",
" new_pos = list(new_grid.keys())[ list(new_grid.values()).index( string ) ]\n",
" new_Z[new_pos] = Z[pos]\n",
" \n",
" return new_Z,new_grid\n",
"\n",
"\n",
"Z,grid = shuffle_height(Z,grid)\n",
"plot_height( Z, terrain=None, zoom=5 )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Despite the shuffling, the quantum tartan will always have a definite grid like pattern. This is not ideal if we are trying to generate something natural looking, like terrain. We'll therefore make use of the following function, which\n",
"rotates a height map by a given angle (expressed in radians as a multiple of $\\pi$). The heightmap is also made bigger to make sure the image isn't clipped."
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=255x255 at 0x1164E7668>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def rotate_height (Z,theta):\n",
" # rotate height Z by angle theta\n",
" L = list(max(Z))\n",
" mid = [(L[j]+1)/2 for j in range(2)]\n",
" \n",
" Lr = [ int( 1.6*(L[j]+1) ) for j in range(2) ]\n",
" midr = [Lr[j]/2 for j in range(2)]\n",
" \n",
" Zr = flat_height(Lr)\n",
" \n",
" for pos in Zr:\n",
" \n",
" d = [ pos[j]-midr[j] for j in range(2) ]\n",
" \n",
" x = int( d[0]*np.cos(theta*np.pi) + d[1]*np.sin(theta*np.pi) + mid[0] )\n",
" y = int( -d[0]*np.sin(theta*np.pi) + d[1]*np.cos(theta*np.pi) + mid[1] )\n",
" \n",
" if (x,y) in Z:\n",
" Zr[pos] = Z[x,y]\n",
" else:\n",
" Zr[pos] = 0\n",
" \n",
" return Zr\n",
"\n",
"\n",
"plot_height( rotate_height(Z,0.25), terrain=None, zoom=5 )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the 10 qubits we've used here, the images we are generating are $32\\times32$ pixels in size. That's not really enough to make something like a map in which we can play a game. A world in the Raspberry Pi version of Minecraft, for example, is $256\\times256$ blocks in size.\n",
"\n",
"To make such a world, we can weave together many patches of quantum tartan. For example, let's make 100."
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Generation of 300 samples took 11 seconds\n"
]
}
],
"source": [
"start = time.time()\n",
"\n",
"samples = 300\n",
"tartans = []\n",
"for j in range(samples):\n",
" randZ,_ = shuffle_height(Z,grid)\n",
" randZ = rotate_height(randZ,random.random())\n",
" tartans.append( randZ )\n",
" \n",
"end = time.time()\n",
"print('Generation of',samples,'samples took',int(end-start),'seconds')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next we will create a heightmap `Zs`, which will contain the basic features of the final terrain. Again, this will be input manually.\n",
"\n",
"After running the cell below, put some white points in the resulting map where you want high ground to be. The more points you put in an area, the higher the ground."
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9885f98b944846229fef778a3b5acb7f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(HBox(children=(ToggleButton(value=True, layout=Layout(height='50.0px', width='50.0px')), Toggle…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"reduced_size = [10,10]\n",
"peak_box = get_boxes(reduced_size)\n",
"VBox([ HBox([ peak_box[x,y] for x in range(reduced_size[0]) ]) for y in range(reduced_size[1]) ])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now choose where you want low ground to be (under or close to sea-level)."
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "184f3de4b4084eae9d28abbd6a95eb62",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(HBox(children=(ToggleButton(value=False, layout=Layout(height='50.0px', width='50.0px')), Toggl…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"valley_box = get_boxes(reduced_size,value=False)\n",
"VBox([ HBox([ valley_box[x,y] for x in range(reduced_size[0]) ]) for y in range(reduced_size[1]) ])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Your inputs give us the following, very basic map."
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=100x100 at 0x1219A7710>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"Zs = {}\n",
"for y in range(reduced_size[1]):\n",
" for x in range(reduced_size[0]):\n",
" if peak_box[x,y].value==False:\n",
" Zs[x,y] = 1\n",
" elif valley_box[x,y].value==True:\n",
" Zs[x,y] = 0\n",
" else:\n",
" Zs[x,y] = 0.5\n",
" \n",
"plot_height( Zs , terrain=None, zoom=10 )"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "invalid syntax (<ipython-input-37-fd9df68df107>, line 1)",
"output_type": "error",
"traceback": [
"\u001b[0;36m File \u001b[0;32m\"<ipython-input-37-fd9df68df107>\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m Now we apply a blur on this to smooth it out.\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
]
}
],
"source": [
"Now we apply a blur on this to smooth it out."
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=100x100 at 0x1219A7240>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def blur(Zs,reduced_size,steps=2):\n",
" for j in range(steps):\n",
" for offset in [0,1]:\n",
" for y in range(1,reduced_size[1]-1):\n",
" for x in range(1+(offset+y)%2,reduced_size[0]-1+(offset+y)%2,2):\n",
" Zs[x,y] = ( Zs[x,y] + (Zs[x+1,y] + Zs[x-1,y] + Zs[x,y+1] + Zs[x,y-1])/4 )/2\n",
" return Zs\n",
"\n",
"Zs = blur(Zs,reduced_size,steps=1)\n",
"plot_height( Zs , terrain=None, zoom=10 )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can define the function that generates our map. This will randomly sample points from the map, with a probability proportional to the corresponding height in `Zs`. Patches of quantum tartan are then placed in these positions, to create the terrain."
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"def islands(size,Zs,tartans):\n",
" # height map of created by combining the quantum tartans of `tartans` with the basic map features.\n",
" Z = flat_height(size)\n",
" \n",
" tsize = max(tartans[0])\n",
" \n",
" for tartan in tartans: \n",
" unchosen = True\n",
" while unchosen:\n",
" x0 = random.choice(range(size[0]))\n",
" y0 = random.choice(range(size[1]))\n",
" if random.random()<Zs[int(x0*(max(Zs.keys())[0]+1)/size[0]),int(y0*(max(Zs.keys())[1]+1)/size[1])]:\n",
" unchosen = False\n",
"\n",
" for (x,y) in tartan:\n",
" xx = x-int(tsize[0]/2)+x0\n",
" yy = y-int(tsize[1]/2)+y0\n",
" if (xx,yy) in Z:\n",
" Z[xx,yy] += tartan[x,y]\n",
" \n",
" Z = normalize_height(Z)\n",
"\n",
" return Z"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The result is a heightmap made out of quantum tartan, which we can use as terrain in Minecraft."
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=200x200 at 0x1219A7C88>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"size = [200,200]\n",
"Z_islands = islands(size,Zs,tartans)\n",
"plot_height( Z_islands, terrain=[2/16,3/16,5/16,10/16,12/16] )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The entire computational time required for this was under a minute. That's a reasonable timescale for a loading screen (though admittedly a bit long). "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It would be nice to do more than just look at 2D maps, and to actually be able to explore the terrain. This can certainly be done, but it isn't simple to do so in Python.\n",
"\n",
"If we wanted to use a voxel based game engine, such as [Minetest](http://www.minetest.net), we would need to know which kind of block to put at each 3D location in a world. The following functions do exactly this. The first creates a dictionary with 3D coordinates as keys and strings describing a material type as values. The second function then saves this as a csv file. This information can then be read in by programs based in any language to turn it into explorable 3D terrain.\n",
"\n",
"Note that, in the following, our coordinates are written in the form `(x,h,y)`. Here `x` and `y` are used in the same way as elsewhere in this notebook, and `h` is a height calculated from the value of `Z[x,y]`. The order used here is to be consistent in the way many 3D renderers work, for which the middle coordinate represents height."
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [],
"source": [
"def make_blocks(Z,terrain=[2/16,3/16,5/16,10/16,12/16],height=24,depth=12):\n",
" # make a dictionary that determines which material exists at each 3D position\n",
" # also returns mins and maxs of all three coordinates in `mins` and `maxs`\n",
" def addBlocks( blocks, x1,h1,y1, x2,h2,y2, block ):\n",
" # add a blocks of a given type for a given range of coordinates\n",
" for x in range(x1,x2+1):\n",
" for y in range(y1,y2+1):\n",
" for h in range(h1,h2+1):\n",
" blocks[x,h,y] = block\n",
" \n",
" def addTreeBlocks( blocks, x,h,y, rnd ):\n",
" #Makes a tree, rooted at the specified position'''\n",
" for j in range(1,6):\n",
" blocks[x,h+j,y] = 'tree'\n",
" for xx in range(x-3,x+4):\n",
" for yy in range(y-3,y+4):\n",
" for hh in range(h+5,h+11):\n",
" d = (xx-x)**2+(yy-y)**2+(hh-h-6)**2 + 0.1\n",
" if d<8:\n",
" blocks[xx,hh,yy] = 'leaves'\n",
" xx = choose([x-1,x+1],rnd)\n",
" yy = choose([y-1,y+1],rnd)\n",
" blocks[xx,h+5,yy] = 'tree'\n",
" blocks[xx,h+4,yy] = 'torch'\n",
" \n",
" def choose( options, rnd ):\n",
" return options [ int(round(rnd*( len(options)-1 ))) ]\n",
" \n",
" \n",
" sea_level = int( depth+terrain[0]*height+1 )\n",
" \n",
" choosing = True\n",
" while choosing:\n",
" spawn = random.choice( list(Z.keys()) )\n",
" if Z[spawn]>terrain[0]:\n",
" choosing = False\n",
" spawn = [spawn[0],depth+height,spawn[1]]\n",
" \n",
" blocks = {}\n",
" (Xmin,Hmin,Ymin) = (0,0,0)\n",
" (Xmax,Hmax,Ymax) = (0,0,0)\n",
" for (X,Y) in Z:\n",
" \n",
" Hfloat = depth + Z[X,Y]*height\n",
" H = int( Hfloat ) # height for a block\n",
" rnd = Hfloat-H # value from 0 to 1 that we can use for randomness\n",
" \n",
" Xmin = min(Xmin,X); Ymin = min(Ymin,Y); Hmin = min(Hmin,H)\n",
" Xmax = max(Xmax,X); Ymax = max(Ymax,Y); Hmax = max(Hmax,H)\n",
" \n",
" # First we make a cavern, which is most spacious under hills\n",
" \n",
" Hm = int( (1-Z[X,Y])*depth/2 ) # height for stalagtites\n",
" Ht = int( depth - (1-Z[X,Y])*depth/2 ) #height at which stalagmites begin\n",
" \n",
" if Z[X,Y]<terrain[0]:\n",
" minerals = ['diamondblock','goldblock'] # most precious minerals in hard to reach places\n",
" else:\n",
" minerals = ['stone','stone','stone_with_coal','stone_with_iron','stone_with_copper','stone_with_tin','stone_with_gold','stone_with_diamond']\n",
" stone_m = choose(minerals,rnd)\n",
" stone_t = choose(minerals,1-rnd)\n",
" \n",
" if (1-Z[X,Y])<terrain[0]: # the very bottom of the cavern has lava\n",
" blocks[X,0,Y] = stone_m\n",
" blocks[X,1,Y] = 'lava_source'\n",
" else: # otherwise a mineral\n",
" addBlocks( blocks, X,0,Y, X,Hm,Y, stone_m )\n",
" \n",
" if Z[X,Y]<terrain[4]: # the roof is always a mineral\n",
" addBlocks( blocks, X,Ht,Y, X,depth,Y, stone_t )\n",
" \n",
" if rnd<0.005 and Z[X,Y]>terrain[0] and Z[X,Y]<terrain[4]:\n",
" blocks[X,Ht-1,Y] = 'torch'\n",
" \n",
" if Z[X,Y]<terrain[0]: # sand at H and then water up to sea level\n",
" addBlocks( blocks, X,depth,Y, X,H,Y, 'sand' )\n",
" addBlocks( blocks, X,H+1,Y, X,sea_level,Y, 'water_source' )\n",
" elif Z[X,Y]<terrain[1]: # sand\n",
" addBlocks( blocks, X,depth+1,Y, X,H-1,Y, 'stone' )\n",
" blocks[X,H,Y] = 'sand'\n",
" blocks[X,H+1,Y] = 'sand'\n",
" elif Z[X,Y]<terrain[2]: # grass with trees\n",
" addBlocks( blocks, X,depth+1,Y, X,H-1,Y, 'stone' )\n",
" blocks[X,H,Y] = 'dirt_with_grass'\n",
" blocks[X,H+1,Y] = 'dirt_with_grass'\n",
" if rnd<0.025:\n",
" addTreeBlocks( blocks, X,H,Y, rnd )\n",
" else:\n",
" blocks[X,H+2,Y] = choose(['fern_1','marram_grass_1','marram_grass_2','marram_grass_3'],rnd)\n",
" elif Z[X,Y]<terrain[3]: # grass with ferns\n",
" addBlocks( blocks, X,depth+1,Y, X,H-1,Y, 'stone' )\n",
" blocks[X,H,Y] = 'dirt_with_grass'\n",
" blocks[X,H+1,Y] = 'dirt_with_grass'\n",
" blocks[X,H+2,Y] = choose(['fern_1','fern_2','fern_3','marram_grass_1'],rnd)\n",
" elif Z[X,Y]<terrain[4]: # mixture of grass and stone\n",
" addBlocks( blocks, X,depth+1,Y, X,H-1,Y, 'stone' )\n",
" if rnd<1/3:\n",
" blocks[X,H,Y] = 'dirt_with_grass'\n",
" blocks[X,H+1,Y] = 'dirt_with_grass'\n",
" else:\n",
" blocks[X,H,Y] = 'stone'\n",
" blocks[X,H+1,Y] = 'stone'\n",
" elif H==(depth + terrain[4]*height): # just stone, with a random bit of additional height\n",
" H += int(height*rnd/10)\n",
" addBlocks( blocks, X,depth+1,Y, X,H+1,Y, 'stone' )\n",
" elif Z[X,Y]==1:\n",
" blocks[X,H,Y] = 'torch'\n",
" \n",
" mins = (Xmin,Hmin,Ymin)\n",
" maxs = (Xmax,Hmax,Ymax)\n",
" \n",
" return blocks, spawn, mins, maxs\n",
" \n",
"def save_blocks(blocks,spawn,mins,maxs,filename='blocks.csv'):\n",
" # saves a dictionary of the form created by the above function as a csv file\n",
" with open(filename, 'w') as file:\n",
" file.write( str(mins[0])+','+str(mins[1])+','+str(mins[2])+',min,\\n' )\n",
" file.write( str(maxs[0])+','+str(maxs[1])+','+str(maxs[2])+',max,\\n' )\n",
" file.write( str(spawn[0])+','+str(spawn[1])+','+str(spawn[2])+',player,\\n' )\n",
" for (x,h,y) in blocks:\n",
" file.write( str(x)+','+str(h)+','+str(y)+','+blocks[x,h,y]+',\\n' )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So, finally, let's save our terrain."
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
"blocks, spawn, mins, maxs = make_blocks( Z_islands )\n",
"save_blocks( blocks, spawn, mins, maxs )"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
@ayazskhan
Copy link

ayazskhan commented Dec 16, 2019

Detailed instructions on what to do next with the blocks.csv file

This creates a file called 'blocks.csv' which needs to be copied to the 'csv2terrain' mods folder.

Before copying, the following steps are needed:

  1. Install Minetest
    a) go to http://www.minetest.net/
    b) click on download
    c) download Minetest 5.1.0 - portable, 64-bit (recommended)
    d) extract to an appropriate directory
    e) the executable can be found at \minetest-5.1.0-win64\bin\minetest.exe
    f) click on the executable to start the game

  2. Create Quantworld in Minetest
    a) Click on the "Minetest game" logo at the bottom (this step might not be required)
    b) Click on "new"
    c) Enter the name as Quantworld
    d) Enter a few random letters for seed
    e) Set Mapgen to "flat"
    f) Select "Minetest Game"
    g) Click on "Create"
    h) Alt tab out and leave the game running in the background

  3. Install 'csv2terrain'
    a) go to https://github.com/quantumjim/csv2terrain
    b) click on the Download button and save the zip file
    c) extract the contents of the zip file into the Minetest \mod folder
    d) verify that a blocks.csv file is in the \minetest-5.1.0-win64\mods\csv2terrain\ folder

  4. copy the blocks.csv file created by this Jupyter notebook over the blocks.csv file in the \mods\csv2terrain folder

  5. Turn on the csv2terrain mod for quantworld
    a) Alt Tab back to the Minetest game
    b) click on the new flat world you created "quantworld"
    c) click on "configure"
    d) ensure that you see the csv2terrain mod (if not something is wrong with step 3. above)
    e) click on the "csv2terrain" mod
    f) check the "enabled" checkbox
    g) click on "save"

  6. Play Quantworld
    a) click on Quantworld
    b) check "Creative Mode"
    c) Uncheck "Enable Damage" and "Host Server"
    d) click on "Play Game"
    e) when inside the game type /
    f) this will open a chat command line
    g) now type ltbv in the command line
    h) after a few seconds wait, the quantum generated world will display

  7. Navigating and viewing the world
    a) You should be suspended in the air in fly mode
    b) use the w key to move forward, and use cursor to point in the direction of movement
    c) to end press ESC key and click on "Exit to Menu"

Try different circuits to find out which ones result in nice islands!
After creating a new blocks.csv file from this Jupyter Notebook, skip to Step 4 this time.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment