diff --git a/Persistence.cabal b/Persistence.cabal
--- a/Persistence.cabal
+++ b/Persistence.cabal
@@ -7,10 +7,10 @@
 -- hash: 8b7fcc7836b916f046653da257033f5fbdeb90a49069ff85be71bca358f359c0
 
 name:           Persistence
-version:        2.0
+version:        2.0.1
 category:       Data, Math
-synopsis:       A versatile library for topological data anlysis.
-description:    A topological data anlysis library motivated by flexibility when it comes to the type of data being analyzed. If your data comes with a meaningful binary function into into an ordered set, you can use Persistence to analyze your data. The library also provides functions for analyzing directed\/undirected, weighted\/unweighted graphs. See the README for resources on learning about topological data anlysis.
+synopsis:       A versatile library for topological data analysis.
+description:    A topological data analysis library motivated by flexibility when it comes to the type of data being analyzed. If your data comes with a meaningful binary function into an ordered set, you can use Persistence to analyze your data. The library also provides functions for analyzing directed\/undirected, weighted\/unweighted graphs. See the README for resources on learning about topological data anlysis.
 homepage:       https://github.com/Ebanflo42/Persistence
 bug-reports:    https://github.com/Ebanflo42/Persistence/issues
 author:         Eben Kadile
@@ -33,9 +33,9 @@
       Persistence.HasseDiagram
       Persistence.SimplicialComplex
   other-modules:
-      Paths_Persistence
       Persistence.Matrix
       Persistence.Util
+      Paths_Persistence
   hs-source-dirs:
       src
   build-depends:
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -51,10 +51,4 @@
 
 3) Implement construction of the alpha-complex (sub-complex of the Delaunay triangulation where the vertices of every simplex are within a certain distance).
 
-General:
-
-1) Update documentation for `Filtration.hs` once more changes have been finalized.
-
-2) A more consistent, well-motivated, and concise philosophy for parallelism needs to be implemented.
-
 See each of the files for an overview of its inner-workings.
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -40,7 +40,7 @@
 
 - Fixed non-exhaustive pattern match in `BottleNeckDistance` functions.
 
-## 2.0 -- To be determined
+## 2.0
 
 ### Changed
 
@@ -65,3 +65,9 @@
 - Persistent homology functions that return Bar codes in terms of scales.
 
 - Functions for constructing and manipulating persistence landscapes.
+
+## 2.0.1
+
+### Changed
+
+- Representation of graphs now takes half as much memory.
diff --git a/src/Persistence/Filtration.hs b/src/Persistence/Filtration.hs
--- a/src/Persistence/Filtration.hs
+++ b/src/Persistence/Filtration.hs
@@ -97,7 +97,7 @@
 type SimpleFiltration = (Int, Vector (Vector FilterSimplex))
 
 {- |
-  Representation of a filtration which, unlike `SimpleFiltration`, can cope with vertices that have a non-zero filtration index. Vertices of the filtration are represented like all other simplices except that they don't their own have vertices or faces.
+  Representation of a filtration which, unlike SimpleFiltration, can cope with vertices that have a non-zero filtration index. Vertices of the filtration are represented like all other simplices except that they don't their own have vertices or faces.
 
   Note that, since this library currently only deals with static pointcloud data, all of the filtration construction functions produce vertices whose filtration index is 0. Thus, if you want to use this type you will have to construct the instances yourself.
 -}
@@ -253,7 +253,7 @@
   let scales = case scales' of Left v -> V.toList v; Right l -> l
       edgeInSimplex edge simplex =
         (V.any (\x -> V.head edge == x) simplex) && (V.any (\x -> V.last edge == x) simplex)
-      edgeTooLong scale edge     = scale <= (fst $ graph ! (edge ! 0) ! (edge ! 1))
+      edgeTooLong scale edge     = scale <= (fst $ graph `indexGraph` (edge ! 0, edge ! 1))
       maxIndex                   = (L.length scales) - 1
 
       calcIndices 0 [] sc         = sc
diff --git a/src/Persistence/SimplicialComplex.hs b/src/Persistence/SimplicialComplex.hs
--- a/src/Persistence/SimplicialComplex.hs
+++ b/src/Persistence/SimplicialComplex.hs
@@ -29,6 +29,7 @@
   , getDim
   , encodeWeightedGraph
   , wGraph2sc
+  , indexGraph
   -- * Construction
   , makeNbrhdGraph
   , makeNbrhdGraphPar
@@ -80,7 +81,7 @@
 -}
 type Graph a = Vector (Vector (a, Bool))
 
