{ "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.6.1" }, "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercise 1: Hierarchization in Higher Dimensions #\n", "\n", "In this exercise we will implement the multi-recursive algorithm for hierarchization of a multi-dimensional\n", "regular sparse grid. The structure of the code resembles strongly the one-dimensional case, and so we\n", "again have a class (PagodaFunction) representing our grid points.\n" ] }, { "cell_type": "code", "collapsed": true, "input": [ "#%load_ext sympyprinting\n", "%matplotlib inline\n", "from sympy import init_printing\n", "init_printing()\n", "import time\n", "# import the PagodaFunction class and additional helpers for plotting\n", "from PagodaFunction import PagodaFunction as gp\n", "from Plotting import plotHierarchical2d, evaluateSparseGrid, printSparseGrid, plotCombi2d" ], "language": "python", "metadata": { "scrolled": true }, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": true, "input": [ "def parabola(xvec):\n", " '''The parabola test function in multiple dimensions'''\n", " result = 1.0\n", " for x in xvec:\n", " result *= 4.0*x*(1.0-x)\n", " return result\n", " \n", "def applyRefinementCriterion(sg, dim, criterion, func):\n", " '''\n", " Applies the criterion to the leaves of the sparse grid.\n", " \n", " Calls the \"apply\" member for each leaf of the grid,\n", " then finishes calling the \"finalize\" member passing the\n", " grid and the approximated function as arguments.\n", " We'll also use it to build our sparse grid.\n", " '''\n", " # iterate over all grid points\n", " for (lKey,iKey) in sg:\n", " \n", " # Get the level vector and index vector of this grid point\n", " lvec, ivec = list(lKey), list(iKey)\n", " \n", " # Determine if this is a Leaf grid point by checking if it has exactly 2*d children.\n", " # Missing any child will make it a Leaf!\n", " isLeaf = False\n", " for d in range(dim):\n", " # original level,index values\n", " l_d = lvec[d]\n", " i_d = ivec[d]\n", " # Left child\n", " lvec[d] = l_d + 1\n", " ivec[d] = i_d*2 - 1\n", " leftChildKey = (tuple(lvec), tuple(ivec))\n", " # Right child\n", " ivec[d] = i_d*2 + 1\n", " rightChildKey = (tuple(lvec), tuple(ivec))\n", " # restore values for next dimension iteration\n", " lvec[d] = l_d \n", " ivec[d] = i_d\n", " \n", " if (leftChild not in sg or rightChild not in sg):\n", " isLeaf = True\n", " break # break d-loop only\n", " \n", " # Only if this is a Leaf, we can refine it\n", " if isLeaf:\n", " criterion.apply(sg[key])\n", " \n", " criterion.finalize(sg, func)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### (i) ###\n", "Implement the refinement criterion MinLevelCriterion that adds all points up to a specified\n", "level to a given grid.
\n", "Hint: In your grid traversal, try to avoid multiple visits to the same grid points.\n" ] }, { "cell_type": "code", "collapsed": true, "input": [ "class MinLevelCriterion(object):\n", " '''Criterion adding all missing points up to a certain level.'''\n", " def __init__(self, dim, minLevel):\n", " self.dim = dim\n", " self.minLevel = minLevel # the overall level we want our sparse grid to have\n", " def apply(self, af):\n", " pass # work is done in finalize\n", " def finalize(self, sg, func):\n", " '''Inserts the grid points recursively'''\n", " def insertRecursively(minD, l, lvec, ivec, xvec):\n", " \n", " # minD: (1, 2, ..., minD, minD+1, ..., d) \n", " # All dimensions that is < minD is not allowed to be modified.\n", " # minD and minD+ dimensions are allowed to be modified. \n", " # For the purpose of visiting each grid point exactly once.\n", " \n", " # l: (integer) level of the grid point to be added\n", " # lvec: (list) level vector of the grid point to be added, [l1, l2, ..., ld]\n", " # ivec: (list) index vector of the grid point (list), [i1, i2, ..., id]\n", " # xvec: (list) coordinate vector of the grid point, [x1, x2, ..., xd]\n", " \n", " '''\n", " Local recursive helper function for grid traversal.\n", "\n", " Use lvec and ivec (mutable lists) to identify the current point.\n", " Insert it if it does not exist, descend recursively if not\n", " on level minLevel. minD helps to ensure to not pay any point \n", " multiple visits.\n", " '''\n", " \n", " # Construct Key of the grid point to be added\n", " key = (tuple(lvec), tuple(ivec))\n", " \n", " # If this point does not exist, insert it to sg\n", " if not key in sg: \n", " sg[key] = gp(self.dim, lvec, ivec, func(xvec))\n", "\n", " # If this grid point has not reached the desired overall level (minLevel), \n", " # we will try to add its children on each dimension\n", " if (l < self.minLevel):\n", " \n", " # Touch each grid point once!!\n", " for d in range(minD, self.dim):\n", " # original values\n", " x_d = xvec[d]\n", " l_d = lvec[d]\n", " i_d = ivec[d]\n", " h_d = 1.0 / 2**(l_d+1) # this is mesh size for the child level\n", " # insert left child\n", " lvec[d] = l_d+1\n", " ivec[d] = i_d*2 - 1\n", " xvec[d] = x_d - h_d\n", " insertRecursively(d, l+1, lvec, ivec, xvec)\n", " # insert right child\n", " ivec[d] = i_d*2 + 1\n", " xvec[d] = x_d + h_d\n", " insertRecursively(d, l+1, lvec, ivec, xvec)\n", " # restore original values for next dim iteration\n", " lvec[d] = l_d\n", " ivec[d] = i_d\n", " xvec[d] = x_d \n", " \n", " '''Issue top level call of the recursive function'''\n", " l = 1 \n", " lvec = [1,]*self.dim\n", " ivec = [1,]*self.dim\n", " xvec = [0.5,]*self.dim\n", " insertRecursively(0, l, lvec, ivec, xvec)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### (ii) ###\n", "Implement the function hierarchize efficiently using a recursive approach.
\n", "Hint: The underlying traversal algorithm can be implemented similar to the one above.\n" ] }, { "cell_type": "code", "collapsed": true, "input": [ "def hierarchize(sg, dim):\n", " '''Recursive hierarchization function.'''\n", " def hierarchize1d(workDim, lvec, ivec, f_l, f_r):\n", " '''Recursive 1-D hierarchization to (lvec,ivec) in dimension workDim.'''\n", " key = (tuple(lvec), tuple(ivec))\n", " if not key in sg:\n", " return False\n", " p = sg[key]\n", " f_m = p.getSurplus() # surplus was first initialized with function value\n", " \n", " # original level, index values on workDim dimension\n", " l_w = lvec[workDim]\n", " i_w = ivec[workDim]\n", " # hierarhize left child\n", " lvec[workDim] = l_w+1 \n", " ivec[workDim] = 2*i_w - 1 \n", " hierarchize1d(workDim, lvec, ivec, f_l, f_m) \n", " # hierarhize right child\n", " ivec[workDim] = 2*i_w + 1 \n", " hierarchize1d(workDim, lvec, ivec, f_m, f_r)\n", " # restore values for next dim iteration\n", " lvec[workDim] = l_w\n", " ivec[workDim] = i_w\n", " p.setSurplus(f_m - 0.5*(f_l+f_r)) # Actual hierarchization step: hierarchize self\n", " return True\n", "\n", " def traverseRecursively(workDim, minD, lvec, ivec):\n", " # workDim: is the dimension on which we do hierarchization\n", " \n", " # minD: is the minimum dimension on which we access children. That is, we access children \n", " # on all dimensions ranging from minD to dim-1 \n", " \n", " # lvec, ivec: together defines the grid point on which we want to apply \n", " # the recursive hierarchization algorithm\n", " \n", " '''\n", " Local recursive helper function for traversal of the \"main axis\" w.r.t. workDim.\n", "\n", " Use the same approach as in MinLevelCriterion.finalize to traverse only the main\n", " axis of the grid, i.e. all points with coordinate x_workDim=0.5\n", " Hint: Don't descend into workDim, as hierarchize1d will do that.\n", " '''\n", " key = (tuple(lvec), tuple(ivec))\n", " # apply 1d hierarchization!\n", " if not hierarchize1d(workDim, lvec, ivec, 0.0, 0.0):\n", " return\n", "\n", " # touch every child once\n", " for d in range(minD, dim):\n", " if d != workDim:\n", " # original values\n", " l_d = lvec[d]\n", " i_d = ivec[d]\n", " # left child\n", " lvec[d] = l_d + 1\n", " ivec[d] = 2*i_d - 1\n", " traverseRecursively(workDim, d, lvec, ivec)\n", " # right child\n", " ivec[d] = 2*i_d + 1\n", " traverseRecursively(workDim, d, lvec, ivec)\n", " # restore values\n", " lvec[d] = l_d\n", " ivec[d] = i_d\n", " \n", " # apply the 1-D hierarchization scheme for all dimensions, one after another\n", " lvec, ivec = [1,]*dim, [1,] * dim\n", " for d in range(dim):\n", " traverseRecursively(d, 0, lvec, ivec)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "'''Main'''\n", "# Funcion to interpolate using the sparse grid\n", "func = parabola\n", "\n", "# A dictionary(map) that contains all sparse grid points\n", "# Dictionary: {Key1:Value1, Key2:Value2, ...}\n", "# Key = ((l1,l2,...,ld),(i1, i2,...,id))\n", "# Value = PagodaFunction object\n", "sg = {}\n", "\n", "# Dimensionality of the problem\n", "dim = 2\n", "\n", "# Minimum Overall level of the Sparse grid\n", "minLevel = 4\n", "\n", "# Create the sparse grid using MinLevelCriterion\n", "applyRefinementCriterion(sg, dim, MinLevelCriterion(dim, minLevel), func)\n", "\n", "# plot\n", "print(\"Created sparse grid of level \", minLevel, \", with \", len(sg), \" grid points.\")\n", "printSparseGrid(sg)\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Created sparse grid of level 4 , with 49 grid points.\n", "((2, 1), (3, 1)) : u_h( [0.75, 0.5] )= 0.75\n", "((3, 1), (7, 1)) : u_h( [0.875, 0.5] )= 0.4375\n", "((2, 3), (1, 7)) : u_h( [0.25, 0.875] )= 0.328125\n", "((3, 1), (3, 1)) : u_h( [0.375, 0.5] )= 0.9375\n", "((2, 3), (3, 1)) : u_h( [0.75, 0.125] )= 0.328125\n", "((4, 1), (15, 1)) : u_h( [0.9375, 0.5] )= 0.234375\n", "((3, 2), (1, 3)) : u_h( [0.125, 0.75] )= 0.328125\n", "((1, 4), (1, 13)) : u_h( [0.5, 0.8125] )= 0.609375\n", "((1, 4), (1, 7)) : u_h( [0.5, 0.4375] )= 0.984375\n", "((1, 4), (1, 11)) : u_h( [0.5, 0.6875] )= 0.859375\n", "((1, 4), (1, 5)) : u_h( [0.5, 0.3125] )= 0.859375\n", "((1, 3), (1, 3)) : u_h( [0.5, 0.375] )= 0.9375\n", "((4, 1), (5, 1)) : u_h( [0.3125, 0.5] )= 0.859375\n", "((4, 1), (7, 1)) : u_h( [0.4375, 0.5] )= 0.984375\n", "((3, 1), (1, 1)) : u_h( [0.125, 0.5] )= 0.4375\n", "((2, 2), (1, 3)) : u_h( [0.25, 0.75] )= 0.5625\n", "((3, 2), (5, 1)) : u_h( [0.625, 0.25] )= 0.703125\n", "((1, 4), (1, 3)) : u_h( [0.5, 0.1875] )= 0.609375\n", "((2, 3), (1, 5)) : u_h( [0.25, 0.625] )= 0.703125\n", "((1, 2), (1, 3)) : u_h( [0.5, 0.75] )= 0.75\n", "((2, 1), (1, 1)) : u_h( [0.25, 0.5] )= 0.75\n", "((1, 4), (1, 15)) : u_h( [0.5, 0.9375] )= 0.234375\n", "((4, 1), (9, 1)) : u_h( [0.5625, 0.5] )= 0.984375\n", "((2, 3), (3, 7)) : u_h( [0.75, 0.875] )= 0.328125\n", "((2, 3), (1, 3)) : u_h( [0.25, 0.375] )= 0.703125\n", "((4, 1), (1, 1)) : u_h( [0.0625, 0.5] )= 0.234375\n", "((2, 3), (3, 5)) : u_h( [0.75, 0.625] )= 0.703125\n", "((2, 2), (1, 1)) : u_h( [0.25, 0.25] )= 0.5625\n", "((3, 2), (3, 1)) : u_h( [0.375, 0.25] )= 0.703125\n", "((3, 2), (1, 1)) : u_h( [0.125, 0.25] )= 0.328125\n", "((3, 2), (7, 3)) : u_h( [0.875, 0.75] )= 0.328125\n", "((2, 3), (3, 3)) : u_h( [0.75, 0.375] )= 0.703125\n", "((1, 3), (1, 1)) : u_h( [0.5, 0.125] )= 0.4375\n", "((3, 1), (5, 1)) : u_h( [0.625, 0.5] )= 0.9375\n", "((3, 2), (3, 3)) : u_h( [0.375, 0.75] )= 0.703125\n", "((4, 1), (11, 1)) : u_h( [0.6875, 0.5] )= 0.859375\n", "((1, 1), (1, 1)) : u_h( [0.5, 0.5] )= 1.0\n", "((3, 2), (7, 1)) : u_h( [0.875, 0.25] )= 0.328125\n", "((2, 2), (3, 3)) : u_h( [0.75, 0.75] )= 0.5625\n", "((4, 1), (3, 1)) : u_h( [0.1875, 0.5] )= 0.609375\n", "((2, 2), (3, 1)) : u_h( [0.75, 0.25] )= 0.5625\n", "((2, 3), (1, 1)) : u_h( [0.25, 0.125] )= 0.328125\n", "((1, 4), (1, 9)) : u_h( [0.5, 0.5625] )= 0.984375\n", "((1, 3), (1, 7)) : u_h( [0.5, 0.875] )= 0.4375\n", "((3, 2), (5, 3)) : u_h( [0.625, 0.75] )= 0.703125\n", "((4, 1), (13, 1)) : u_h( [0.8125, 0.5] )= 0.609375\n", "((1, 3), (1, 5)) : u_h( [0.5, 0.625] )= 0.9375\n", "((1, 2), (1, 1)) : u_h( [0.5, 0.25] )= 0.75\n", "((1, 4), (1, 1)) : u_h( [0.5, 0.0625] )= 0.234375\n" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "tic = time.time()\n", "hierarchize(sg, dim)\n", "toc = time.time()\n", "print(\"Hierarchiz\",dim,\"dimensional sparse grid in\",toc-tic,\"seconds\")\n", "printSparseGrid(sg)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Hierarchiz 2 dimensional sparse grid in 0.0004134178161621094 seconds\n", "((2, 1), (3, 1)) : u_h( [0.75, 0.5] )= 0.25\n", "((3, 1), (7, 1)) : u_h( [0.875, 0.5] )= 0.0625\n", "((2, 3), (1, 7)) : u_h( [0.25, 0.875] )= 0.015625\n", "((3, 1), (3, 1)) : u_h( [0.375, 0.5] )= 0.0625\n", "((2, 3), (3, 1)) : u_h( [0.75, 0.125] )= 0.015625\n", "((4, 1), (15, 1)) : u_h( [0.9375, 0.5] )= 0.015625\n", "((3, 2), (1, 3)) : u_h( [0.125, 0.75] )= 0.015625\n", "((1, 4), (1, 13)) : u_h( [0.5, 0.8125] )= 0.015625\n", "((1, 4), (1, 7)) : u_h( [0.5, 0.4375] )= 0.015625\n", "((1, 4), (1, 11)) : u_h( [0.5, 0.6875] )= 0.015625\n", "((1, 4), (1, 5)) : u_h( [0.5, 0.3125] )= 0.015625\n", "((1, 3), (1, 3)) : u_h( [0.5, 0.375] )= 0.0625\n", "((4, 1), (5, 1)) : u_h( [0.3125, 0.5] )= 0.015625\n", "((4, 1), (7, 1)) : u_h( [0.4375, 0.5] )= 0.015625\n", "((3, 1), (1, 1)) : u_h( [0.125, 0.5] )= 0.0625\n", "((2, 2), (1, 3)) : u_h( [0.25, 0.75] )= 0.0625\n", "((3, 2), (5, 1)) : u_h( [0.625, 0.25] )= 0.015625\n", "((1, 4), (1, 3)) : u_h( [0.5, 0.1875] )= 0.015625\n", "((2, 3), (1, 5)) : u_h( [0.25, 0.625] )= 0.015625\n", "((1, 2), (1, 3)) : u_h( [0.5, 0.75] )= 0.25\n", "((2, 1), (1, 1)) : u_h( [0.25, 0.5] )= 0.25\n", "((1, 4), (1, 15)) : u_h( [0.5, 0.9375] )= 0.015625\n", "((4, 1), (9, 1)) : u_h( [0.5625, 0.5] )= 0.015625\n", "((2, 3), (3, 7)) : u_h( [0.75, 0.875] )= 0.015625\n", "((2, 3), (1, 3)) : u_h( [0.25, 0.375] )= 0.015625\n", "((4, 1), (1, 1)) : u_h( [0.0625, 0.5] )= 0.015625\n", "((2, 3), (3, 5)) : u_h( [0.75, 0.625] )= 0.015625\n", "((2, 2), (1, 1)) : u_h( [0.25, 0.25] )= 0.0625\n", "((3, 2), (3, 1)) : u_h( [0.375, 0.25] )= 0.015625\n", "((3, 2), (1, 1)) : u_h( [0.125, 0.25] )= 0.015625\n", "((3, 2), (7, 3)) : u_h( [0.875, 0.75] )= 0.015625\n", "((2, 3), (3, 3)) : u_h( [0.75, 0.375] )= 0.015625\n", "((1, 3), (1, 1)) : u_h( [0.5, 0.125] )= 0.0625\n", "((3, 1), (5, 1)) : u_h( [0.625, 0.5] )= 0.0625\n", "((3, 2), (3, 3)) : u_h( [0.375, 0.75] )= 0.015625\n", "((4, 1), (11, 1)) : u_h( [0.6875, 0.5] )= 0.015625\n", "((1, 1), (1, 1)) : u_h( [0.5, 0.5] )= 1.0\n", "((3, 2), (7, 1)) : u_h( [0.875, 0.25] )= 0.015625\n", "((2, 2), (3, 3)) : u_h( [0.75, 0.75] )= 0.0625\n", "((4, 1), (3, 1)) : u_h( [0.1875, 0.5] )= 0.015625\n", "((2, 2), (3, 1)) : u_h( [0.75, 0.25] )= 0.0625\n", "((2, 3), (1, 1)) : u_h( [0.25, 0.125] )= 0.015625\n", "((1, 4), (1, 9)) : u_h( [0.5, 0.5625] )= 0.015625\n", "((1, 3), (1, 7)) : u_h( [0.5, 0.875] )= 0.0625\n", "((3, 2), (5, 3)) : u_h( [0.625, 0.75] )= 0.015625\n", "((4, 1), (13, 1)) : u_h( [0.8125, 0.5] )= 0.015625\n", "((1, 3), (1, 5)) : u_h( [0.5, 0.625] )= 0.0625\n", "((1, 2), (1, 1)) : u_h( [0.5, 0.25] )= 0.25\n", "((1, 4), (1, 1)) : u_h( [0.5, 0.0625] )= 0.015625\n" ] } ], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "tic = time.time()\n", "for key in sg:\n", " x = sg[key].computeCoordinate()\n", " print(key, x, evaluateSparseGrid(sg, x), func(x))\n", "toc = time.time()\n", "print(\"Evaluation of sparse grid in\", toc-tic, \"seconds\")" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "((2, 1), (3, 1)) [0.75, 0.5] 0.75 0.75\n", "((3, 1), (7, 1)) [0.875, 0.5] 0.4375 0.4375\n", "((2, 3), (1, 7)) [0.25, 0.875] 0.328125 0.328125\n", "((3, 1), (3, 1)) [0.375, 0.5] 0.9375 0.9375\n", "((2, 3), (3, 1)) [0.75, 0.125] 0.328125 0.328125\n", "((4, 1), (15, 1)) [0.9375, 0.5] 0.234375 0.234375\n", "((3, 2), (1, 3)) [0.125, 0.75] 0.328125 0.328125\n", "((1, 4), (1, 13)) [0.5, 0.8125] 0.609375 0.609375\n", "((1, 4), (1, 7)) [0.5, 0.4375] 0.984375 0.984375\n", "((1, 4), (1, 11)) [0.5, 0.6875] 0.859375 0.859375\n", "((1, 4), (1, 5)) [0.5, 0.3125] 0.859375 0.859375\n", "((1, 3), (1, 3)) [0.5, 0.375] 0.9375 0.9375\n", "((4, 1), (5, 1)) [0.3125, 0.5] 0.859375 0.859375\n", "((4, 1), (7, 1)) [0.4375, 0.5] 0.984375 0.984375\n", "((3, 1), (1, 1)) [0.125, 0.5] 0.4375 0.4375\n", "((2, 2), (1, 3)) [0.25, 0.75] 0.5625 0.5625\n", "((3, 2), (5, 1)) [0.625, 0.25] 0.703125 0.703125\n", "((1, 4), (1, 3)) [0.5, 0.1875] 0.609375 0.609375\n", "((2, 3), (1, 5)) [0.25, 0.625] 0.703125 0.703125\n", "((1, 2), (1, 3)) [0.5, 0.75] 0.75 0.75\n", "((2, 1), (1, 1)) [0.25, 0.5] 0.75 0.75\n", "((1, 4), (1, 15)) [0.5, 0.9375] 0.234375 0.234375\n", "((4, 1), (9, 1)) [0.5625, 0.5] 0.984375 0.984375\n", "((2, 3), (3, 7)) [0.75, 0.875] 0.328125 0.328125\n", "((2, 3), (1, 3)) [0.25, 0.375] 0.703125 0.703125\n", "((4, 1), (1, 1)) [0.0625, 0.5] 0.234375 0.234375\n", "((2, 3), (3, 5)) [0.75, 0.625] 0.703125 0.703125\n", "((2, 2), (1, 1)) [0.25, 0.25] 0.5625 0.5625\n", "((3, 2), (3, 1)) [0.375, 0.25] 0.703125 0.703125\n", "((3, 2), (1, 1)) [0.125, 0.25] 0.328125 0.328125\n", "((3, 2), (7, 3)) [0.875, 0.75] 0.328125 0.328125\n", "((2, 3), (3, 3)) [0.75, 0.375] 0.703125 0.703125\n", "((1, 3), (1, 1)) [0.5, 0.125] 0.4375 0.4375\n", "((3, 1), (5, 1)) [0.625, 0.5] 0.9375 0.9375\n", "((3, 2), (3, 3)) [0.375, 0.75] 0.703125 0.703125\n", "((4, 1), (11, 1)) [0.6875, 0.5] 0.859375 0.859375\n", "((1, 1), (1, 1)) [0.5, 0.5] 1.0 1.0\n", "((3, 2), (7, 1)) [0.875, 0.25] 0.328125 0.328125\n", "((2, 2), (3, 3)) [0.75, 0.75] 0.5625 0.5625\n", "((4, 1), (3, 1)) [0.1875, 0.5] 0.609375 0.609375\n", "((2, 2), (3, 1)) [0.75, 0.25] 0.5625 0.5625\n", "((2, 3), (1, 1)) [0.25, 0.125] 0.328125 0.328125\n", "((1, 4), (1, 9)) [0.5, 0.5625] 0.984375 0.984375\n", "((1, 3), (1, 7)) [0.5, 0.875] 0.4375 0.4375\n", "((3, 2), (5, 3)) [0.625, 0.75] 0.703125 0.703125\n", "((4, 1), (13, 1)) [0.8125, 0.5] 0.609375 0.609375\n", "((1, 3), (1, 5)) [0.5, 0.625] 0.9375 0.9375\n", "((1, 2), (1, 1)) [0.5, 0.25] 0.75 0.75\n", "((1, 4), (1, 1)) [0.5, 0.0625] 0.234375 0.234375\n", "Evaluation of sparse grid in 0.005146980285644531 seconds\n" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "tic = time.time()\n", "plotHierarchical2d(sg, showGrid=True, minLevel=minLevel, azimuth=None, elevation=None)\n", "toc = time.time()\n", "print(\"Plotting the sparse grid took\", toc-tic, \"seconds\")" ], "language": "python", "metadata": { "scrolled": true }, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "Plotting the sparse grid took 0.157562255859375 seconds\n" ] } ], "prompt_number": 8 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Exercise 3: One-dimensional Sparse Grids---An Adaptiave Implementation #" ] }, { "cell_type": "code", "collapsed": true, "input": [ "# import classes\n", "from AnsatzFunction import AnsatzFunction as gp1d\n", "from Plotting import plotHierarchical1d, plotSG1d" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We want to use an adaptiave version of Archimedes' approach to approximate the integral $F(f,a,b) = \\int_a^b f(x) \\; dx$ of a function $f: \\mathbb{R} \\rightarrow \\mathbb{R}$ or to approximate the function $f$ itself.
\n", "For the one-dimensional case we want to formalize this approach and generalize it in the following ways:\n", "\n", "* Let $\\phi(x)$ be the mother of all hat functions with" ] }, { "cell_type": "code", "collapsed": false, "input": [ "gp1d(0,0).getPhi()" ], "language": "python", "metadata": {}, "outputs": [ { "latex": [ "$$\\begin{cases} 0 & \\text{for}\\: x < -1.0 \\\\x + 1 & \\text{for}\\: x < 0.0 \\\\- x + 1 & \\text{for}\\: x < 1.0 \\\\0 & \\text{otherwise} \\end{cases}$$" ], "metadata": {}, "output_type": "pyout", "png": "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\n", "prompt_number": 10, "text": [ "\u23a7 0 for x < -1.0\n", "\u23aa \n", "\u23aax + 1 for x < 0.0 \n", "\u23a8 \n", "\u23aa-x + 1 for x < 1.0 \n", "\u23aa \n", "\u23a9 0 otherwise " ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "* The data structure used to store the hierarchical coefficients is now called Sparse Grid.\n", "* A sparse grid is defined by a particular set of interpolation points $x_{l,i}$ and associated ansatz functions $\\phi_{l,i}(x)$ with\n", "$$\\phi_{l,i}(x) = \\phi ( \\; 2^l \\cdot \\left(x - i \\cdot \\frac{1}{2^l} \\right)\\; ) = \\phi (2^l \\cdot x - i ), \\ l \\in \\mathbb{N}^{+}, 1 \\leq i \\leq 2^l - 1, i \\mbox{ odd}$$\n", "* Archimedes' approach from the lecture corresponds to a regular sparse grid.\n", "* To improve the quality of approximation for arbitrary functions $f$ we introduce spatial adaptivity.\n", "\n", "Import and use the class AnsatzFunction and look at the comments in the provided code snippets for some more details.
\n", "Use it to construct a one-dimensional sparse grid structure, which stores its grid points (resp. ansatz functions of type AnsatzFunction in a hash map.\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# the function we want to approximate\n", "def parabola(x):\n", " return 4*x*(1-x)\n", "\n", "def asymmetric(x):\n", " return 8*(-16*x**4 + 40*x**3 -35*x**2 + 11*x)/9\n", "\n", "func = parabola\n", "\n", "def printSparseGrid(sg):\n", " for af in sg.values():\n", " x = af.computeCoordinate()\n", " print(af.getKey(), \": f(%f)=%f\\tu(%f)=%f\" % (x, af.getFunctionValue(), x, af.getSurplus()))\n", "\n", "def evaluateSparseGrid(sg, x):\n", " '''Evaluates a given sparse grid at given point x'''\n", " return sum(map(lambda ansatz: ansatz(x), sg.values()))\n", "\n", "\n", "def applyRefinementCriterion(sg, criterion, func):\n", " '''\n", " Applies the criterion to the leaves of the sparse grid.\n", " \n", " Calls the \"apply\" member for each leaf of the grid,\n", " then finishes calling the \"finalize\" member passing the\n", " grid and the approximated function as arguments.\n", " We'll also use it to build our sparse grid.\n", " '''\n", " # iterate over leaves only\n", " for key in sg:\n", " l = key[0]\n", " i = key[1]\n", " \n", " leftChild = (l+1, 2*i-1)\n", " rightChild = (l+1, 2*i+1)\n", " \n", " if not (leftChild in sg and rightChild in sg):\n", " criterion.apply(sg[key])\n", " criterion.finalize(sg, func)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We start by creating an empty sparse grid." ] }, { "cell_type": "code", "collapsed": true, "input": [ "sg = {}" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We implement a refinement criterion that rather works as a grid generator and fills the sparse grid with points up to a given level.
\n", "The apply member does not really need to do anything. finalize then inserts all missing points up to level minLevel." ] }, { "cell_type": "code", "collapsed": true, "input": [ "class MinLevelCriterion(object):\n", " '''Criterion adding all missing points up to a certain level.'''\n", " def __init__(self, minLevel):\n", " self.minLevel = minLevel\n", " def apply(self, af):\n", " pass\n", " def finalize(self, sg, func):\n", " for l in range(1, self.minLevel+1):\n", " for i in range(1, 2**l, 2):\n", " if not (l,i) in sg:\n", " x = float(i)/2**l\n", " f_x = func(x)\n", " sg[(l,i)] = gp1d(l, i, f_x, f_x)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "# fill the sparse grid\n", "applyRefinementCriterion(sg, MinLevelCriterion(3), func)\n", "printSparseGrid(sg)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(1, 1) : f(0.500000)=1.000000\tu(0.500000)=1.000000\n", "(2, 1) : f(0.250000)=0.750000\tu(0.250000)=0.750000\n", "(2, 3) : f(0.750000)=0.750000\tu(0.750000)=0.750000\n", "(3, 1) : f(0.125000)=0.437500\tu(0.125000)=0.437500\n", "(3, 3) : f(0.375000)=0.937500\tu(0.375000)=0.937500\n", "(3, 5) : f(0.625000)=0.937500\tu(0.625000)=0.937500\n", "(3, 7) : f(0.875000)=0.437500\tu(0.875000)=0.437500\n" ] } ], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We implement the hierarchization method.\n", "Try to only use the surpluses stored with the ansatz functions, not the function values.
\n", "Hint: In Python functions can be defined in every scope. You could make use of this feature and define and call to a recursive sub-function inside hierarchize." ] }, { "cell_type": "code", "collapsed": true, "input": [ "def hierarchize(sg):\n", " '''Recursive hierarchization function.'''\n", " def rec(l, i, f_l, f_r):\n", " if (l,i) in sg:\n", " af = sg[(l,i)]\n", " f_m = af.getSurplus()\n", " rec(l+1, 2*i-1, f_l, f_m)\n", " rec(l+1, 2*i+1, f_m, f_r)\n", " af.setSurplus(f_m - 0.5*(f_l+f_r))\n", " rec(1, 1, 0.0, 0.0)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "# apply hierarchization\n", "hierarchize(sg)\n", "printSparseGrid(sg)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(1, 1) : f(0.500000)=1.000000\tu(0.500000)=1.000000\n", "(2, 1) : f(0.250000)=0.750000\tu(0.250000)=0.250000\n", "(2, 3) : f(0.750000)=0.750000\tu(0.750000)=0.250000\n", "(3, 1) : f(0.125000)=0.437500\tu(0.125000)=0.062500\n", "(3, 3) : f(0.375000)=0.937500\tu(0.375000)=0.062500\n", "(3, 5) : f(0.625000)=0.937500\tu(0.625000)=0.062500\n", "(3, 7) : f(0.875000)=0.437500\tu(0.875000)=0.062500\n" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define a more complex refinement criterion looking for and refining surpluses which are larger than a given $\\varepsilon$.