(* Content-type: application/mathematica *) (*** Wolfram Notebook File ***) (* http://www.wolfram.com/nb *) (* CreatedBy='Mathematica 6.0' *) (*CacheID: 234*) (* Internal cache information: NotebookFileLineBreakTest NotebookFileLineBreakTest NotebookDataPosition[ 145, 7] NotebookDataLength[ 21240, 649] NotebookOptionsPosition[ 18213, 546] NotebookOutlinePosition[ 18689, 564] CellTagsIndexPosition[ 18646, 561] WindowFrame->Normal ContainsDynamic->False*) (* Beginning of Notebook Content *) Notebook[{ Cell[CellGroupData[{ Cell["Cumulative Energy and PSNR", "Title", CellChangeTimes->{{3.421431042796875*^9, 3.421431044359375*^9}, { 3.452343184387808*^9, 3.452343208193124*^9}}], Cell["\<\ Wavelet Workshop June 2-5, 2009 University of South Florida\ \>", "Subtitle", CellChangeTimes->{{3.421426484890625*^9, 3.42142648821875*^9}, { 3.4523426437597103`*^9, 3.452342654156664*^9}}], Cell["\<\ Catherine Beneteau Caroline Haddad David Ruch Patrick Van Fleet\ \>", "Subsubtitle", CellChangeTimes->{{3.42144927371875*^9, 3.42144928703125*^9}}], Cell[CellGroupData[{ Cell["Overview", "Section", CellChangeTimes->{{3.421428159890625*^9, 3.421428161*^9}}], Cell[CellGroupData[{ Cell["Objectives", "Subsection"], Cell["\<\ The purpose of this notebook is to give you a brief introduction to the \ software package DiscreteWavelets and show you how to use it to load images. \ You will learn how to use measures and tools such as cumulative energy and \ PSNR.\ \>", "Text", CellChangeTimes->{{3.421456620265625*^9, 3.421456650625*^9}, { 3.452342744202888*^9, 3.452342773973584*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["DiscreteWavelets", "Subsection"], Cell[TextData[{ "You should run this cell each time you open this notebook!! It loads the \ ", StyleBox["Mathematica", FontSlant->"Italic"], " package DiscreteWavelets for use in subsequent computations." }], "Text", CellChangeTimes->{{3.421429438203125*^9, 3.421429441265625*^9}}], Cell[BoxData[ RowBox[{"<<", "DiscreteWavelets`DiscreteWavelets`"}]], "Input", CellChangeTimes->{{3.421448451359375*^9, 3.42144845165625*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["Help on DiscreteWavelets", "Subsection"], Cell["\<\ If you ever need help with DiscreteWavelets, go to Help, then Documentation \ Center. On the bottom right, you will find a link for Installed Add-Ons. \ Click this link and then the link to DiscreteWavelets to access \ documentation, examples, and applications of the software package.\ \>", "Text", CellChangeTimes->{{3.42142653203125*^9, 3.421426604453125*^9}}] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["Cumulative Energy", "Section", CellChangeTimes->{{3.421428300375*^9, 3.421428305953125*^9}}], Cell["\<\ One of the important skills students develop in this course is the ability to \ write modules or functions. The cumulative energy function is an excellent \ starting point for this development. \ \>", "Text", CellChangeTimes->{{3.42142831625*^9, 3.421428581828125*^9}, 3.421429171921875*^9, 3.4214295424375*^9}], Cell[CellGroupData[{ Cell["Calculating Cumulative Energy", "Subsection", CellChangeTimes->{{3.42142954565625*^9, 3.421429551046875*^9}}], Cell["\<\ To compute the cumulative energy of vector v, we sort the absolute values of \ the elements largest to smallest and then square the components of the \ resulting vector. Call this vector y. We find the kth element of the \ cumulative energy vector by summing the first k elements of y and dividing \ the result by the norm of v squared. The first two steps of this process are easy. Let's use a small vector as an \ example.\ \>", "Text", CellChangeTimes->{{3.42142831625*^9, 3.421428581828125*^9}, 3.421429171921875*^9, {3.4214295424375*^9, 3.421429558125*^9}}], Cell[BoxData[{ RowBox[{"v", "=", RowBox[{"{", RowBox[{ RowBox[{"-", "3"}], ",", " ", RowBox[{"-", "2"}], ",", " ", "0", ",", " ", "0", ",", " ", "5", ",", " ", RowBox[{"-", "8"}], ",", " ", "3", ",", " ", "1", ",", "1", ",", "2"}], "}"}]}], "\[IndentingNewLine]", RowBox[{"y", "=", RowBox[{"Reverse", "[", RowBox[{"Sort", "[", RowBox[{"Abs", "[", "v", "]"}], "]"}], "]"}]}], "\[IndentingNewLine]", RowBox[{"y", "=", RowBox[{"y", "^", "2"}]}]}], "Input", CellChangeTimes->{{3.4214285835625*^9, 3.421428670390625*^9}, { 3.421429164625*^9, 3.421429165921875*^9}, {3.421429288515625*^9, 3.42142930028125*^9}, {3.42143083834375*^9, 3.421430838484375*^9}}], Cell[TextData[{ "Next comes the cumulative sums. We could write a loop for k = 1 through 10 \ and an inner loop j = 1 to k to perform the task, but we instead encourage \ our students to take advantage of built-in functions that accomplish tasks. \ In most cases, these built-in functions are much faster than attempting to \ extract individual elements from a vector or list. For cumulative sums, the \ built-in command ", StyleBox["FoldList", FontWeight->"Bold"], " is well-suited for our needs. It needs an operation (Plus), a starting \ point (0), and a list of numbers (y)" }], "Text", CellChangeTimes->{{3.42142868615625*^9, 3.42142876425*^9}, { 3.42142880765625*^9, 3.421428811890625*^9}, {3.421429042671875*^9, 3.42142908128125*^9}, {3.421429132640625*^9, 3.421429145359375*^9}, { 3.421429180234375*^9, 3.421429182015625*^9}}], Cell[BoxData[ RowBox[{"x", "=", RowBox[{"FoldList", "[", RowBox[{"Plus", ",", "0", ",", "y"}], "]"}]}]], "Input", CellChangeTimes->{{3.421429085375*^9, 3.42142912584375*^9}, { 3.421429244390625*^9, 3.4214292453125*^9}, 3.421429366953125*^9, { 3.421430836578125*^9, 3.42143083671875*^9}}], Cell[TextData[{ "Notice that there is a small problem. Our cumulative sum list is close but \ contains an unwanted 0 at the beginning. We can get rid of the 0 by using \ the ", StyleBox["Mathematica", FontSlant->"Italic"], " command ", StyleBox["Drop", FontWeight->"Bold"], "." }], "Text", CellChangeTimes->{{3.421429189984375*^9, 3.421429233921875*^9}}], Cell[BoxData[ RowBox[{"z", "=", RowBox[{"Drop", "[", RowBox[{"x", ",", "1"}], "]"}]}]], "Input", CellChangeTimes->{{3.421429249265625*^9, 3.421429250953125*^9}, { 3.421429342296875*^9, 3.421429371671875*^9}, {3.421430834765625*^9, 3.42143083490625*^9}}], Cell["\<\ Dividing the above list by norm v squared completes the task.\ \>", "Text", CellChangeTimes->{{3.4214292785*^9, 3.421429313546875*^9}}], Cell[BoxData[ RowBox[{"ce", " ", "=", " ", RowBox[{"z", "/", RowBox[{"(", RowBox[{"v", ".", "v"}], ")"}]}]}]], "Input", CellChangeTimes->{{3.421429346359375*^9, 3.421429351046875*^9}, { 3.42143083325*^9, 3.42143083340625*^9}}], Cell[TextData[{ "We can plot the cumulative energy using the ", StyleBox["Mathematica", FontSlant->"Italic"], " command ", StyleBox["ListPlot", FontWeight->"Bold"], ". Note the x-axis is the element number of ce." }], "Text", CellChangeTimes->{{3.421429377984375*^9, 3.4214294225625*^9}, { 3.421429462546875*^9, 3.421429476765625*^9}}], Cell[BoxData[{ RowBox[{"ListPlot", "[", "ce", "]"}], "\[IndentingNewLine]", RowBox[{"ListPlot", "[", RowBox[{"ce", ",", RowBox[{"PlotStyle", "\[Rule]", RowBox[{"{", RowBox[{"Red", ",", RowBox[{"PointSize", "[", ".02", "]"}]}], "}"}]}]}], "]"}]}], "Input", CellChangeTimes->{{3.421429455171875*^9, 3.42142952690625*^9}, { 3.421430830921875*^9, 3.421430831171875*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["The Cumulative Energy Module", "Subsection", CellChangeTimes->{{3.421429590328125*^9, 3.421429596125*^9}}], Cell[TextData[{ "In ", StyleBox["Mathematica", FontSlant->"Italic"], ", it is very easy to write modules or functions. If you have experience \ writing modules or functions, there are three important things to note: (1) \ use a Return statement to indicate what, if anything, is being returned by \ the module, (2) a local variables list is highly recommended, and (3) you \ cannot pass a module command a variable (say x) and then overwrite x within \ the module - you must make a copy of it.\n\nIn the cell below, we will write \ a module for computing the cumulative energy of a vector (or matrix!) \ together." }], "Text", CellChangeTimes->{{3.42142960221875*^9, 3.4214297696875*^9}}], Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"MyCE", "[", "v_", "]"}], ":=", RowBox[{"Module", "[", RowBox[{ RowBox[{"{", " ", RowBox[{"(*", " ", RowBox[{"put", " ", "local", " ", "variables", " ", "here"}], " ", "*)"}], "}"}], ","}], "\[IndentingNewLine]", "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.421429772625*^9, 3.421429776078125*^9}, { 3.4214298411875*^9, 3.42142986128125*^9}, {3.421430015671875*^9, 3.421430076859375*^9}, {3.421430110140625*^9, 3.421430110296875*^9}, { 3.421430148234375*^9, 3.42143014890625*^9}, 3.421495138954275*^9}] }, Open ]], Cell[CellGroupData[{ Cell["Testing the Module", "Subsection", CellChangeTimes->{{3.421429875328125*^9, 3.42142988528125*^9}}], Cell["\<\ The cell below creates a vector of 20 random integers and then calls the MyCE \ module and the DiscreteWavelets command CE to compute the cumulative energy. \ Don't execute the cell until you have completed and executed the cell above.\ \>", "Text", CellChangeTimes->{{3.42142988934375*^9, 3.421429950484375*^9}, { 3.42142999834375*^9, 3.421429998546875*^9}, {3.42143011984375*^9, 3.42143014153125*^9}, 3.421495141642084*^9}], Cell[BoxData[{ RowBox[{"v", "=", RowBox[{"Table", "[", RowBox[{ RowBox[{"RandomInteger", "[", RowBox[{"{", RowBox[{"0", ",", "10"}], "}"}], "]"}], ",", RowBox[{"{", "20", "}"}]}], "]"}]}], "\[IndentingNewLine]", RowBox[{"MyCE", "[", "v", "]"}], "\[IndentingNewLine]", RowBox[{"CE", "[", "v", "]"}]}], "Input", CellChangeTimes->{{3.421429954828125*^9, 3.42143000825*^9}, {3.4214308275*^9, 3.421430828234375*^9}, 3.42149513604769*^9}] }, Open ]], Cell[CellGroupData[{ Cell["Exercises", "Subsection", CellChangeTimes->{{3.421430182453125*^9, 3.421430199328125*^9}}], Cell[CellGroupData[{ Cell["Exercise 1", "Subsubsection", CellChangeTimes->{{3.42143022953125*^9, 3.421430232265625*^9}}], Cell[TextData[{ "The MyCE module above will not work on matrices. The module is expecting a \ list of numbers and a matrix is a list of lists in ", StyleBox["Mathematica", FontSlant->"Italic"], ". How can you modify the MyCE module so that it will work on matrices? \ (Hint: Check the command ", StyleBox["Flatten", FontWeight->"Bold"], " in the Documentation Center.)" }], "Text", CellChangeTimes->{{3.421430254421875*^9, 3.42143027165625*^9}, { 3.421430342265625*^9, 3.42143041053125*^9}, {3.421495145736306*^9, 3.421495149252336*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["Exercise 1M", "Subsubsection", CellChangeTimes->{{3.42143022953125*^9, 3.421430232265625*^9}, { 3.421430432171875*^9, 3.4214304336875*^9}}], Cell[TextData[{ "The MyCE module, as it's written, performs all computations symbolically. \ This is fine for short-length vectors but for longer vectors, the computation \ time increases. How can you modify the MyCE module so that it will work on \ matrices? (Hint: Check the command ", StyleBox["N", FontWeight->"Bold"], " in the Documentation Center.)" }], "Text", CellChangeTimes->{{3.421430254421875*^9, 3.42143027165625*^9}, { 3.421430342265625*^9, 3.42143041053125*^9}, {3.4214304481875*^9, 3.421430559296875*^9}, {3.4214951514713416`*^9, 3.4214951551280127`*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["Exercise 2", "Subsubsection", CellChangeTimes->{{3.42143022953125*^9, 3.42143024271875*^9}}], Cell["\<\ Load the grayscale image of the chess pieces from the DiscreteWavelets \ package, find its cumulative energy using the MyCE module, and then plot the \ cumulative energy of the image. How many elements of the image constitute \ 90% of the energy? How many zeros are in the image?\ \>", "Text", CellChangeTimes->{{3.4214305744375*^9, 3.42143064846875*^9}, { 3.421430710671875*^9, 3.42143072971875*^9}, 3.4214951599254403`*^9}] }, Open ]], Cell[CellGroupData[{ Cell["Exercise 3", "Subsubsection", CellChangeTimes->{{3.42143022953125*^9, 3.421430245046875*^9}}], Cell[TextData[{ "Describe the plot of the cumulative energy of a (nonzero) constant vector. \ (Hint: If you wish, you can generate a constant vector using the ", StyleBox["ConstantArray", FontWeight->"Bold"], " command - see the Documentation Center for more information.)" }], "Text", CellChangeTimes->{{3.421430741*^9, 3.421430814515625*^9}}] }, Open ]] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["PSNR", "Section", CellChangeTimes->{{3.42144835946875*^9, 3.42144836034375*^9}}], Cell[TextData[{ "The DiscreteWavelets command for peak signal-to-noise ratio is ", StyleBox["PSNR", FontWeight->"Bold"], ". The input values are two matrices of equal size." }], "Text", CellChangeTimes->{{3.421449322328125*^9, 3.421449329359375*^9}, { 3.421451066796875*^9, 3.42145110771875*^9}}], Cell[BoxData[{ RowBox[{ RowBox[{"img", "=", RowBox[{"ImageNames", "[", RowBox[{ RowBox[{"ImageType", "\[Rule]", "GrayScale"}], ",", RowBox[{"ListThumbnails", "\[Rule]", "True"}]}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"A", "=", RowBox[{"ImageRead", "[", RowBox[{"img", "[", RowBox[{"[", "4", "]"}], "]"}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{ RowBox[{"{", RowBox[{"rows", ",", "cols"}], "}"}], "=", RowBox[{"Dimensions", "[", "A", "]"}]}], ";"}], "\[IndentingNewLine]"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"A1", "=", RowBox[{"A", "+", RowBox[{"Table", "[", RowBox[{ RowBox[{"RandomInteger", "[", RowBox[{"{", RowBox[{ RowBox[{"-", "5"}], ",", "5"}], "}"}], "]"}], ",", RowBox[{"{", "rows", "}"}], ",", RowBox[{"{", "cols", "}"}]}], "]"}]}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"A2", "=", RowBox[{"A", "+", RowBox[{"Table", "[", RowBox[{ RowBox[{"RandomInteger", "[", RowBox[{"{", RowBox[{ RowBox[{"-", "20"}], ",", "20"}], "}"}], "]"}], ",", RowBox[{"{", "rows", "}"}], ",", RowBox[{"{", "cols", "}"}]}], "]"}]}]}], ";"}]}], "Input", CellChangeTimes->{{3.42145113659375*^9, 3.421451269546875*^9}, { 3.421451331890625*^9, 3.42145135959375*^9}, {3.4214514215*^9, 3.421451444875*^9}}], Cell[BoxData[{ RowBox[{ RowBox[{"p1", "=", RowBox[{"ImagePlot", "[", "A", "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"p2", "=", RowBox[{"ImagePlot", "[", "A1", "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"p3", "=", RowBox[{"ImagePlot", "[", "A2", "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{"GraphicsGrid", "[", RowBox[{"{", RowBox[{"{", RowBox[{"p1", ",", "p2", ",", "p3"}], "}"}], "}"}], "]"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"psnr1", "=", RowBox[{"PSNR", "[", RowBox[{"A", ",", "A1"}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"psnr2", "=", RowBox[{"PSNR", "[", RowBox[{"A", ",", "A2"}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"Print", "[", RowBox[{ "\"\\"", ",", "psnr1", ",", "\"\< and the PSNR for A and A2 is \>\"", ",", "psnr2", ",", "\"\<.\>\""}], "]"}], ";"}]}], "Input", CellChangeTimes->{{3.421451232359375*^9, 3.421451241078125*^9}, { 3.421451276609375*^9, 3.421451314515625*^9}, {3.421451374875*^9, 3.421451411390625*^9}, {3.4214514415*^9, 3.421451441875*^9}, { 3.42145148309375*^9, 3.4214514873125*^9}}], Cell[CellGroupData[{ Cell["Exercises", "Subsection", CellChangeTimes->{{3.421451447140625*^9, 3.421451448234375*^9}}], Cell[CellGroupData[{ Cell["Exercise 1", "Subsubsection", CellChangeTimes->{{3.421451453359375*^9, 3.421451455484375*^9}}], Cell[TextData[{ "Write a module to compute the PSNR of two matrices. Useful ", StyleBox["Mathematica", FontSlant->"Italic"], " commands are ", StyleBox["Flatten", FontWeight->"Bold"], ", ", StyleBox["Total", FontWeight->"Bold"], ", and ", StyleBox["Log", FontWeight->"Bold"], "." }], "Text", CellChangeTimes->{{3.42145146175*^9, 3.42145146871875*^9}, { 3.42145152715625*^9, 3.421451540359375*^9}}], Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{ RowBox[{"MyPSNR", "[", RowBox[{"a_", ",", "b_"}], "]"}], ":=", RowBox[{"Module", "[", RowBox[{"{", RowBox[{"(*", " ", RowBox[{"put", " ", "local", " ", "variables", " ", "here"}], " ", "*)"}], ",", "\[IndentingNewLine]", RowBox[{"(*", " ", RowBox[{"put", " ", "commands", " ", "here"}], " ", "*)"}], "\[IndentingNewLine]"}]}]}], "]"}], ";"}]], "Input", CellChangeTimes->{{3.421451551625*^9, 3.421451574875*^9}, 3.42149671401784*^9}], Cell["Here is some code to test your module :", "Text", CellChangeTimes->{{3.421451580375*^9, 3.421451588875*^9}}], Cell[BoxData[{ RowBox[{"mypsnr1", "=", RowBox[{"MyPSNR", "[", RowBox[{"A", ",", "A1"}], "]"}]}], "\[IndentingNewLine]", RowBox[{"mypsnr2", "=", RowBox[{"MyPSNR", "[", RowBox[{"A", ",", "A1"}], "]"}]}]}], "Input", CellChangeTimes->{{3.42145160178125*^9, 3.42145161665625*^9}, { 3.4214967155022054`*^9, 3.421496716642823*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["Exercise 2", "Subsubsection", CellChangeTimes->{{3.42145267846875*^9, 3.421452681390625*^9}}], Cell["\<\ How do you suppose we compute the PSNR between two color images? Load the \ Legos image from the DiscreteWavelets package and add matrices of random \ integers ranging from -10 to 10 to each channel. Then compute the PSNR \ between the original image and the \"noisy\" one.\ \>", "Text", CellChangeTimes->{{3.421452687984375*^9, 3.42145276534375*^9}}], Cell[BoxData[ RowBox[{"(*", " ", RowBox[{"put", " ", "your", " ", "code", " ", "here"}], " ", "*)"}]], "Input", CellChangeTimes->{{3.42145277075*^9, 3.42145277446875*^9}}] }, Open ]] }, Open ]] }, Closed]] }, Open ]] }, AutoGeneratedPackage->None, ScreenStyleEnvironment->"Presentation", WindowSize->{1272, 683}, WindowMargins->{{56, Automatic}, {Automatic, 44}}, FrontEndVersion->"6.0 for Mac OS X x86 (32-bit) (June 19, 2007)", StyleDefinitions->FrontEnd`FileName[{"Creative"}, "NaturalColor.nb", CharacterEncoding -> "UTF-8"] ] (* End of Notebook Content *) (* Internal cache information *) (*CellTagsOutline CellTagsIndex->{} *) (*CellTagsIndex CellTagsIndex->{} *) (*NotebookFileOutline Notebook[{ Cell[CellGroupData[{ Cell[590, 23, 158, 2, 107, "Title"], Cell[751, 27, 203, 6, 140, "Subtitle"], Cell[957, 35, 158, 6, 96, "Subsubtitle"], Cell[CellGroupData[{ Cell[1140, 45, 87, 1, 104, "Section"], Cell[CellGroupData[{ Cell[1252, 50, 32, 0, 57, "Subsection"], Cell[1287, 52, 372, 7, 57, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[1696, 64, 38, 0, 57, "Subsection"], Cell[1737, 66, 288, 7, 57, "Text"], Cell[2028, 75, 143, 2, 54, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[2208, 82, 46, 0, 57, "Subsection"], Cell[2257, 84, 377, 6, 57, "Text"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[2683, 96, 99, 1, 104, "Section"], Cell[2785, 99, 327, 6, 63, "Text"], Cell[CellGroupData[{ Cell[3137, 109, 116, 1, 61, "Subsection"], Cell[3256, 112, 582, 12, 167, "Text"], Cell[3841, 126, 706, 17, 126, "Input"], Cell[4550, 145, 850, 15, 115, "Text"], Cell[5403, 162, 302, 6, 57, "Input"], Cell[5708, 170, 366, 11, 64, "Text"], Cell[6077, 183, 267, 6, 57, "Input"], Cell[6347, 191, 146, 3, 37, "Text"], Cell[6496, 196, 242, 6, 57, "Input"], Cell[6741, 204, 348, 10, 38, "Text"], Cell[7092, 216, 397, 9, 92, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[7526, 230, 113, 1, 61, "Subsection"], Cell[7642, 233, 695, 13, 168, "Text"], Cell[8340, 248, 598, 13, 92, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[8975, 266, 105, 1, 61, "Subsection"], Cell[9083, 269, 444, 7, 63, "Text"], Cell[9530, 278, 471, 11, 126, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[10038, 294, 97, 1, 61, "Subsection"], Cell[CellGroupData[{ Cell[10160, 299, 100, 1, 39, "Subsubsection"], Cell[10263, 302, 555, 13, 64, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[10855, 320, 148, 2, 39, "Subsubsection"], Cell[11006, 324, 585, 11, 89, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[11628, 340, 99, 1, 39, "Subsubsection"], Cell[11730, 343, 441, 7, 89, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[12208, 355, 100, 1, 39, "Subsubsection"], Cell[12311, 358, 351, 7, 63, "Text"] }, Open ]] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[12723, 372, 87, 1, 66, "Section"], Cell[12813, 375, 305, 7, 37, "Text"], Cell[13121, 384, 1454, 44, 228, "Input"], Cell[14578, 430, 1210, 32, 296, "Input"], Cell[CellGroupData[{ Cell[15813, 466, 97, 1, 61, "Subsection"], Cell[CellGroupData[{ Cell[15935, 471, 101, 1, 39, "Subsubsection"], Cell[16039, 474, 418, 16, 38, "Text"], Cell[16460, 492, 550, 15, 126, "Input"], Cell[17013, 509, 115, 1, 37, "Text"], Cell[17131, 512, 344, 8, 92, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[17512, 525, 100, 1, 39, "Subsubsection"], Cell[17615, 528, 364, 6, 63, "Text"], Cell[17982, 536, 179, 4, 57, "Input"] }, Open ]] }, Open ]] }, Closed]] }, Open ]] } ] *) (* End of internal cache information *)