--- * Simplicial complex utilities
+-- * Utilities
 
 -- | Show all the information in a simplicial complex.
 sc2String :: SimplicialComplex -> String
@@ -100,6 +101,12 @@
 getDim :: SimplicialComplex -> Int
 getDim = L.length . snd
 
+-- | Safely index into the adjacency matrix of a graph.
+indexGraph :: Graph a -> (Int, Int) -> (a, Bool)
+indexGraph graph (i, j) =
+  if i < j then graph ! j ! i
+  else graph ! i ! j
+
 {- |
   Takes the number of vertices and each edge paired with its weight to output the graph encoded as a 2D vector.
   If only you have an unweighted graph, you can still encode your graph by simply letting the type a be ().
@@ -107,18 +114,21 @@
 -}
 encodeWeightedGraph :: Int -> (Int -> Int -> (a, Bool)) -> Graph a
 encodeWeightedGraph numVerts edge =
-  mapWithIndex (\i r -> mapWithIndex (\j _ -> edge i j) r) $ V.replicate numVerts (V.replicate numVerts ())
+  mapWithIndex (\i r ->
+    mapWithIndex (\j _ -> edge i j)
+      $ V.replicate (i + 1) ()) $ V.replicate numVerts ()
 
 -- | Given a weighted graph, construct a 1-dimensional simplicial complex in the canonical way. Betti numbers of this simplicial complex can be used to count cycles and connected components.
 wGraph2sc :: Graph a -> SimplicialComplex
 wGraph2sc graph =
-  let numVerts = V.length graph
+  let numVerts              = V.length graph
       getEdges index result =
         if index == numVerts then result
         else
-          V.map (\(i, b) ->
-            (V.fromList [index, i], V.empty)) $ V.filter snd
-              $ mapWithIndex (\i (_, b) -> (i, b)) $ V.take (numVerts - index) $ graph ! index
+          let new = V.map (\(i, b) ->
+                      (V.fromList [index, i], V.empty)) $ V.filter snd
+                        $ mapWithIndex (\i (_, b) -> (i, b)) $ graph ! index
+          in getEdges (index + 1) result
   in (numVerts, (getEdges 0 V.empty) `cons` V.empty)
 
 {- |
@@ -128,15 +138,17 @@
 makeNbrhdGraph :: (Ord a, Eq b) => a -> (b -> b -> a) -> Either (Vector b) [b] -> Graph a
 makeNbrhdGraph scale metric dataSet =
   let vector = case dataSet of Left v -> v; Right l -> V.fromList l
-  in V.map (\x -> V.map (\y -> let d = metric x y in (d, d <= scale)) vector) vector
+  in mapWithIndex (\i x -> V.map (\y ->
+       let d = metric x y in (d, d <= scale)) $ V.take (i + 1) vector) vector
 
 -- | Parallel version of the above.
 makeNbrhdGraphPar :: (Ord a, Eq b) => a -> (b -> b -> a) -> Either (Vector b) [b] -> Graph a
 makeNbrhdGraphPar scale metric dataSet =
   let vector = case dataSet of Left v -> v; Right l -> V.fromList l
-  in parMapVec (\x -> V.map (\y -> let d = metric x y in (d, d <= scale)) vector) vector
+  in parMapWithIndex (\i x -> V.map (\y ->
+       let d = metric x y in (d, d <= scale)) $ V.take (i + 1) vector) vector
 
--- * Simplicial complex construction
+-- * Construction
 
 {- |
   Makes a simplicial complex where the simplices are the complete subgraphs (cliques) of the given graph.
@@ -172,7 +184,7 @@
       maxCliques =
         (\(x, y) -> (x, V.fromList y)) $ makePair
           $ sortVecs $ L.map V.fromList $ L.filter (\c -> L.length c > 1)
-            $ getMaximalCliques (\i j -> snd $ graph ! i ! j) [0..numVerts - 1]
+            $ getMaximalCliques (\i j -> snd $ graph `indexGraph` (i, j)) [0..numVerts - 1]
 
       --generates faces of simplices and records the boundary indices
       combos :: Int
@@ -235,7 +247,7 @@
       maxCliques =
         (\(x, y) -> (x, V.fromList y)) $ makePair
           $ sortVecs $ L.map V.fromList $ L.filter (\c -> L.length c > 1)
-            $ getMaximalCliques (\i j -> snd $ graph ! i ! j) [0..numVerts - 1]
+            $ getMaximalCliques (\i j -> snd $ graph `indexGraph` (i, j)) [0..numVerts - 1]
 
       --generates faces of simplices and records the boundary indices
       combos :: Int
