Compare commits
1 Commits
main
..
experiment
| Author | SHA1 | Date | |
|---|---|---|---|
| 4262c86d26 |
@@ -103,13 +103,9 @@ class GameTree:
|
||||
|
||||
The indentation level is specified by the <depth> parameter.
|
||||
"""
|
||||
if self.is_white_move:
|
||||
turn_desc = "White's move"
|
||||
else:
|
||||
turn_desc = "Black's move"
|
||||
move_desc = f'{self.move} -> {turn_desc}\n'
|
||||
s = ' ' * depth + move_desc
|
||||
if self._subtrees == []:
|
||||
move_desc = f'{self.move}-{self.white_win_probability}\n'
|
||||
s = '| ' * depth + move_desc
|
||||
if not self._subtrees:
|
||||
return s
|
||||
else:
|
||||
for subtree in self._subtrees:
|
||||
@@ -220,14 +216,6 @@ class GameTree:
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import python_ta.contracts
|
||||
python_ta.contracts.check_all_contracts()
|
||||
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
|
||||
import python_ta
|
||||
python_ta.check_all(config={
|
||||
'max-line-length': 100,
|
||||
'disable': ['E1136'],
|
||||
})
|
||||
g = GameTree()
|
||||
g.insert_move_sequence(['a1b1', 'a2b1'], 1.0)
|
||||
print(g)
|
||||
|
||||
@@ -181,4 +181,4 @@ if __name__ == '__main__':
|
||||
})
|
||||
|
||||
# Sample call to part1_runner (you can change this, just keep it in the main block!)
|
||||
part1_runner('data/white_wins.csv', 50, True)
|
||||
part1_runner('data/white_wins.csv', 50, False)
|
||||
|
||||
@@ -1,118 +0,0 @@
|
||||
\documentclass[11pt]{article}
|
||||
\usepackage{amsmath}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[margin=0.75in]{geometry}
|
||||
|
||||
\title{CSC111 Assignment 3: Graphs, Recommender Systems, and Clustering}
|
||||
\author{Azalea Gui \& Peter Lin}
|
||||
\date{\today}
|
||||
|
||||
\newcommand{\N}{\mathbb{N}}
|
||||
\newcommand{\Z}{\mathbb{Z}}
|
||||
\newcommand{\R}{\mathbb{R}}
|
||||
\newcommand{\cO}{\mathcal{O}}
|
||||
\newcommand{\floor}[1]{\left\lfloor #1 \right\rfloor}
|
||||
\newcommand{\code}[1]{\texttt{#1}}
|
||||
|
||||
\begin{document}
|
||||
\maketitle
|
||||
|
||||
\section*{Part 1: The book review graph and simple recommendations}
|
||||
|
||||
\begin{enumerate}
|
||||
|
||||
\item[1.]
|
||||
Complete this part in the provided \texttt{a3\_part1.py} starter file.
|
||||
Do \textbf{not} include your solution in this file.
|
||||
|
||||
\item[2.]
|
||||
Running Time Analysis for \texttt{load\_review\_graph}:
|
||||
|
||||
Let $n$ be the number of lines in \texttt{book\_names\_file}, let $m$ be the number of lines in \texttt{reviews\_file}.
|
||||
|
||||
There are two operations that involves iteration in the function, one reads the book names file and creates the \texttt{mp} dictionary, and the other one reads the reviews file and adds vertices to the graph.
|
||||
|
||||
In creating $mp$, the program first opened the file and created a \texttt{csv.reader}, which are both constant-time operations. Then, the dictionary comprehension statement loops through all $n$ lines, running only constant-time operations in each iteration for adding the book id and name pair into the dictionary, resulting in a running time of $\Theta(n)$. Summing up all the operations for creating $mp$ and ignoring constant-time operations, the running time would be $\in \Theta(n)$.
|
||||
|
||||
For adding the vertices, it also opened the file and created a \texttt{csv.reader} in constant time. Then, the loop iterates through all $m$ lines. In each iteration, two vertices and one edge are added, and it also accessed $mp$ to retrieve the book name, which are all constant time operations. Therefore, the total running time would be $\in \Theta(m)$.
|
||||
|
||||
Since there are only constant-time operations outside the two iterating operations, the total running time of the function would be $\in \Theta(m + n)$
|
||||
|
||||
\item[3.]
|
||||
Complete this part in the provided \texttt{a3\_part1.py} starter file.
|
||||
Do \textbf{not} include your solution in this file.
|
||||
|
||||
\item[4.]
|
||||
Complete this part in the provided \texttt{a3\_part1.py} starter file.
|
||||
Do \textbf{not} include your solution in this file.
|
||||
|
||||
\end{enumerate}
|
||||
|
||||
\section*{Part 2: Weighted graphs, recommendations, review prediction}
|
||||
|
||||
Complete this part in the provided \texttt{a3\_part2\_recommendations.py} and \texttt{a3\_part2\_predictions.py} starter files.
|
||||
Do \textbf{not} include your solution in this file.
|
||||
|
||||
\newpage
|
||||
|
||||
\section*{Part 3: Finding book clusters}
|
||||
|
||||
\begin{enumerate}
|
||||
|
||||
\item[1.]
|
||||
Complete this part in the provided \texttt{a3\_part3.py} starter file.
|
||||
Do \textbf{not} include your solution in this file.
|
||||
|
||||
\item[2.]
|
||||
Complete this part in the provided \texttt{a3\_part3.py} starter file.
|
||||
Do \textbf{not} include your solution in this file.
|
||||
|
||||
\item[3.]
|
||||
|
||||
\begin{enumerate}
|
||||
\item[(a)]
|
||||
Running Time Analysis for \texttt{cross\_cluster\_weight}:
|
||||
|
||||
Let $m_1$ be the size of \texttt{cluster1}, and let $m_2$ be the size of \texttt{cluster2}.
|
||||
|
||||
There is one nested loop in the function. The inner loop iterates $m_2$ times through all values in \texttt{cluster2}, and the outer loop iterates $m_1$ times through all values in \texttt{cluster1}. Inside the inner loop, there is only one function call \texttt{get\_weight}, which is constant-time because it only involves constant-time operations like dictionary accessing and variable assignment. After the function call, the returned value is added to \texttt{sw}, which is one constant-time operation. Let $c$ be a constant representing the number of constant time operations inside the inner loop. The nested loop will run $m_1 * m_2 * c$ operations in total, which is $\in \Theta(m_1 * m_2)$
|
||||
|
||||
Since there are only constant-time operations such as \texttt{len(set)}, variable assignment, and multiplication or division outside the nested loop, the running time of the function will be $\in \Theta(m_1 * m_2)$
|
||||
|
||||
|
||||
\item[(b)]
|
||||
Running Time Analysis for the inner loop in \texttt{find\_clusters\_random}:
|
||||
|
||||
Let $n$ be the number of vertices of \texttt{graph}.
|
||||
|
||||
There is one nested loop in the function.
|
||||
|
||||
For iteration $i$ of the outer loop, the inner loop iterates through all books in the \texttt{clusters} array, which has $n - i$ entires since each iteration of the outer loop removes an entry at the end. Inside the inner loop, the \texttt{if}, \texttt{is not}, comparisons, and variable assignment operations are all constant-time. For iteration $j$ of the inner loop, the \texttt{cross\_cluster\_weight} function call inside the inner loop has a running time of $\Theta(m_1 * m_j)$ as previously analyzed, where $m_1$ is the size of cluster $c_1$, and $m_j$ is the size of cluster $c_j$ (or $c_2$ for iteration $j$). Therefore, the running time of the function will be:
|
||||
|
||||
|
||||
\begin{align}
|
||||
RT_{\text{inner\_loop}} &= \sum_j^{n-i} m_1 * m_j \\
|
||||
&= m_1 * \sum_j^{n-i} m_j
|
||||
\end{align}
|
||||
|
||||
Since the if statement inside the inner loop ensures $m_1 \neq m_j$, and since we know that $\sum_c |c| = n$, the previously stated $\sum_j^{n-i} m_j$ will be equal to $n - |c_1| = n - m_1$. Therefore, the running time of the function is $m_1 * (n - m_1)$
|
||||
|
||||
Since every cluster is initialized to have one element, we know that $m_1 > 0$, and $n - m_1 < n$. Then, since $m_1$ is also $< n$, the running time $m_1 * (n - m_1)$ is bounded by $\cO(n^2)$.
|
||||
|
||||
\item[(c)]
|
||||
Running Time Analysis for \texttt{find\_clusters\_random}:
|
||||
|
||||
Let $n$ be the number of vertices of graph, and let $k$ be the value of \texttt{num\_clusters}.
|
||||
|
||||
In the worst case scenario: Since the outer loop iterates over a range from $0$ to $n - k$, it iterates $n - k$ times. For each iteration, the inner loop have a running time of $\cO(n^2)$ as previously analyzed. Besides from the inner loop, other statements inside the outer loop includes constant-time operations print, f-string creation, \texttt{random.choice}, and varaible assignment. After that, all elements in the set $c_1$ are added to \texttt{best\_c2}, which has a worst-case running time of $\cO(n)$ because $|c_1| <= n$. Also, $c_1$ is removed from the list \texttt{clusters}, which also has a worst-case running time of $\cO(n)$ because \texttt{len(clusters)} $<= n$. Combining all of these operations, the running time of one iteration of the outer loop will be $\in \cO(n^2)$, and the runninng time of $n - k$ iterations will be $\in \cO(n^2 \cdot (n - k))$.
|
||||
|
||||
Outside the outer loop, there is only a return statement (constant-time) and a list comprehension that initializes the \texttt{clusters} array, which goes through $n$ iterations, executing a constant-time operation of creating a set for each iteration.
|
||||
|
||||
Therefore, the running time of the entire function would be $\in \cO(n^2 \cdot (n - k))$.
|
||||
|
||||
\item[(d)]
|
||||
\emph{Not to be handed in.}
|
||||
\end{enumerate}
|
||||
|
||||
\end{enumerate}
|
||||
\end{document}
|
||||
@@ -1,329 +0,0 @@
|
||||
"""CSC111 Winter 2022 Assignment 3: Graphs, Recommender Systems, and Clustering (Part 1)
|
||||
|
||||
Instructions (READ THIS FIRST!)
|
||||
===============================
|
||||
|
||||
This Python module contains the modified graph and vertex classes you'll be using as the basis
|
||||
for this assignment, as well as additional functions for you to complete in this part.
|
||||
|
||||
Copyright and Usage Information
|
||||
===============================
|
||||
|
||||
This file is provided solely for the personal and private use of students
|
||||
taking CSC111 at the University of Toronto St. George campus. All forms of
|
||||
distribution of this code, whether as given or with any changes, are
|
||||
expressly prohibited. For more information on copyright for CSC111 materials,
|
||||
please consult our Course Syllabus.
|
||||
|
||||
This file is Copyright (c) 2022 Mario Badr, David Liu, and Isaac Waller.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import csv
|
||||
from typing import Any, Literal
|
||||
|
||||
# Make sure you've installed the necessary Python libraries (see assignment handout
|
||||
# "Installing new libraries" section)
|
||||
import networkx as nx # Used for visualizing graphs (by convention, referred to as "nx")
|
||||
|
||||
|
||||
class _Vertex:
|
||||
"""A vertex in a book review graph, used to represent a user or a book.
|
||||
|
||||
Each vertex item is either a user id or book title. Both are represented as strings,
|
||||
even though we've kept the type annotation as Any to be consistent with lecture.
|
||||
|
||||
Instance Attributes:
|
||||
- item: The data stored in this vertex, representing a user or book.
|
||||
- kind: The type of this vertex: 'user' or 'book'.
|
||||
- neighbours: The vertices that are adjacent to this vertex.
|
||||
|
||||
Representation Invariants:
|
||||
- self not in self.neighbours
|
||||
- all(self in u.neighbours for u in self.neighbours)
|
||||
- self.kind in {'user', 'book'}
|
||||
"""
|
||||
item: Any
|
||||
kind: str
|
||||
neighbours: set[_Vertex]
|
||||
|
||||
def __init__(self, item: Any, kind: str) -> None:
|
||||
"""Initialize a new vertex with the given item and kind.
|
||||
|
||||
This vertex is initialized with no neighbours.
|
||||
|
||||
Preconditions:
|
||||
- kind in {'user', 'book'}
|
||||
"""
|
||||
self.item = item
|
||||
self.kind = kind
|
||||
self.neighbours = set()
|
||||
|
||||
def degree(self) -> int:
|
||||
"""Return the degree of this vertex."""
|
||||
return len(self.neighbours)
|
||||
|
||||
############################################################################
|
||||
# Part 1, Q3
|
||||
############################################################################
|
||||
def similarity_score(self, other: _Vertex) -> float:
|
||||
"""Return the similarity score between this vertex and other.
|
||||
|
||||
See Assignment handout for definition of similarity score.
|
||||
"""
|
||||
if self.degree() == 0 or other.degree() == 0:
|
||||
return 0.0
|
||||
intersection = len(self.neighbours.intersection(other.neighbours))
|
||||
union = len(self.neighbours) + len(other.neighbours) - intersection # inclusion-exclusion
|
||||
return intersection / union
|
||||
|
||||
|
||||
class Graph:
|
||||
"""A graph used to represent a book review network.
|
||||
"""
|
||||
# Private Instance Attributes:
|
||||
# - _vertices:
|
||||
# A collection of the vertices contained in this graph.
|
||||
# Maps item to _Vertex object.
|
||||
_vertices: dict[Any, _Vertex]
|
||||
|
||||
def __init__(self) -> None:
|
||||
"""Initialize an empty graph (no vertices or edges)."""
|
||||
self._vertices = {}
|
||||
|
||||
def add_vertex(self, item: Any, kind: str) -> None:
|
||||
"""Add a vertex with the given item and kind to this graph.
|
||||
|
||||
The new vertex is not adjacent to any other vertices.
|
||||
Do nothing if the given item is already in this graph.
|
||||
|
||||
Preconditions:
|
||||
- kind in {'user', 'book'}
|
||||
"""
|
||||
if item not in self._vertices:
|
||||
self._vertices[item] = _Vertex(item, kind)
|
||||
|
||||
def add_edge(self, item1: Any, item2: Any) -> None:
|
||||
"""Add an edge between the two vertices with the given items in this graph.
|
||||
|
||||
Raise a ValueError if item1 or item2 do not appear as vertices in this graph.
|
||||
|
||||
Preconditions:
|
||||
- item1 != item2
|
||||
"""
|
||||
if item1 in self._vertices and item2 in self._vertices:
|
||||
v1 = self._vertices[item1]
|
||||
v2 = self._vertices[item2]
|
||||
|
||||
v1.neighbours.add(v2)
|
||||
v2.neighbours.add(v1)
|
||||
else:
|
||||
raise ValueError
|
||||
|
||||
def adjacent(self, item1: Any, item2: Any) -> bool:
|
||||
"""Return whether item1 and item2 are adjacent vertices in this graph.
|
||||
|
||||
Return False if item1 or item2 do not appear as vertices in this graph.
|
||||
"""
|
||||
if item1 in self._vertices and item2 in self._vertices:
|
||||
v1 = self._vertices[item1]
|
||||
return any(v2.item == item2 for v2 in v1.neighbours)
|
||||
else:
|
||||
return False
|
||||
|
||||
def get_neighbours(self, item: Any) -> set:
|
||||
"""Return a set of the neighbours of the given item.
|
||||
|
||||
Note that the *items* are returned, not the _Vertex objects themselves.
|
||||
|
||||
Raise a ValueError if item does not appear as a vertex in this graph.
|
||||
"""
|
||||
if item in self._vertices:
|
||||
v = self._vertices[item]
|
||||
return {neighbour.item for neighbour in v.neighbours}
|
||||
else:
|
||||
raise ValueError
|
||||
|
||||
def get_all_vertices(self, kind: Literal['', 'user', 'book'] = '') -> set:
|
||||
"""Return a set of all vertex items in this graph.
|
||||
|
||||
If kind != '', only return the items of the given vertex kind.
|
||||
|
||||
Preconditions:
|
||||
- kind in {'', 'user', 'book'}
|
||||
"""
|
||||
if kind != '':
|
||||
return {v.item for v in self._vertices.values() if v.kind == kind}
|
||||
else:
|
||||
return set(self._vertices.keys())
|
||||
|
||||
def to_networkx(self, max_vertices: int = 5000) -> nx.Graph:
|
||||
"""Convert this graph into a networkx Graph.
|
||||
|
||||
max_vertices specifies the maximum number of vertices that can appear in the graph.
|
||||
(This is necessary to limit the visualization output for large graphs.)
|
||||
|
||||
Note that this method is provided for you, and you shouldn't change it.
|
||||
"""
|
||||
graph_nx = nx.Graph()
|
||||
for v in self._vertices.values():
|
||||
graph_nx.add_node(v.item, kind=v.kind)
|
||||
|
||||
for u in v.neighbours:
|
||||
if graph_nx.number_of_nodes() < max_vertices:
|
||||
graph_nx.add_node(u.item, kind=u.kind)
|
||||
|
||||
if u.item in graph_nx.nodes:
|
||||
graph_nx.add_edge(v.item, u.item)
|
||||
|
||||
if graph_nx.number_of_nodes() >= max_vertices:
|
||||
break
|
||||
|
||||
return graph_nx
|
||||
|
||||
############################################################################
|
||||
# Part 1, Q3
|
||||
############################################################################
|
||||
def get_similarity_score(self, item1: Any, item2: Any) -> float:
|
||||
"""Return the similarity score between the two given items in this graph.
|
||||
|
||||
Raise a ValueError if item1 or item2 do not appear as vertices in this graph.
|
||||
|
||||
>>> g = Graph()
|
||||
>>> for i in range(0, 6):
|
||||
... g.add_vertex(str(i), kind='user')
|
||||
>>> g.add_edge('0', '2')
|
||||
>>> g.add_edge('0', '3')
|
||||
>>> g.add_edge('0', '4')
|
||||
>>> g.add_edge('1', '3')
|
||||
>>> g.add_edge('1', '4')
|
||||
>>> g.add_edge('1', '5')
|
||||
>>> g.get_similarity_score('0', '1')
|
||||
0.5
|
||||
"""
|
||||
if item1 not in self._vertices or item2 not in self._vertices:
|
||||
raise ValueError
|
||||
return self._vertices[item1].similarity_score(self._vertices[item2])
|
||||
|
||||
############################################################################
|
||||
# Part 1, Q4
|
||||
############################################################################
|
||||
def recommend_books(self, book: str, limit: int) -> list[str]:
|
||||
"""Return a list of up to <limit> recommended books based on similarity to the given book.
|
||||
|
||||
The return value is a list of the titles of recommended books, sorted in
|
||||
*descending order* of similarity score. Ties are broken in descending order
|
||||
of book title. That is, if v1 and v2 have the same similarity score, then
|
||||
v1 comes before v2 if and only if v1.item > v2.item.
|
||||
|
||||
The returned list should NOT contain:
|
||||
- the input book itself
|
||||
- any book with a similarity score of 0 to the input book
|
||||
- any duplicates
|
||||
- any vertices that represents a user (instead of a book)
|
||||
|
||||
Up to <limit> books are returned, starting with the book with the highest similarity score,
|
||||
then the second-highest similarity score, etc. Fewer than <limit> books are returned if
|
||||
and only if there aren't enough books that meet the above criteria.
|
||||
|
||||
Preconditions:
|
||||
- book in self._vertices
|
||||
- self._vertices[book].kind == 'book'
|
||||
- limit >= 1
|
||||
|
||||
>>> my_graph = load_review_graph('data/reviews_full.csv', 'data/book_names.csv')
|
||||
>>> title = "Harry Potter and the Sorcerer's Stone (Book 1)"
|
||||
>>> import pprint
|
||||
>>> pprint.pprint(my_graph.recommend_books(title, 10))
|
||||
['The Casual Vacancy',
|
||||
'Harry Potter and the Chamber of Secrets',
|
||||
'Harry Potter and the Prisoner of Azkaban',
|
||||
'Harry Potter and the Chamber of Secrets, Book 2',
|
||||
'Harry Potter and the Deathly Hallows, Book 7',
|
||||
'Harry Potter And The Goblet Of Fire',
|
||||
'Harry Potter And The Order Of The Phoenix',
|
||||
'Harry Potter and the Half-Blood Prince (Book 6)',
|
||||
"The Cuckoo's Calling (Cormoran Strike)",
|
||||
'Fellowship of the Ring (Lord of the Rings Part 1)']
|
||||
"""
|
||||
book = self._vertices[book] # vertex is more useful here
|
||||
books = set() # all books distance == 2 away from self
|
||||
for neighbour in book.neighbours:
|
||||
books.update(neighbour.neighbours)
|
||||
books.remove(book)
|
||||
arr = [(book.similarity_score(x), x.item) for x in books]
|
||||
arr = sorted(arr, reverse=True)[:limit]
|
||||
return [x[1] for x in arr]
|
||||
|
||||
|
||||
################################################################################
|
||||
# Part 1, Q1
|
||||
################################################################################
|
||||
def load_review_graph(reviews_file: str, book_names_file: str) -> Graph:
|
||||
"""Return a book review graph corresponding to the given datasets.
|
||||
|
||||
The book review graph stores one vertex for each user and book in the datasets.
|
||||
Each vertex stores as its item either a user ID or book TITLE (the latter is why
|
||||
you need the book_names_file). Use the "kind" _Vertex attribute to differentiate
|
||||
between the two vertex types.
|
||||
|
||||
Edges represent a review between a user and a book. In this graph, each edge
|
||||
only represents the existence of a review---IGNORE THE REVIEW SCORE in the
|
||||
datasets, as we don't have a way to represent these scores (yet).
|
||||
|
||||
Preconditions:
|
||||
- reviews_file is the path to a CSV file corresponding to the book review data
|
||||
format described on the assignment handout
|
||||
- book_names_file is the path to a CSV file corresponding to the book data
|
||||
format described on the assignment handout
|
||||
|
||||
>>> g = load_review_graph('data/reviews_small.csv', 'data/book_names.csv')
|
||||
>>> len(g.get_all_vertices(kind='book'))
|
||||
4
|
||||
>>> len(g.get_all_vertices(kind='user'))
|
||||
5
|
||||
>>> user1_reviews = g.get_neighbours('user1')
|
||||
>>> len(user1_reviews)
|
||||
3
|
||||
>>> "Harry Potter and the Sorcerer's Stone (Book 1)" in user1_reviews
|
||||
True
|
||||
"""
|
||||
g = Graph()
|
||||
|
||||
# mp[book_id] = book_name
|
||||
mp: dict[str, str]
|
||||
|
||||
# Read book names file and create id-name mapping
|
||||
with open(book_names_file, 'r', newline='', encoding='UTF-8') as f:
|
||||
reader = csv.reader(f)
|
||||
mp = dict(reader)
|
||||
|
||||
# Read user review file and link user and reviews in the graph
|
||||
with open(reviews_file, 'r', newline='', encoding='UTF-8') as f:
|
||||
reader = csv.reader(f)
|
||||
for user_id, book_id, rating in reader:
|
||||
g.add_vertex(user_id, 'user')
|
||||
g.add_vertex(mp[book_id], 'book')
|
||||
g.add_edge(user_id, mp[book_id])
|
||||
|
||||
return g
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# You can uncomment the following lines for code checking/debugging purposes.
|
||||
# However, we recommend commenting out these lines when working with the large
|
||||
# datasets, as checking representation invariants and preconditions greatly
|
||||
# increases the running time of the functions/methods.
|
||||
# import python_ta.contracts
|
||||
# python_ta.contracts.check_all_contracts()
|
||||
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
|
||||
import python_ta
|
||||
python_ta.check_all(config={
|
||||
'max-line-length': 100,
|
||||
'disable': ['E1136'],
|
||||
'extra-imports': ['csv', 'networkx'],
|
||||
'allowed-io': ['load_review_graph'],
|
||||
'max-nested-blocks': 4
|
||||
})
|
||||
@@ -1,241 +0,0 @@
|
||||
"""CSC111 Winter 2022 Assignment 3: Graphs, Recommender Systems, and Clustering (Part 2)
|
||||
|
||||
Instructions (READ THIS FIRST!)
|
||||
===============================
|
||||
|
||||
This Python module contains classes responsible for making predictions of book review scores.
|
||||
We've provided the abstract class and some example subclasses, and you'll complete one new
|
||||
subclass and a new function to evaluate the different classes.
|
||||
|
||||
Copyright and Usage Information
|
||||
===============================
|
||||
|
||||
This file is provided solely for the personal and private use of students
|
||||
taking CSC111 at the University of Toronto St. George campus. All forms of
|
||||
distribution of this code, whether as given or with any changes, are
|
||||
expressly prohibited. For more information on copyright for CSC111 materials,
|
||||
please consult our Course Syllabus.
|
||||
|
||||
This file is Copyright (c) 2022 Mario Badr, David Liu, and Isaac Waller.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import csv
|
||||
from typing import Union
|
||||
|
||||
import a3_part2_recommendations
|
||||
|
||||
|
||||
class ReviewScorePredictor:
|
||||
"""A graph-based entity that predicts scores for book reviews.
|
||||
|
||||
This is an abstract class, and should be subclasses to implement different review
|
||||
prediction algorithms.
|
||||
|
||||
Instance Attributes:
|
||||
- graph: The book review graph that this entity uses to make predictions.
|
||||
"""
|
||||
graph: a3_part2_recommendations.WeightedGraph
|
||||
|
||||
def __init__(self, graph: a3_part2_recommendations.WeightedGraph) -> None:
|
||||
"""Initialize a new ReviewScorePredictor."""
|
||||
self.graph = graph
|
||||
|
||||
def predict_review_score(self, user: str, book: str) -> int:
|
||||
"""Predict the score (1-5) that the given user would give the given book.
|
||||
|
||||
If there is already an edge between the given user and book in the graph,
|
||||
return that score. Otherwise, return a predicted score.
|
||||
|
||||
Preconditions:
|
||||
- user in self.graph._vertices
|
||||
- book in self.graph._vertices
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
class FiveStarPredictor(ReviewScorePredictor):
|
||||
"""A book review predictor that always predicts a five-star review,
|
||||
ignoring the actual book and user.
|
||||
"""
|
||||
def predict_review_score(self, user: str, book: str) -> int:
|
||||
"""Predict the score that the given user would give the given book.
|
||||
|
||||
If there is already an edge between the given user and book in the graph,
|
||||
return that score. Otherwise, return 5 as the predicted score.
|
||||
|
||||
Preconditions:
|
||||
- user in self.graph._vertices
|
||||
- book in self.graph._vertices
|
||||
"""
|
||||
if self.graph.adjacent(user, book):
|
||||
return self.graph.get_weight(user, book)
|
||||
else:
|
||||
return 5
|
||||
|
||||
|
||||
class BookAverageScorePredictor(ReviewScorePredictor):
|
||||
"""A book review predictor that always predicts based on the book's average score,
|
||||
ignoring any user preferences.
|
||||
"""
|
||||
def predict_review_score(self, user: str, book: str) -> int:
|
||||
"""Predict the score that the given user would give the given book.
|
||||
|
||||
If there is already an edge between the given user and book in the graph,
|
||||
return that score. Otherwise, return the book's average review score in
|
||||
the graph, rounded to the nearest integer (using the built-in `round` function).
|
||||
|
||||
Preconditions:
|
||||
- user in self.graph._vertices
|
||||
- book in self.graph._vertices
|
||||
- the given book has at least one review
|
||||
"""
|
||||
if self.graph.adjacent(user, book):
|
||||
return self.graph.get_weight(user, book)
|
||||
else:
|
||||
return round(self.graph.average_weight(book))
|
||||
|
||||
|
||||
################################################################################
|
||||
# Part 2, Q3
|
||||
################################################################################
|
||||
class SimilarUserPredictor(ReviewScorePredictor):
|
||||
"""A book review predictor that makes a prediction based on how similar users rated the book.
|
||||
|
||||
Representation Invariants:
|
||||
- self._score_type in {'unweighted', 'strict'}
|
||||
"""
|
||||
# Private Instance Attributes:
|
||||
# - _score_type: the type of similarity score to use when computing similarity score
|
||||
_score_type: str
|
||||
|
||||
def __init__(self, graph: a3_part2_recommendations.WeightedGraph,
|
||||
score_type: str = 'unweighted') -> None:
|
||||
"""Initialize a new SimilarUserPredictor.
|
||||
|
||||
You may want to review Section 10.4 of the Course Notes for a reminder on
|
||||
how to properly override a superclass initializer. To avoid a python_ta.contracts error,
|
||||
initialize self._score_type at the TOP of this method body.
|
||||
"""
|
||||
self._score_type = score_type
|
||||
ReviewScorePredictor.__init__(self, graph)
|
||||
|
||||
def predict_review_score(self, user: str, book: str) -> int:
|
||||
"""Predict the score that the given user would give the given book.
|
||||
|
||||
If there is already an edge between the given user and book in the graph,
|
||||
return that score. Otherwise, return the book's WEIGHTED review score among
|
||||
all users who have read the book, where the weight used is the similarity
|
||||
score of the reviewing user with the given user. self._score_type is used
|
||||
to determine which similarity score to use for the weights
|
||||
|
||||
As usual, round this score using the built-in `round` function.
|
||||
|
||||
For example, suppose there are three users A, B, C who have read the book,
|
||||
and one, D, who has not. We want to use the review scores of A, B, and C to predict
|
||||
the rating for D. The three user ratings and weighted similarity score with D
|
||||
are shown in this table:
|
||||
|
||||
| User | Review score | Weighted similarity score with D |
|
||||
| ---- | ------------ | -------------------------------- |
|
||||
| A | 3 | 0.4 |
|
||||
| B | 5 | 0.1 |
|
||||
| C | 2 | 0.3 |
|
||||
|
||||
Then the predicted review for D equals:
|
||||
|
||||
(3 * 0.4 + 5 * 0.1 + 2 * 0.3) / (0.4 + 0.1 + 0.3) = 2.875
|
||||
|
||||
and so this function would return 3.
|
||||
|
||||
If the total similarity score from all of the book's reviewers is 0,
|
||||
then instead return the book's average review score (same as BookAverageScorePredictor).
|
||||
|
||||
Preconditions:
|
||||
- user in self.graph._vertices
|
||||
- book in self.graph._vertices
|
||||
"""
|
||||
if self.graph.adjacent(user, book): # if the user already made a review, use that score
|
||||
return self.graph.get_weight(user, book)
|
||||
users = self.graph.get_neighbours(book)
|
||||
total_weighted = 0
|
||||
total = 0
|
||||
all_zero = True
|
||||
for u in users:
|
||||
weight = self.graph.get_similarity_score(u, book, 'strict')
|
||||
score = self.graph.get_weight(u, book)
|
||||
if weight > 0:
|
||||
all_zero = False
|
||||
total_weighted += score * weight
|
||||
total += score
|
||||
if all_zero:
|
||||
return round(total / len(users))
|
||||
return round(total_weighted / len(users))
|
||||
|
||||
|
||||
################################################################################
|
||||
# Part 2, Q4
|
||||
################################################################################
|
||||
def evaluate_predictor(predictor: ReviewScorePredictor,
|
||||
test_file: str, book_names_file: str) -> dict[str, Union[int, float]]:
|
||||
"""Evaluate the given ReviewScorePredictor on the given test file.
|
||||
|
||||
Read in each row of the given test_file (which contains a book, user, and
|
||||
review score). For each row, use the given predictor to make a prediction of the review
|
||||
score, and compare that prediction against the actual given review score from the file.
|
||||
|
||||
Return a dictionary summarizing the performance of the predictor. This dictionary
|
||||
has the following keys:
|
||||
- 'num_reviews': the total number of predicted review scores (equal to the
|
||||
number of lines in the CSV file)
|
||||
- 'num_correct': the number of predicted review scores that exactly matched the
|
||||
actual review score
|
||||
- 'average_error': the average of the *absolute value difference* between
|
||||
predicted and actual review scores across all reviews in the test file
|
||||
|
||||
Preconditions:
|
||||
- test_file is the path to a CSV file corresponding to the book review data
|
||||
format described on the assignment handout
|
||||
- book_names_file is the path to a CSV file corresponding to the book data
|
||||
- test_file has at least one row
|
||||
- all users and books in test_file are in predictor.graph
|
||||
format described on the assignment handout
|
||||
"""
|
||||
num_reviews = 0
|
||||
num_correct = 0
|
||||
total_error = 0
|
||||
mp: dict[str, str] # maps book ID to book name
|
||||
with open(book_names_file, 'r', newline='', encoding='UTF-8') as f:
|
||||
reader = csv.reader(f)
|
||||
mp = dict(reader)
|
||||
with open(test_file, 'r', newline='', encoding='UTF-8') as f:
|
||||
reader = csv.reader(f)
|
||||
for book, user, score in reader:
|
||||
book = mp[book]
|
||||
num_reviews += 1
|
||||
actual = predictor.predict_review_score(user, book)
|
||||
if actual == score:
|
||||
num_correct += 1
|
||||
total_error += abs(score - actual)
|
||||
return {
|
||||
'num_reviews': num_reviews,
|
||||
'num_correct': num_correct,
|
||||
'average_error': total_error / num_reviews,
|
||||
}
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# You can uncomment the following lines for code checking/debugging purposes.
|
||||
# However, we recommend commenting out these lines when working with the large
|
||||
# datasets, as checking representation invariants and preconditions greatly
|
||||
# increases the running time of the functions/methods.
|
||||
# import python_ta.contracts
|
||||
# python_ta.contracts.check_all_contracts()
|
||||
|
||||
import python_ta
|
||||
python_ta.check_all(config={
|
||||
'max-line-length': 1000,
|
||||
'disable': ['E1136'],
|
||||
'extra-imports': ['csv', 'a3_part2_recommendations'],
|
||||
'allowed-io': ['evaluate_predictor'],
|
||||
'max-nested-blocks': 4
|
||||
})
|
||||
@@ -1,298 +0,0 @@
|
||||
"""CSC111 Winter 2022 Assignment 3: Graphs, Recommender Systems, and Clustering (Part 2)
|
||||
|
||||
Instructions (READ THIS FIRST!)
|
||||
===============================
|
||||
|
||||
This Python module contains new classes to represent *weighted graphs and vertices*,
|
||||
which we'll use to represent a book review network with scores of reviews as well.
|
||||
This file is structured very similarly to a3_part1.py.
|
||||
|
||||
Copyright and Usage Information
|
||||
===============================
|
||||
|
||||
This file is provided solely for the personal and private use of students
|
||||
taking CSC111 at the University of Toronto St. George campus. All forms of
|
||||
distribution of this code, whether as given or with any changes, are
|
||||
expressly prohibited. For more information on copyright for CSC111 materials,
|
||||
please consult our Course Syllabus.
|
||||
|
||||
This file is Copyright (c) 2022 Mario Badr, David Liu, and Isaac Waller.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import csv
|
||||
from typing import Any, Union, Literal
|
||||
|
||||
from a3_part1 import Graph
|
||||
|
||||
|
||||
class _WeightedVertex:
|
||||
"""A vertex in a weighted book review graph, used to represent a user or a book.
|
||||
|
||||
Same documentation as _Vertex from Part 1, except now neighbours is a dictionary mapping
|
||||
a neighbour vertex to the weight of the edge to from self to that neighbour.
|
||||
Note that in Part 2, the weights will be integers between 1 and 5, but in Part 3 the
|
||||
weights will be floats.
|
||||
|
||||
Instance Attributes:
|
||||
- item: The data stored in this vertex, representing a user or book.
|
||||
- kind: The type of this vertex: 'user' or 'book'.
|
||||
- neighbours: The vertices that are adjacent to this vertex, and their corresponding
|
||||
edge weights.
|
||||
|
||||
Representation Invariants:
|
||||
- self not in self.neighbours
|
||||
- all(self in u.neighbours for u in self.neighbours)
|
||||
- self.kind in {'user', 'book'}
|
||||
"""
|
||||
item: Any
|
||||
kind: str
|
||||
neighbours: dict[_WeightedVertex, Union[int, float]]
|
||||
|
||||
def __init__(self, item: Any, kind: str) -> None:
|
||||
"""Initialize a new vertex with the given item and kind.
|
||||
|
||||
This vertex is initialized with no neighbours.
|
||||
|
||||
Preconditions:
|
||||
- kind in {'user', 'book'}
|
||||
"""
|
||||
self.item = item
|
||||
self.kind = kind
|
||||
self.neighbours = {}
|
||||
|
||||
def degree(self) -> int:
|
||||
"""Return the degree of this vertex."""
|
||||
return len(self.neighbours)
|
||||
|
||||
############################################################################
|
||||
# Part 2, Q2
|
||||
############################################################################
|
||||
def similarity_score_unweighted(self, other: _WeightedVertex) -> float:
|
||||
"""Return the unweighted similarity score between this vertex and other.
|
||||
|
||||
The unweighted similarity score is calculated in the same way as the
|
||||
similarity score for _Vertex (from Part 1). That is, just look at edges,
|
||||
and ignore the weights.
|
||||
"""
|
||||
if self.degree() == 0 or other.degree() == 0:
|
||||
return 0.0
|
||||
a = set(self.neighbours.keys())
|
||||
b = set(other.neighbours.keys())
|
||||
intersection = len(a.intersection(b))
|
||||
union = len(a) + len(b) - intersection # inclusion-exclusion
|
||||
return intersection / union
|
||||
|
||||
def similarity_score_strict(self, other: _WeightedVertex) -> float:
|
||||
"""Return the strict weighted similarity score between this vertex and other.
|
||||
|
||||
See Assignment handout for details.
|
||||
"""
|
||||
if self.degree() == 0 or other.degree() == 0:
|
||||
return 0.0
|
||||
a = set(self.neighbours.keys())
|
||||
b = set(other.neighbours.keys())
|
||||
generator = (x for x in a if x in b and x.neighbours[self] == x.neighbours[other])
|
||||
intersection = sum(1 for _ in generator)
|
||||
union = len(a.union(b))
|
||||
return intersection / union
|
||||
|
||||
|
||||
class WeightedGraph(Graph):
|
||||
"""A weighted graph used to represent a book review network that keeps track of review scores.
|
||||
|
||||
Note that this is a subclass of the Graph class from Part 1, and so inherits any methods
|
||||
from that class that aren't overridden here.
|
||||
"""
|
||||
# Private Instance Attributes:
|
||||
# - _vertices:
|
||||
# A collection of the vertices contained in this graph.
|
||||
# Maps item to _WeightedVertex object.
|
||||
_vertices: dict[Any, _WeightedVertex]
|
||||
|
||||
def __init__(self) -> None:
|
||||
"""Initialize an empty graph (no vertices or edges)."""
|
||||
self._vertices = {}
|
||||
|
||||
# This call isn't necessary, except to satisfy PythonTA.
|
||||
Graph.__init__(self)
|
||||
|
||||
def add_vertex(self, item: Any, kind: str) -> None:
|
||||
"""Add a vertex with the given item and kind to this graph.
|
||||
|
||||
The new vertex is not adjacent to any other vertices.
|
||||
Do nothing if the given item is already in this graph.
|
||||
|
||||
Preconditions:
|
||||
- kind in {'user', 'book'}
|
||||
"""
|
||||
if item not in self._vertices:
|
||||
self._vertices[item] = _WeightedVertex(item, kind)
|
||||
|
||||
def add_edge(self, item1: Any, item2: Any, weight: Union[int, float] = 1) -> None:
|
||||
"""Add an edge between the two vertices with the given items in this graph,
|
||||
with the given weight.
|
||||
|
||||
Raise a ValueError if item1 or item2 do not appear as vertices in this graph.
|
||||
|
||||
Preconditions:
|
||||
- item1 != item2
|
||||
"""
|
||||
if item1 in self._vertices and item2 in self._vertices:
|
||||
v1 = self._vertices[item1]
|
||||
v2 = self._vertices[item2]
|
||||
|
||||
# Add the new edge
|
||||
v1.neighbours[v2] = weight
|
||||
v2.neighbours[v1] = weight
|
||||
else:
|
||||
# We didn't find an existing vertex for both items.
|
||||
raise ValueError
|
||||
|
||||
def get_weight(self, item1: Any, item2: Any) -> Union[int, float]:
|
||||
"""Return the weight of the edge between the given items.
|
||||
|
||||
Return 0 if item1 and item2 are not adjacent.
|
||||
|
||||
Preconditions:
|
||||
- item1 and item2 are vertices in this graph
|
||||
"""
|
||||
v1 = self._vertices[item1]
|
||||
v2 = self._vertices[item2]
|
||||
return v1.neighbours.get(v2, 0)
|
||||
|
||||
def average_weight(self, item: Any) -> float:
|
||||
"""Return the average weight of the edges adjacent to the vertex corresponding to item.
|
||||
|
||||
Raise ValueError if item does not corresponding to a vertex in the graph.
|
||||
"""
|
||||
if item in self._vertices:
|
||||
v = self._vertices[item]
|
||||
return sum(v.neighbours.values()) / len(v.neighbours)
|
||||
else:
|
||||
raise ValueError
|
||||
|
||||
############################################################################
|
||||
# Part 2, Q2
|
||||
############################################################################
|
||||
def get_similarity_score(self, item1: Any, item2: Any,
|
||||
score_type: Literal['unweighted', 'strict'] = 'unweighted') -> float:
|
||||
"""Return the similarity score between the two given items in this graph.
|
||||
|
||||
score_type is one of 'unweighted' or 'strict', corresponding to the
|
||||
different ways of calculating weighted graph vertex similarity, as described
|
||||
on the assignment handout.
|
||||
|
||||
Raise a ValueError if item1 or item2 do not appear as vertices in this graph.
|
||||
|
||||
Preconditions:
|
||||
- score_type in {'unweighted', 'strict'}
|
||||
"""
|
||||
if item1 not in self._vertices or item2 not in self._vertices:
|
||||
raise ValueError
|
||||
if score_type == 'unweighted':
|
||||
return self._vertices[item1].similarity_score_unweighted(self._vertices[item2])
|
||||
return self._vertices[item1].similarity_score_strict(self._vertices[item2])
|
||||
|
||||
def recommend_books(self, book: str, limit: int,
|
||||
score_type: Literal['unweighted', 'strict'] = 'unweighted') -> list[str]:
|
||||
"""Return a list of up to <limit> recommended books based on similarity to the given book.
|
||||
|
||||
score_type is one of 'unweighted' or 'strict', corresponding to the
|
||||
different ways of calculating weighted graph vertex similarity, as described
|
||||
on the assignment handout. The corresponding similarity score formula is used
|
||||
in this method (whenever the phrase "similarity score" appears below).
|
||||
|
||||
The return value is a list of the titles of recommended books, sorted in
|
||||
*descending order* of similarity score. Ties are broken in descending order
|
||||
of book title. That is, if v1 and v2 have the same similarity score, then
|
||||
v1 comes before v2 if and only if v1.item > v2.item.
|
||||
|
||||
The returned list should NOT contain:
|
||||
- the input book itself
|
||||
- any book with a similarity score of 0 to the input book
|
||||
- any duplicates
|
||||
- any vertices that represents a user (instead of a book)
|
||||
|
||||
Up to <limit> books are returned, starting with the book with the highest similarity score,
|
||||
then the second-highest similarity score, etc. Fewer than <limit> books are returned if
|
||||
and only if there aren't enough books that meet the above criteria.
|
||||
|
||||
Preconditions:
|
||||
- book in self._vertices
|
||||
- self._vertices[book].kind == 'book'
|
||||
- limit >= 1
|
||||
- score_type in {'unweighted', 'strict'}
|
||||
"""
|
||||
book = self._vertices[book] # vertex is more useful here
|
||||
books = set() # all books distance == 2 away from self
|
||||
for neighbour in book.neighbours:
|
||||
books.update(neighbour.neighbours.keys())
|
||||
books.remove(book)
|
||||
arr = []
|
||||
for x in books:
|
||||
if score_type == 'strict':
|
||||
score = book.similarity_score_strict(x)
|
||||
if score == 0:
|
||||
continue
|
||||
else:
|
||||
score = book.similarity_score_unweighted(x)
|
||||
arr.append((score, x.item))
|
||||
arr = sorted(arr, reverse=True)[:limit]
|
||||
return [y[1] for y in arr]
|
||||
|
||||
|
||||
################################################################################
|
||||
# Part 2, Q1
|
||||
################################################################################
|
||||
def load_weighted_review_graph(reviews_file: str, book_names_file: str) -> WeightedGraph:
|
||||
"""Return a book review WEIGHTED graph corresponding to the given datasets.
|
||||
|
||||
This should be very similar to the corresponding function Part 1, except now
|
||||
the book review scores are used as edge weights.
|
||||
|
||||
Preconditions:
|
||||
- reviews_file is the path to a CSV file corresponding to the book review data
|
||||
format described on the assignment handout
|
||||
- book_names_file is the path to a CSV file corresponding to the book data
|
||||
format described on the assignment handout
|
||||
"""
|
||||
g = WeightedGraph()
|
||||
|
||||
# mp[book_id] = book_name
|
||||
mp: dict[str, str]
|
||||
|
||||
# Read book names file and create id-name mapping
|
||||
with open(book_names_file, 'r', newline='', encoding='UTF-8') as f:
|
||||
reader = csv.reader(f)
|
||||
mp = dict(reader)
|
||||
|
||||
# Read user review file and link user and reviews in the graph
|
||||
with open(reviews_file, 'r', newline='', encoding='UTF-8') as f:
|
||||
reader = csv.reader(f)
|
||||
for user_id, book_id, rating in reader:
|
||||
g.add_vertex(user_id, 'user')
|
||||
g.add_vertex(mp[book_id], 'book')
|
||||
g.add_edge(user_id, mp[book_id], int(rating))
|
||||
|
||||
return g
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# You can uncomment the following lines for code checking/debugging purposes.
|
||||
# However, we recommend commenting out these lines when working with the large
|
||||
# datasets, as checking representation invariants and preconditions greatly
|
||||
# increases the running time of the functions/methods.
|
||||
# import python_ta.contracts
|
||||
# python_ta.contracts.check_all_contracts()
|
||||
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
|
||||
import python_ta
|
||||
python_ta.check_all(config={
|
||||
'max-line-length': 1000,
|
||||
'disable': ['E1136', 'W0221'],
|
||||
'extra-imports': ['csv', 'a3_part1'],
|
||||
'allowed-io': ['load_weighted_review_graph'],
|
||||
'max-nested-blocks': 4
|
||||
})
|
||||
@@ -1,207 +0,0 @@
|
||||
"""CSC111 Winter 2022 Assignment 3: Graphs, Recommender Systems, and Clustering (Part 3)
|
||||
|
||||
Instructions (READ THIS FIRST!)
|
||||
===============================
|
||||
|
||||
This Python module contains the functions you'll write for determining *clusters* of vertices
|
||||
in a graph.
|
||||
|
||||
Copyright and Usage Information
|
||||
===============================
|
||||
|
||||
This file is provided solely for the personal and private use of students
|
||||
taking CSC111 at the University of Toronto St. George campus. All forms of
|
||||
distribution of this code, whether as given or with any changes, are
|
||||
expressly prohibited. For more information on copyright for CSC111 materials,
|
||||
please consult our Course Syllabus.
|
||||
|
||||
This file is Copyright (c) 2022 Mario Badr, David Liu, and Isaac Waller.
|
||||
"""
|
||||
import random
|
||||
from typing import Literal
|
||||
|
||||
from a3_part2_recommendations import WeightedGraph
|
||||
|
||||
|
||||
################################################################################
|
||||
# Part 3, Q1
|
||||
################################################################################
|
||||
def create_book_graph(review_graph: WeightedGraph,
|
||||
threshold: float = 0.05,
|
||||
score_type: Literal['unweighted', 'strict'] = 'unweighted') -> WeightedGraph:
|
||||
"""Return a book graph based on the given review_graph.
|
||||
|
||||
The score_type parameter plays the same role as in WeightedGraph.get_similarity_score.
|
||||
|
||||
The returned book graph has the following properties:
|
||||
1. Its vertex set is exactly the set of book vertices in review_graph
|
||||
(items are book titles).
|
||||
2. For every two distinct books b1 and b2, let s(b1, b2) be their similarity score,
|
||||
where score_type specifies which similarity score to use.
|
||||
|
||||
- If s(b1, b2) > threshold, there is an edge between b1 and b2 in the book graph
|
||||
with weight equal to s(b1, b2). Unlike Part 2, these weights will be floats,
|
||||
not ints!
|
||||
- Otherwise, there is no edge between b1 and b2.
|
||||
|
||||
Preconditions:
|
||||
- score_type in {'unweighted', 'strict'}
|
||||
"""
|
||||
# Add all books as vertices
|
||||
book_graph = WeightedGraph()
|
||||
book_names: set[str] = review_graph.get_all_vertices('book')
|
||||
for b in book_names:
|
||||
book_graph.add_vertex(b, 'book')
|
||||
|
||||
# Add all edges
|
||||
for b1 in book_names:
|
||||
for b2 in book_names:
|
||||
if b1 == b2:
|
||||
continue
|
||||
|
||||
# Calculate similarity score
|
||||
score = review_graph.get_similarity_score(b1, b2, score_type)
|
||||
if score <= threshold:
|
||||
continue
|
||||
|
||||
# Add edge
|
||||
book_graph.add_edge(b1, b2, score)
|
||||
|
||||
# Done
|
||||
return book_graph
|
||||
|
||||
|
||||
################################################################################
|
||||
# Part 3, Q2
|
||||
################################################################################
|
||||
def cross_cluster_weight(book_graph: WeightedGraph, cluster1: set, cluster2: set) -> float:
|
||||
"""Return the cross-cluster weight between cluster1 and cluster2.
|
||||
|
||||
See assignment handout for the definition of cross-cluster weight.
|
||||
|
||||
Preconditions:
|
||||
- cluster1 != set() and cluster2 != set()
|
||||
- cluster1.isdisjoint(cluster2)
|
||||
- Every item in cluster1 and cluster2 is a vertex in book_graph
|
||||
|
||||
>>> bg = WeightedGraph()
|
||||
>>> for b in range(4): \
|
||||
bg.add_vertex(f'B{b}', 'book')
|
||||
>>> bg.add_edge('B0', 'B1', .5)
|
||||
>>> bg.add_edge('B0', 'B2', .4)
|
||||
>>> bg.add_edge('B1', 'B2', .3)
|
||||
>>> bg.get_weight('B0', 'B1')
|
||||
0.5
|
||||
>>> cross_cluster_weight(bg, {'B0', 'B1'}, {'B2', 'B3'}) == (.4 + .3) / 4
|
||||
True
|
||||
"""
|
||||
# sw = sum(book_graph.get_weight(v1, v2) for v1 in cluster1 for v2 in cluster2)
|
||||
sw = 0
|
||||
for v1 in cluster1:
|
||||
for v2 in cluster2:
|
||||
sw += book_graph.get_weight(v1, v2)
|
||||
|
||||
return sw / (len(cluster1) * len(cluster2))
|
||||
|
||||
|
||||
################################################################################
|
||||
# Part 3, Q3 (don't modify this code)
|
||||
################################################################################
|
||||
def find_clusters_random(graph: WeightedGraph, num_clusters: int) -> list[set]:
|
||||
"""Return a list of <num_clusters> vertex clusters for the given graph.
|
||||
|
||||
At each iteration, this algorithm first chooses a random cluster, and then chooses
|
||||
the cluster that has the highest cross-cluster weight to the randomly-chose cluster
|
||||
to merge.
|
||||
|
||||
Preconditions:
|
||||
- num_clusters >= 1
|
||||
"""
|
||||
# Each book starts in its own cluster
|
||||
clusters = [{book} for book in graph.get_all_vertices()]
|
||||
|
||||
for _ in range(0, len(clusters) - num_clusters):
|
||||
print(f'{len(clusters)} clusters')
|
||||
|
||||
c1 = random.choice(clusters)
|
||||
# Pick the best cluster to merge c1 into.
|
||||
best = -1
|
||||
best_c2 = None
|
||||
|
||||
for c2 in clusters:
|
||||
if c1 is not c2:
|
||||
score = cross_cluster_weight(graph, c1, c2)
|
||||
if score > best:
|
||||
best = score
|
||||
best_c2 = c2
|
||||
|
||||
best_c2.update(c1)
|
||||
clusters.remove(c1)
|
||||
|
||||
return clusters
|
||||
|
||||
|
||||
def find_clusters_greedy(graph: WeightedGraph, num_clusters: int) -> list[set]:
|
||||
"""Return a list of <num_clusters> vertex clusters for the given graph.
|
||||
|
||||
At each iteration, this algorithm chooses the pair of clusters with the highest
|
||||
cross-cluster weight to merge.
|
||||
|
||||
Preconditions:
|
||||
- num_clusters >= 1
|
||||
"""
|
||||
# Each book starts in its own cluster
|
||||
clusters = [{book} for book in graph.get_all_vertices()]
|
||||
|
||||
for _ in range(0, len(clusters) - num_clusters):
|
||||
print(f'{len(clusters)} clusters')
|
||||
|
||||
# Merge the two communities with the most links
|
||||
best = -1
|
||||
best_c1, best_c2 = None, None
|
||||
|
||||
for i1 in range(0, len(clusters)):
|
||||
for i2 in range(i1 + 1, len(clusters)):
|
||||
c1, c2 = clusters[i1], clusters[i2]
|
||||
score = cross_cluster_weight(graph, c1, c2)
|
||||
if score > best:
|
||||
best, best_c1, best_c2 = score, c1, c2
|
||||
|
||||
best_c2.update(best_c1)
|
||||
clusters.remove(best_c1)
|
||||
|
||||
return clusters
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# You can uncomment the following lines for code checking/debugging purposes.
|
||||
# However, we recommend commenting out these lines when working with the large
|
||||
# datasets, as checking representation invariants and preconditions greatly
|
||||
# increases the running time of the functions/methods.
|
||||
# import python_ta.contracts
|
||||
# python_ta.contracts.check_all_contracts()
|
||||
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
|
||||
import python_ta
|
||||
python_ta.check_all(config={
|
||||
'max-line-length': 1000,
|
||||
'disable': ['E1136'],
|
||||
'extra-imports': ['random', 'a3_part2_recommendations'],
|
||||
'allowed-io': ['find_clusters_greedy', 'find_clusters_random'],
|
||||
'max-nested-blocks': 4
|
||||
})
|
||||
|
||||
# Q1 Test
|
||||
# review_graph = load_weighted_review_graph('data/reviews_full.csv', 'data/book_names.csv')
|
||||
# book_graph = create_book_graph(review_graph, 0.03)
|
||||
# from a3_visualization import visualize_graph
|
||||
# visualize_graph(book_graph)
|
||||
|
||||
# Q3 Test
|
||||
# review_graph = load_weighted_review_graph('data/reviews_full.csv', 'data/book_names.csv')
|
||||
# book_graph = create_book_graph(review_graph, threshold=0.01, score_type='strict')
|
||||
# clusters = find_clusters_random(book_graph, 15)
|
||||
# from a3_visualization import visualize_graph_clusters
|
||||
# visualize_graph_clusters(book_graph, clusters)
|
||||
@@ -1,175 +0,0 @@
|
||||
"""CSC111 Winter 2022 Assignment 3: Graphs, Recommender Systems, and Clustering (Visualization)
|
||||
|
||||
Module Description
|
||||
==================
|
||||
|
||||
This module contains some Python functions that you can use to visualize the graphs
|
||||
you're working with on this assignment. You should not modify anything in this file.
|
||||
It will not be submitted for grading.
|
||||
|
||||
Disclaimer: we didn't have time to make this file fully PythonTA-compliant!
|
||||
|
||||
Copyright and Usage Information
|
||||
===============================
|
||||
|
||||
This file is provided solely for the personal and private use of students
|
||||
taking CSC111 at the University of Toronto St. George campus. All forms of
|
||||
distribution of this code, whether as given or with any changes, are
|
||||
expressly prohibited. For more information on copyright for CSC111 materials,
|
||||
please consult our Course Syllabus.
|
||||
|
||||
This file is Copyright (c) 2022 Mario Badr, David Liu, and Isaac Waller.
|
||||
"""
|
||||
import networkx as nx
|
||||
from plotly.graph_objs import Scatter, Figure
|
||||
|
||||
import a3_part1
|
||||
|
||||
|
||||
# Colours to use when visualizing different clusters.
|
||||
COLOUR_SCHEME = [
|
||||
'#2E91E5', '#E15F99', '#1CA71C', '#FB0D0D', '#DA16FF', '#222A2A', '#B68100',
|
||||
'#750D86', '#EB663B', '#511CFB', '#00A08B', '#FB00D1', '#FC0080', '#B2828D',
|
||||
'#6C7C32', '#778AAE', '#862A16', '#A777F1', '#620042', '#1616A7', '#DA60CA',
|
||||
'#6C4516', '#0D2A63', '#AF0038'
|
||||
]
|
||||
|
||||
LINE_COLOUR = 'rgb(210,210,210)'
|
||||
VERTEX_BORDER_COLOUR = 'rgb(50, 50, 50)'
|
||||
BOOK_COLOUR = 'rgb(89, 205, 105)'
|
||||
USER_COLOUR = 'rgb(105, 89, 205)'
|
||||
|
||||
|
||||
def visualize_graph(graph: a3_part1.Graph,
|
||||
layout: str = 'spring_layout',
|
||||
max_vertices: int = 5000,
|
||||
output_file: str = '') -> None:
|
||||
"""Use plotly and networkx to visualize the given graph.
|
||||
|
||||
Optional arguments:
|
||||
- layout: which graph layout algorithm to use
|
||||
- max_vertices: the maximum number of vertices that can appear in the graph
|
||||
- output_file: a filename to save the plotly image to (rather than displaying
|
||||
in your web browser)
|
||||
"""
|
||||
graph_nx = graph.to_networkx(max_vertices)
|
||||
|
||||
pos = getattr(nx, layout)(graph_nx)
|
||||
|
||||
x_values = [pos[k][0] for k in graph_nx.nodes]
|
||||
y_values = [pos[k][1] for k in graph_nx.nodes]
|
||||
labels = list(graph_nx.nodes)
|
||||
kinds = [graph_nx.nodes[k]['kind'] for k in graph_nx.nodes]
|
||||
|
||||
colours = [BOOK_COLOUR if kind == 'book' else USER_COLOUR for kind in kinds]
|
||||
|
||||
x_edges = []
|
||||
y_edges = []
|
||||
for edge in graph_nx.edges:
|
||||
x_edges += [pos[edge[0]][0], pos[edge[1]][0], None]
|
||||
y_edges += [pos[edge[0]][1], pos[edge[1]][1], None]
|
||||
|
||||
trace3 = Scatter(x=x_edges,
|
||||
y=y_edges,
|
||||
mode='lines',
|
||||
name='edges',
|
||||
line=dict(color=LINE_COLOUR, width=1),
|
||||
hoverinfo='none',
|
||||
)
|
||||
trace4 = Scatter(x=x_values,
|
||||
y=y_values,
|
||||
mode='markers',
|
||||
name='nodes',
|
||||
marker=dict(symbol='circle-dot',
|
||||
size=5,
|
||||
color=colours,
|
||||
line=dict(color=VERTEX_BORDER_COLOUR, width=0.5)
|
||||
),
|
||||
text=labels,
|
||||
hovertemplate='%{text}',
|
||||
hoverlabel={'namelength': 0}
|
||||
)
|
||||
|
||||
data1 = [trace3, trace4]
|
||||
fig = Figure(data=data1)
|
||||
fig.update_layout({'showlegend': False})
|
||||
fig.update_xaxes(showgrid=False, zeroline=False, visible=False)
|
||||
fig.update_yaxes(showgrid=False, zeroline=False, visible=False)
|
||||
|
||||
if output_file == '':
|
||||
fig.show()
|
||||
else:
|
||||
fig.write_image(output_file)
|
||||
|
||||
|
||||
def visualize_graph_clusters(graph: a3_part1.Graph, clusters: list[set],
|
||||
layout: str = 'spring_layout',
|
||||
max_vertices: int = 5000,
|
||||
output_file: str = '') -> None:
|
||||
"""Visualize the given graph, using different colours to illustrate the different clusters.
|
||||
|
||||
Hides all edges that go from one cluster to another. (This helps the graph layout algorithm
|
||||
positions vertices in the same cluster close together.)
|
||||
|
||||
Same optional arguments as visualize_graph (see that function for details).
|
||||
"""
|
||||
graph_nx = graph.to_networkx(max_vertices)
|
||||
all_edges = list(graph_nx.edges)
|
||||
for edge in all_edges:
|
||||
# Check if edge is within the same cluster
|
||||
if any((edge[0] in cluster) != (edge[1] in cluster) for cluster in clusters):
|
||||
graph_nx.remove_edge(edge[0], edge[1])
|
||||
|
||||
pos = getattr(nx, layout)(graph_nx)
|
||||
|
||||
x_values = [pos[k][0] for k in graph_nx.nodes]
|
||||
y_values = [pos[k][1] for k in graph_nx.nodes]
|
||||
labels = list(graph_nx.nodes)
|
||||
|
||||
colors = []
|
||||
for k in graph_nx.nodes:
|
||||
for i, c in enumerate(clusters):
|
||||
if k in c:
|
||||
colors.append(COLOUR_SCHEME[i % len(COLOUR_SCHEME)])
|
||||
break
|
||||
else:
|
||||
colors.append(BOOK_COLOUR)
|
||||
|
||||
x_edges = []
|
||||
y_edges = []
|
||||
for edge in graph_nx.edges:
|
||||
x_edges += [pos[edge[0]][0], pos[edge[1]][0], None]
|
||||
y_edges += [pos[edge[0]][1], pos[edge[1]][1], None]
|
||||
|
||||
trace3 = Scatter(x=x_edges,
|
||||
y=y_edges,
|
||||
mode='lines',
|
||||
name='edges',
|
||||
line=dict(color=LINE_COLOUR, width=1),
|
||||
hoverinfo='none'
|
||||
)
|
||||
trace4 = Scatter(x=x_values,
|
||||
y=y_values,
|
||||
mode='markers',
|
||||
name='nodes',
|
||||
marker=dict(symbol='circle-dot',
|
||||
size=5,
|
||||
color=colors,
|
||||
line=dict(color=VERTEX_BORDER_COLOUR, width=0.5)
|
||||
),
|
||||
text=labels,
|
||||
hovertemplate='%{text}',
|
||||
hoverlabel={'namelength': 0}
|
||||
)
|
||||
|
||||
data1 = [trace3, trace4]
|
||||
fig = Figure(data=data1)
|
||||
fig.update_layout({'showlegend': False})
|
||||
fig.update_xaxes(showgrid=False, zeroline=False, visible=False)
|
||||
fig.update_yaxes(showgrid=False, zeroline=False, visible=False)
|
||||
fig.show()
|
||||
|
||||
if output_file == '':
|
||||
fig.show()
|
||||
else:
|
||||
fig.write_image(output_file)
|
||||
@@ -1,985 +0,0 @@
|
||||
0027676463,The Night Before Christmas
|
||||
0060557818,Neverwhere: A Novel
|
||||
0425284689,Before We Were Yours: A Novel
|
||||
0804192898,Make Me: A Jack Reacher Novel
|
||||
0061992259,The One and Only Ivan
|
||||
0141022043,Blink - The Power Of Thinking Without Thinking
|
||||
0312352557,Still Life: A Chief Inspector Gamache Novel
|
||||
0743554450,A Thousand Splendid Suns: A Novel
|
||||
0986842222,The Color of Heaven
|
||||
1471118630,Never Too Far (Tempting Too Far Novel)
|
||||
1476753180,Ugly Love: A Novel
|
||||
1944083014,Judgment Cometh: and That Right Soon (Joe Dillard Series) (Volume 8)
|
||||
0002171856,The Sas Survival Handbook
|
||||
0147520762,"The Girl in the Spider's Web: A Lisbeth Salander novel, continuing Stieg Larsson's Millennium Series"
|
||||
0312577230,The Great Alone: A Novel
|
||||
1468139339,Wait For Me
|
||||
0151008116,Life of Pi
|
||||
0316175676,The Snow Child: A Novel
|
||||
0615953948,Mind's Eye
|
||||
1477826580,The American Lady (The Glassblower Trilogy)
|
||||
1503935310,Everything We Keep: A Novel
|
||||
0143121707,The Invention of Wings
|
||||
0375433392,"The Hard Way (Jack Reacher, No. 10"
|
||||
0544025830,Coming Clean: A Memoir
|
||||
1476707634,Drinking and Tweeting: And Other Brandi Blunders
|
||||
1477819967,Mrs. Saint and the Defectives: A Novel
|
||||
1477822585,The Last Town (Wayward Pines)
|
||||
1503953319,The Queen's Poisoner (Kingfountain)
|
||||
6077547328,"Maze Runner. Correr o Morir / Maze Runner, Run or die (Spanish Edition)"
|
||||
0006545793,Brave New World
|
||||
0983398038,The Rockstar's Daughter: (Treadwell Academy Series #1)
|
||||
0099557266,Playing for Pizza
|
||||
B003156C4E,Fellowship of the Ring (Lord of the Rings Part 1)
|
||||
0028180054,A Wrinkle in Time
|
||||
0099580470,Shift (Wool Trilogy)
|
||||
0143106708,Twelve Years a Slave (Penguin Classics)
|
||||
B00714PZMQ,Quiet: The Power of Introverts in a World That Can't Stop Talking
|
||||
0316228532,The Casual Vacancy
|
||||
074356619X,"The Secret (Unabridged, 4-CD Set)"
|
||||
1455576506,The Coincidence of Callie & Kayden
|
||||
1463514581,Twenty-Eight and a Half Wishes (A Rose Gardner Mystery)
|
||||
1477808663,The Game Changer: A Novel
|
||||
1491598778,The Good Neighbor
|
||||
1503939308,Exhume (Dr. Schwartzman)
|
||||
1503935183,The Last Woman Standing: A Novel
|
||||
0061997161,The Pioneer Woman: Black Heels to Tractor Wheels--A Love Story
|
||||
0147525071,Extreme Prey (A Prey Novel)
|
||||
0739453939,90 Minutes in Heaven
|
||||
1477822593,Dead Certain: A Novel (Broden Legal)
|
||||
1534640150,Earth Alone: Earthrise Book 1
|
||||
0140285628,The Man in the High Castle (Essential Penguin)
|
||||
0425246043,The Perfect Hope (The Inn Boonsboro Trilogy)
|
||||
0307967115,My Name Is Lucy Barton: A Novel
|
||||
0375969020,Wonder
|
||||
0763644765,Potty (Leslie Patricelli board books)
|
||||
0765326264,A Dog's Purpose: A Novel for Humans
|
||||
1410493415,The Life We Bury (Wheeler Large Print Book Series)
|
||||
1476755590,Real (The REAL series)
|
||||
0375434542,Origin: A Novel (Robert Langdon)
|
||||
1478288892,Sentence of Marriage: Promises to Keep (Volume 1)
|
||||
1536690872,All the Little Children
|
||||
0345539788,Red Rising
|
||||
0399179135,Lilac Girls
|
||||
0141328290,Thirteen Reasons Why
|
||||
0060539836,Kill the Competition
|
||||
B00EJQY4BM,The First Phone Call from Heaven: A Novel
|
||||
0385346859,The Dinner
|
||||
1520396074,Inheritance: A Psychological Mystery and Suspense Thriller
|
||||
B0002P0FFS,Lies My Teacher Told Me: Everything Your American History Textbook Got Wrong
|
||||
0028180062,The Call of the Wild with related readings
|
||||
0060794410,Good to Great CD: Why Some Companies Make the Leap.And Others Don't
|
||||
1542722829,Silent Child
|
||||
B00CYZC5S4,Anne Of Green Gables
|
||||
0060391448,Wicked: The Life and Times of the Wicked Witch of the West
|
||||
0615351913,Once We Were Brothers
|
||||
1433688670,"Fervent: A Woman's Battle Plan to Serious, Specific and Strategic Prayer"
|
||||
1472229959,The Letter
|
||||
B017WJ5PR4,"Harry Potter and the Deathly Hallows, Book 7"
|
||||
0062409883,Go Set a Watchman: A Novel
|
||||
0140434186,Wuthering Heights (Penguin Classics)
|
||||
0142428280,Fall of Giants (The Century Trilogy)
|
||||
0192831992,Ben-Hur (Oxford World's Classics)
|
||||
1475070306,UnEnchanted: An Unfortunate Fairy Tale (Unfortunate Fairy Tale;[bk. 1])
|
||||
0143170104,The Girl Who Played with Fire (Millennium Series)
|
||||
0451414128,Missing You
|
||||
0800757181,Daughter of Joy (Brides of Culdee Creek)
|
||||
0143142364,World Without End (Kingsbridge)
|
||||
1581344368,"The Holy Bible: English Standard Version, Reference Edition"
|
||||
0312364083,Firefly Lane
|
||||
1410447863,"An Invisible Thread: The True Story of an 11-Year-Old Panhandler, a Busy Sales Executive, and an Unlikely Meeting with Destiny (Wheeler Large Print Book Series)"
|
||||
0091900212,Think and Grow Rich
|
||||
0230755062,The Language of Flowers
|
||||
0692213740,In Between (A Katie Parker Production) (Volume 1)
|
||||
0975599518,Natural Cures "They" Don't Want You To Know About
|
||||
0310515025,"Seeking Allah, Finding Jesus: A Devout Muslim Encounters Christianity"
|
||||
0316346624,The Tipping Point: How Little Things Can Make a Big Difference
|
||||
1250034469,Be Careful What You Wish For: A Novel (The Clifton Chronicles)
|
||||
1250158060,Fire and Fury: Inside the Trump White House
|
||||
140883233X,Throne of Glass
|
||||
1501132938,The Woman in Cabin 10
|
||||
0062378082,The Nazi Officer's Wife: How One Jewish Woman Survived the Holocaust
|
||||
0099619105,Trump - The Art Of The Deal
|
||||
0230749259,Innocent (Will Robie series)
|
||||
0345486455,"Healthy Sleep Habits, Happy Child: A Step-by-Step Program for a Good Night's Sleep, 3rd Edition"
|
||||
1477809783,Terms of Enlistment (Frontlines)
|
||||
1484009290,Noble Beginnings: A Jack Noble Novel
|
||||
1501188291,Gwendy's Button Box: A Novella
|
||||
0132268310,The Lost Symbol (Dan Brown)
|
||||
1410478750,The Wright Brothers (Thorndike Press Large Print Popular and Narrative Nonfiction Series)
|
||||
151738799X,The Air He Breathes (Elements)
|
||||
0140283331,Lord of the Flies
|
||||
B015QPEV9E,The Call of the Wild eBook
|
||||
1477823832,The Paper Magician
|
||||
1503953866,The Secret Healer
|
||||
0061441848,Eat Right for Your Type
|
||||
B000X1MX7E,The Pillars of the Earth
|
||||
0340822775,Cloud Atlas
|
||||
1455134767,The Amateur: Barack Obama in the White House
|
||||
1463717091,Abducted
|
||||
1501110365,It Ends with Us: A Novel
|
||||
0062065246,The Round House
|
||||
0141339578,Prodigy
|
||||
0991677196,CyberStorm
|
||||
1477829865,Bum Rap (Jake Lassiter Legal Thrillers)
|
||||
0007350783,Emma (Collins Classics)
|
||||
0140390197,The Scarlet Letter: A Romance (The Penguin American Library)
|
||||
0345528670,The Aviator's Wife: A Novel
|
||||
0988348268,Jane's Melody
|
||||
1455530093,13 Hours: The Inside Account of What Really Happened In Benghazi
|
||||
0312641893,Cinder
|
||||
0316376469,"The Food Babe Way: Break Free from the Hidden Toxins in Your Food and Lose Weight, Look Years Younger, and Get Healthy in Just 21 Days!"
|
||||
0739474979,Water For Elephants
|
||||
1478230096,"Les Miserables In Plain and Simple English: Includes Study Guide, Historical Context, Biography, and Character Index"
|
||||
0061928178,Beautiful Ruins: A Novel
|
||||
0091923530,"The 4-hour Workweek: Escape the 9-5, Live Anywhere and Join the New Rich"
|
||||
0718077296,"Same Kind of Different As Me Movie Edition: A Modern-Day Slave, an International Art Dealer, and the Unlikely Woman Who Bound Them Together"
|
||||
1501228722,Crazy Little Thing (A Bell Harbor Novel)
|
||||
0143109464,Me Before You: A Novel (Movie Tie-In) (Me Before You Trilogy)
|
||||
0529120887,Jesus Calling: Enjoying Peace in His Presence
|
||||
B000LP5E8M,The God Delusion
|
||||
069289344X,Dangerous
|
||||
0857207113,A Stolen Life: A Memoir
|
||||
1460995457,The Soulkeepers (The Soulkeepers Series) (Volume 1)
|
||||
0857208691,Kill Shot (The Mitch Rapp Series)
|
||||
1442369213,Rush Revere and the First Patriots: Time-Travel Adventures With Exceptional Americans (Audio CD)
|
||||
1477829822,The Prettiest One: A Thriller
|
||||
0345807294,The Circle
|
||||
0385336667,"Persuader (Jack Reacher, No. 7)"
|
||||
0399157565,The Bone Bed (Scarpetta)
|
||||
081298840X,When Breath Becomes Air
|
||||
141047383X,Revival (Thorndike Press Large Pring Basic)
|
||||
1477830812,The Girl from Krakow: A Novel
|
||||
1896350542,Squall
|
||||
0027164403,Dear Zoo (Dear Zoo & Friends)
|
||||
0307341577,Dark Places
|
||||
0310205719,The Purpose Driven Life
|
||||
0349410828,Apprentice in Death: 43
|
||||
0449012751,The Unlikely Pilgrimage of Harold Fry: A Novel
|
||||
0451417054,The King: A Novel of the Black Dagger Brotherhood
|
||||
1943893179,Craving (Steel Brothers Saga Book 1)
|
||||
0525955100,"Home (Myron Bolitar, No. 11)"
|
||||
0615581927,Reason to Breathe: The Breathing Series (Volume 1)
|
||||
125000098X,Best Kept Secret (The Clifton Chronicles)
|
||||
147782314X,One Lavender Ribbon
|
||||
1543644325,Pandemic (Extinction Files)
|
||||
1912106949,NO EXIT a gripping thriller full of heart-stopping twists
|
||||
006226835X,Yes Please
|
||||
0307476073,Wild: From Lost to Found on the Pacific Crest Trail
|
||||
0470560770,Better Homes and Gardens New Cook Book
|
||||
148231780X,Tongue Twisters for Kids
|
||||
0141976144,"Wreck This Journal: To Create is to Destroy, Now With Even More Ways to Wreck!"
|
||||
0316225983,The Late Show
|
||||
1611735270,The Harbinger: The Ancient Mystery That Holds the Secret of America's Future (Thorndike Christian Mystery)
|
||||
0142800422,Alexander Hamilton
|
||||
0307943232,The Racketeer
|
||||
0385349947,"Lean In: Women, Work, and the Will to Lead"
|
||||
1455568872,"Crisis of Character: A White House Secret Service Officer Discloses His Firsthand Experience with Hillary, Bill, and How They Operate"
|
||||
1780674880,Enchanted Forest: An Inky Quest & Coloring Book
|
||||
0062060554,Before I Go to Sleep: A Novel
|
||||
0099134012,Time to Kill Paper If Available
|
||||
1101911921,Our Souls at Night (Vintage Contemporaries)
|
||||
1447259297,The Target
|
||||
1477820280,P.S. from Paris (US edition)
|
||||
0425273865,Captivated by You (Crossfire)
|
||||
0062454943,"The Rainbow Comes and Goes: A Mother and Son On Life, Love, and Loss"
|
||||
0143127500,One Plus One: A Novel
|
||||
0310209749,"Boundaries: When To Say Yes, How to Say No"
|
||||
0316206857,The Cuckoo's Calling (Cormoran Strike)
|
||||
0486789640,Creative Haven Creative Cats Coloring Book (Adult Coloring)
|
||||
0505527847,Trouble in Mudbug
|
||||
0060890681,The Last Anniversary: A Novel
|
||||
0393072231,The Big Short: Inside the Doomsday Machine
|
||||
0764218913,"The Essential Tozer Collection: The Pursuit of God, The Purpose of Man, and The Crucified Life"
|
||||
1494557223,Archer's Voice
|
||||
1623363586,Thug Kitchen: The Official Cookbook: Eat Like You Give a F*ck (Thug Kitchen Cookbooks)
|
||||
0001048767,Othello: Complete & Unabridged
|
||||
0099576457,"Merry Christmas, Alex Cross: (Alex Cross 19)"
|
||||
0141034262,Three Cups of Tea
|
||||
0307275639,"Tuesdays with Morrie: An Old Man, a Young Man, and Life's Greatest Lesson"
|
||||
0743572203,Liberty and Tyranny: A Conservative Manifesto
|
||||
099047982X,Fluency (Confluence)
|
||||
1410482596,Killing Reagan: The Violent Assault That Changed A Presidenc (Wheeler Publishing Large Print Hardcover)
|
||||
1477809732,The Line (Witching Savannah)
|
||||
1503936864,Blood on the Tracks (Sydney Rose Parnell)
|
||||
1939457319,The 20/20 Diet: Turn Your Weight Loss Vision Into Reality
|
||||
0446580856,Radiant Angel (A John Corey Novel)
|
||||
045141411X,Six Years
|
||||
060637387X,You Are A Badass (Turtleback School & Library Binding Edition)
|
||||
1477825975,The Neon Lawyer
|
||||
0060125314,The Odyssey of Homer
|
||||
B00006JO24,The 48 Laws of Power
|
||||
0230748228,Only Time Will Tell
|
||||
0307282961,"Twilight (The Twilight Saga, Book 1)"
|
||||
0385393938,X (A Kinsey Millhone Novel)
|
||||
0606256725,Out Of My Mind (Turtleback School & Library Binding Edition)
|
||||
0988667908,Go Pro: 7 Steps to Becoming a Network Marketing Professional
|
||||
1536617636,D DAY Through German Eyes: The Hidden Story of June 6th 1944
|
||||
0142800376,"The Gunslinger (The Dark Tower, Book 1)"
|
||||
0329258400,Harry Potter and the Prisoner of Azkaban
|
||||
0374374562,Little Humans
|
||||
0811877825,"Goodnight, Goodnight Construction Site"
|
||||
B0016L6KZ6,"City of Ashes: The Mortal Instruments, Book Two"
|
||||
0310081122,"NIV, Thinline Bible, Large Print, Imitation Leather, Brown, Red Letter Edition"
|
||||
0399173358,Full Force and Effect (Jack Ryan)
|
||||
0575081406,"The Name of the Wind (Kingkiller Chronicles, Day 1)"
|
||||
0989768414,Hardwired (The Hacker Series)
|
||||
1490527516,Nora Roberts Land (Dare Valley)
|
||||
1503941892,The Night Bird (Frost Easton)
|
||||
0143108867,After You: A Novel (Me Before You Trilogy)
|
||||
0151010196,Those Who Save Us
|
||||
031623480X,"Grain Brain: The Surprising Truth about Wheat, Carbs, and Sugar--Your Brain's Silent Killers"
|
||||
0718077954,The Wedding Dress
|
||||
080509668X,Killing Patton: The Strange Death of World War II's Most Audacious General (Bill O'Reilly's Killing Series)
|
||||
1492123595,30 Pieces of Silver
|
||||
1503935205,The Body Reader (Detective Jude Fontaine Mysteries)
|
||||
0004244079,Little Women
|
||||
0007444117,Allegiant
|
||||
0062110845,The Golem and the Jinni: A Novel (P.S.)
|
||||
0345542924,Top Secret Twenty-One (Stephanie Plum)
|
||||
0446520594,"Many Lives, Many Masters: The True Story of a Prominent Psychiatrist, His Young Patient, and the Past Life Therapy That Changed Both Their Lives"
|
||||
0553393235,The Happiest Baby on the Block; Fully Revised and Updated Second Edition: The New Way to Calm Crying and Help Your Newborn Baby Sleep Longer
|
||||
0743572750,City of Ashes (The Mortal Instruments)
|
||||
0993862500,Blood and Justice: A Private Investigator Mystery Series (A Jake & Annie Lincoln Thriller) (Volume 1)
|
||||
1629982423,"The Mystery of the Shemitah: The 3,000-Year-Old Mystery That Holds the Secret of America's Future, the World's Future, and Your Future!"
|
||||
0345534530,Empty Mansions: The Mysterious Life of Huguette Clark and the Spending of a Great American Fortune
|
||||
0345539869,Morning Star: Book 3 of the Red Rising Saga (Red Rising Series)
|
||||
1451649320,The Lake House: A Novel
|
||||
1613757808,Four Blood Moons: Something Is About to Change
|
||||
0316069515,The Gods of Guilt (A Lincoln Lawyer Novel)
|
||||
B00COF9TL0,Dad Is Fat
|
||||
0843961449,First to Kill
|
||||
1468161660,Slammed
|
||||
1503936171,Interference
|
||||
0385296479,Daughters
|
||||
030794963X,Duty: Memoirs of a Secretary at War
|
||||
031060530X,The Hiding Place
|
||||
000735083X,The Adventures of Sherlock Holmes (Collins Classics)
|
||||
006195070X,Orphan Train: A Novel
|
||||
0316176494,Life After Life: A Novel
|
||||
1477820450,The Gemini Effect
|
||||
0307886263,Is Everyone Hanging Out Without Me? (And Other Concerns)
|
||||
0316026697,The Host
|
||||
1455584916,And the Good News Is...: Lessons and Advice from the Bright Side
|
||||
1477824944,Hello Love
|
||||
0345533666,Defending Jacob: A Novel
|
||||
0451230825,Injustice For All (Joe Dillard)
|
||||
0615553028,A Hidden Fire: Elemental Mysteries Book 1
|
||||
144238820X,The Survivor (A Mitch Rapp Novel)
|
||||
1475031904,Breakthrough
|
||||
1477829407,The Einstein Prophecy
|
||||
147813223X,Louisiana Longshot: A Miss Fortune Mystery (Volume 1)
|
||||
0385541171,The Rooster Bar
|
||||
0761463275,Angelfall (Penryn & the End of Days)
|
||||
B000FK9M18,Hobbit
|
||||
0062347268,America's First Daughter: A Novel
|
||||
0316211273,Unlucky 13 (Women's Murder Club)
|
||||
0393609391,Astrophysics for People in a Hurry
|
||||
0991379667,Hudson (Fixed Series) (Volume 4)
|
||||
1481882902,Rushed
|
||||
B001HDIE3O,"What to Expect When You're Expecting, Third Edition"
|
||||
0307706591,The Scorch Trials
|
||||
0425259862,Shadow Spell (Cousins O'Dwyer)
|
||||
0230754902,Zero Day (John Puller series)
|
||||
0385353308,Station Eleven
|
||||
0544272994,What If?: Serious Scientific Answers to Absurd Hypothetical Questions
|
||||
060632416X,Joyland (Turtleback School & Library Binding Edition) (Hcc)
|
||||
0671315285,7 Habits Of Highly Effective People
|
||||
0692282343,Quantum Lens
|
||||
1503936805,Tier One (Tier One Thrillers)
|
||||
0003302245,Dracula (Collins Drama)
|
||||
0316011770,The Historian
|
||||
0307273571,A Week in Winter
|
||||
1455536253,The Guilty (Will Robie series)
|
||||
0142001740,The Secret Life of Bees
|
||||
0552778478,The Light Between Oceans: The heartbreaking Richard and Judy bestseller
|
||||
0805098542,Killing Jesus (Bill O'Reilly's Killing Series)
|
||||
0842384898,Holy Bible Text Edition NLT (Hardcover)
|
||||
1469208504,Hidden (A Bone Secrets Novel)
|
||||
0399170871,Obsession in Death
|
||||
1477824243,The Naturalist
|
||||
0007350961,Frankenstein (Collins Classics)
|
||||
0007449313,Pride & Prejudice (Collins Classics)
|
||||
0316001821,The Lovely Bones: Deluxe Edition
|
||||
1477848665,Stillhouse Lake
|
||||
1531865313,StrengthsFinder 2.0
|
||||
B017V4IPPO,"Harry Potter and the Chamber of Secrets, Book 2"
|
||||
0024181900,"The Elements of Style, Third Edition"
|
||||
0099521296,The Water's Edge
|
||||
0099911701,Cross Stitch
|
||||
030770663X,"The Death Cure (Maze Runner, Book Three) (The Maze Runner Series)"
|
||||
0312495412,First 100 Words (Bright Baby)
|
||||
0553526936,Special Circumstances
|
||||
1442360941,Walking Disaster
|
||||
1479147109,Lily Lemon Blossom Welcome to Lily's Room
|
||||
0307346609,World War Z: An Oral History of the Zombie War
|
||||
0345543246,Sycamore Row (The Jake Brigance)
|
||||
0399159347,The Husband's Secret
|
||||
0615437850,The Gray and Guilty Sea: A Garrison Gage Mystery
|
||||
0989104400,Falling Into You
|
||||
1503937461,"Sisters One, Two, Three"
|
||||
1503943925,Beach Lawyer
|
||||
0141188936,Atlas Shrugged
|
||||
0307730697,Fearless: The Undaunted Courage and Ultimate Sacrifice of Navy SEAL Team SIX Operator Adam Brown
|
||||
0375432329,The Five People You Meet in Heaven (Random House Large Print)
|
||||
0891097287,The Message: The New Testament in Contemporary English
|
||||
1477830049,The Perfect Son
|
||||
0139357432,The Underground Railroad
|
||||
0425263908,Bared to You
|
||||
0544320832,My Mother Was Nuts
|
||||
144238493X,MONEY Master the Game: 7 Simple Steps to Financial Freedom
|
||||
148261376X,The Arrangement
|
||||
1628600543,It Starts With Food: Discover the Whole30 and Change Your Life in Unexpected Ways
|
||||
0340835451,My Sister's Keeper
|
||||
0544838262,Dust (Silo Trilogy) (Volume 3)
|
||||
1449966128,A Child of A Crack Head
|
||||
0606322639,The Hit (Turtleback School & Library Binding Edition)
|
||||
1477665412,Barely Breathing: The Breathing Series (Volume 2)
|
||||
1501180126,Reasons to Vote for Democrats: A Comprehensive Guide
|
||||
0007351054,The Picture of Dorian Gray (Collins Classics)
|
||||
0316405388,Invisible
|
||||
0785289623,"Love & Respect, Special edition w/DVD"
|
||||
1477820884,The Mermaid's Sister
|
||||
0316335614,The Last Lecture
|
||||
0345505336,Hotel on the Corner of Bitter and Sweet: A Novel
|
||||
0385336675,"The Enemy (Jack Reacher, No. 8)"
|
||||
0385368267,Eleanor & Park
|
||||
054774501X,The Hangman's Daughter (Hangman's Daughter Tales) (A Hangman's Daughter Tale)
|
||||
1478121734,Love Yourself Like Your Life Depends On It
|
||||
B0000DYXQZ,The Namesake
|
||||
0007173156,"Oh, the Thinks You Can Think! Green Back Book"
|
||||
1476765340,Collide: Book One in the Collide Series
|
||||
0001050230,"Love's Labour's Lost: Performed by Derek Jacobi, Geraldine McEwan & Cast"
|
||||
0140440410,Anna Karenin
|
||||
0143129430,Thomas Jefferson and the Tripoli Pirates: The Forgotten War That Changed American History
|
||||
0143144391,The Magicians: A Novel (Magicians Trilogy)
|
||||
B002DY9LZQ,"The Devil in the White City: Murder, Magic, and Madness at the Fair That Changed America"
|
||||
1420146874,Maid for Love (Gansett Island)
|
||||
1477828737,A Dark Lure
|
||||
1503945545,The Professor (McMurtrie and Drake Legal Thrillers)
|
||||
0061257095,The Shoemaker's Wife: A Novel
|
||||
0143038419,"Eat, Pray, Love: One Woman's Search for Everything Across Italy, India and Indonesia"
|
||||
0230749283,The Forgotten
|
||||
0385349173,"Things That Matter: Three Decades of Passions, Pastimes and Politics [Deckled Edge]"
|
||||
0671447866,The Official Scrabble Players Dictionary
|
||||
0765309408,Old Man's War
|
||||
1469216051,Pines (Wayward Pines)
|
||||
1501200267,Her Final Breath (The Tracy Crosswhite Series)
|
||||
1503934993,The Temporary Agent (The Agent)
|
||||
0007433298,Portrait of a Spy
|
||||
0141043768,"What Alice Forgot: From the bestselling author of Big Little Lies, now an award winning TV series"
|
||||
0307277674,The Da Vinci Code (Robert Langdon)
|
||||
0349407762,The Obsession
|
||||
0399159894,Whiskey Beach
|
||||
0297833936,The Illustrated Hitch-hiker's Guide to the Galaxy
|
||||
034612557X,Teach Your Child to Read in 100 Easy Lessons
|
||||
1469228009,The One That Got Away
|
||||
1477820272,The Glassblower (The Glassblower Trilogy)
|
||||
0143170090,The Girl with the Dragon Tattoo
|
||||
031604461X,Breaking Dawn Special Edition (The Twilight Saga)
|
||||
0399159010,Let's Pretend This Never Happened: (A Mostly True Memoir)
|
||||
1455521299,King and Maxwell (King & Maxwell)
|
||||
0099664313,Drums of Autumn
|
||||
0140861750,"The Invisible Man (Classic, 20th-Century, Audio)"
|
||||
0141033576,"Thinking, Fast and Slow"
|
||||
0544609719,The Whole30: The 30-Day Guide to Total Health and Food Freedom
|
||||
1439199353,The Boston Girl: A Novel
|
||||
1501099027,The Mating: The Original Law of the Lycans story
|
||||
0099464462,Time Traveler's Wife
|
||||
0385257406,A Breath Of Snow And Ashes
|
||||
0525492127,Night School: A Jack Reacher Novel
|
||||
1432842323,Untitled Personal Essays (Thorndike Press Large Print Popular and Narrative Nonfiction)
|
||||
1941695078,The Vampire's Mail Order Bride (Nocturne Falls) (Volume 1)
|
||||
B00ZX99WE8,The Moonlit Garden eBook
|
||||
0316278157,The Girl With All the Gifts
|
||||
0385340559,"Bad Luck and Trouble (Jack Reacher, No. 11)"
|
||||
1476741182,Wallbanger (The Cocktail Series)
|
||||
1477827021,Tucker's Way
|
||||
1500697974,Leap
|
||||
B0082QFEZ0,Further Chronicles of Avonlea - Kindle edition
|
||||
0061042536,Gifted Hands: The Ben Carson Story
|
||||
0140373535,The Count of Monte Cristo (Puffin Classics) : Abridged
|
||||
0307877183,The Paris Wife: A Novel
|
||||
1469227886,The Bloodletter's Daughter: A Novel of Old Bohemia (Novels of Old Bohemia)
|
||||
1683990021,And Then She Was GONE: A riveting new suspense novel
|
||||
0143144626,"Lover Avenged (Black Dagger Brotherhood, Book 7)"
|
||||
0316027650,Eclipse (Twilight Sagas)
|
||||
1442369183,Rush Revere and the Brave Pilgrims: Time-Travel Adventures with Exceptional Americans
|
||||
1503947874,A Death in Sweden
|
||||
0312537409,Abandon
|
||||
141433625X,The Auschwitz Escape
|
||||
0091937523,With the Old Breed: The World War Two Pacific Classic
|
||||
0140143491,The Storyteller
|
||||
0143127527,The Book of Life: A Novel (All Souls Trilogy)
|
||||
034554305X,The Heist: A Novel (Fox and O'Hare)
|
||||
0439064864,Harry Potter and the Chamber of Secrets
|
||||
0982618492,Wired
|
||||
7208061645,The Kite Runner (Chinese Edition)
|
||||
0062073184,The English Girl
|
||||
0062316869,The Girl Who Came Home: A Novel of the Titanic (P.S.)
|
||||
0316225940,The Wrong Side of Goodbye (A Harry Bosch Novel)
|
||||
1592983073,Deadly Stillwater
|
||||
0545582881,Harry Potter and the Sorcerer's Stone (Book 1)
|
||||
0805096663,Killing Kennedy: The End of Camelot
|
||||
0307749495,The Affair: A Jack Reacher Novel
|
||||
0451216954,"Dark Lover (Black Dagger Brotherhood, Book 1)"
|
||||
0486796647,Creative Haven Owls Coloring Book (Adult Coloring)
|
||||
1439173249,Ameritopia: The Unmaking of America
|
||||
1495307352,Raw
|
||||
0008102147,The Secret Wife
|
||||
0091955106,"The Life-Changing Magic of Tidying: A simple, effective way to banish clutter forever"
|
||||
0316225886,The Crossing (A Harry Bosch Novel)
|
||||
0446691437,The War of Art: Break Through the Blocks and Win Your Inner Creative Battles
|
||||
088070909X,"On Becoming Baby Wise, Book 1"
|
||||
1477827226,Flirting with Felicity
|
||||
1503938719,"Evelyn, After: A Novel"
|
||||
1503943941,Little Boy Lost
|
||||
0451468740,No Easy Day: The Firsthand Account of the Mission that Killed Osama Bin Laden
|
||||
0671715445,What to Expect When You're Expecting
|
||||
145558651X,No Man's Land (John Puller Series)
|
||||
1477819681,The Man of Legends
|
||||
1503938778,Ocean of Storms
|
||||
B00Y21VGYW,A Death in Sweden - Kindle edition
|
||||
0099481685,Skipping Christmas
|
||||
0316210870,12th of Never (Women's Murder Club)
|
||||
1500986194,The Lost Starship
|
||||
B000BGS8T8,The Complete Sherlock Holmes (Volume One)
|
||||
0060558121,American Gods
|
||||
0345504992,The Twelve (Passage)
|
||||
0385683421,A Spool of Blue Thread
|
||||
0399168796,Gathering Prey (A Prey Novel)
|
||||
0451239350,Lover At Last: A Novel of the Black Dagger Brotherhood
|
||||
0575097418,Words of Radiance: The Stormlight Archive Book Two
|
||||
0802407692,The 5 Love Languages Military Edition: The Secret to Love That Lasts
|
||||
1410483673,Theres More To Life Than This (Thorndike Press Large Print Lifestyles)
|
||||
006019832X,Hope to Die (Matthew Scudder Mysteries)
|
||||
0091906814,How to Win Friends and Influence People
|
||||
0756410576,The Slow Regard of Silent Things (Kingkiller Chronicle)
|
||||
1492718475,Innocent in Las Vegas: A Humorous Tiffany Black Mystery (Tiffany Black Mysteries) (Volume 1)
|
||||
1683247353,Beneath a Scarlet Sky (Center Point Large Print)
|
||||
0030565073,"Holt McDougal Library, High School with Connections: Individual Reader 1984"
|
||||
0615824285,Maid for Love (The McCarthys of Gansett Island Series) (Volume 1)
|
||||
1477818243,Moving Day: A Thriller
|
||||
0061658197,The Pioneer Woman Cooks: Recipes from an Accidental Country Girl
|
||||
0062457713,The Subtle Art of Not Giving a F*ck: A Counterintuitive Approach to Living a Good Life
|
||||
0141185627,The Little Prince" and "Letter to a Hostage" (Penguin Modern Classics Translated Texts S.)
|
||||
0143127551,Everything I Never Told You
|
||||
0307582884,"The Maze Runner (Maze Runner, Book One) (The Maze Runner Series)"
|
||||
0385537859,Inferno
|
||||
0385541198,The Whistler
|
||||
1503953386,When I'm Gone: A Novel
|
||||
1939416205,A Quest of Heroes: Book #1 in the Sorcerer's Ring
|
||||
014014773X,The Things They Carried (Contemporary American Fiction)
|
||||
0141027126,War Brides
|
||||
0312850093,"The Eye of the World (The Wheel of Time, Book 1)"
|
||||
0345544978,Small Great Things: A Novel
|
||||
0395083664,The Armada (The American Heritage Library)
|
||||
0544334485,Johnny Carson
|
||||
0553418025,The Martian
|
||||
0062320084,The Heist (Gabriel Allon)
|
||||
0307749649,Never Go Back: A Jack Reacher Novel
|
||||
0316055433,The Goldfinch: A Novel (Pulitzer Prize for Fiction)
|
||||
0679444327,The Warmth of Other Suns: The Epic Story of America's Great Migration
|
||||
0988301318,Fallen Too Far
|
||||
1503948706,Say You're Sorry (Morgan Dane)
|
||||
0007925565,Moby Dick (Collins Classics)
|
||||
0140434917,The Hunting of the Snark : An Agony in Eight Fits (Penguin Classics)
|
||||
0307885151,A Short History of Nearly Everything: Special Illustrated Edition
|
||||
1444798847,The One Thing: The Surprisingly Simple Truth Behind Extraordinary Results
|
||||
1477818065,The Unwanted Wife
|
||||
1492747890,Secrets of a Side Bitch
|
||||
0007368658,The Great Gatsby (Collins Classics)
|
||||
0060786469,Love Medicine (Perennial Modern Classics)
|
||||
0143105531,The Book of Mormon (Penguin Classics)
|
||||
0310419034,"NIV, Life Application Study Bible, Large Print, Leathersoft, Pink/Purple"
|
||||
0316306797,Hollow City
|
||||
0425259854,Dark Witch (Cousins O'Dwyer)
|
||||
0241003636,Flash Boys
|
||||
0385344430,Written in My Own Heart's Blood (Outlander)
|
||||
147674355X,Hopeless
|
||||
1477818294,In Farleigh Field: A Novel of World War II
|
||||
0316056871,Bossypants
|
||||
0374360960,The Pout-Pout Fish (A Pout-Pout Fish Adventure)
|
||||
1609580834,"The Care and Keeping of You: The Body Book for Younger Girls, Revised Edition (American Girl Library)"
|
||||
0062200585,NOS4A2: A Novel
|
||||
0307932540,Notorious Nineteen: A Stephanie Plum Novel
|
||||
0316210900,Cross My Heart (Alex Cross)
|
||||
0385341008,The Guernsey Literary and Potato Peel Pie Society
|
||||
0399128298,As a Man Thinketh (Family Inspirational Library)
|
||||
1463604815,The Good Lawyer: A Novel
|
||||
1469217090,Apocalypse Z: The Beginning of the End
|
||||
1467917109,The Last Call: A Bill Travis Mystery
|
||||
147782801X,Crow Hollow
|
||||
1939962315,"The Billionaire's Obsession: The Complete Collection: Mine For Tonight, Mine For Now, Mine Forever, Mine Completely"
|
||||
0307987647,A Clash of Kings: A Song of Ice and Fire: Book Two
|
||||
141046668X,Field Of Prey (Thorndike Press Large Print Basic)
|
||||
1442365528,Red Sparrow: A Novel
|
||||
1477848150,Timebound (The Chronos Files)
|
||||
009917961X,The Rainmaker
|
||||
0345504976,The Passage: A Novel (Book One of The Passage Trilogy)
|
||||
0425259870,Blood Magick (Cousins O'Dwyer)
|
||||
1477820876,The Dead Key
|
||||
1611749271,The Art Forger
|
||||
B00Y68O6WK,Cross Justice: (Alex Cross 23) - Kindle edition
|
||||
006017322X,To Kill a Mockingbird
|
||||
0140437681,Treasure Island (Penguin Classics)
|
||||
1475143389,Bigger Leaner Stronger: The Simple Science of Building the Ultimate Male Body (The Build Healthy Muscle Series)
|
||||
1480504246,Brilliance (The Brilliance Trilogy)
|
||||
0141036249,"Outliers, The Story of Success"
|
||||
0307939693,The Orphan Master's Son: A Novel
|
||||
B017LGAKEQ,The Temporary Agent (The Agent Book 1) eBook
|
||||
1442381221,Beautiful Bastard
|
||||
0007230206,Wolf Hall (Thomas Cromwell)
|
||||
0030845742,"Brown bear, brown bear, what do you see? (A Bill Martin instant reader)"
|
||||
0060194480,A People's History of the United States: 1492 to the Present
|
||||
0310428041,"NIV Study Bible, Leathersoft, Tan/Blue, Indexed, Red Letter Edition"
|
||||
0399144676,"Tripwire (Jack Reacher, No. 3)"
|
||||
0764202677,"The Widow of Larkspur Inn (The Gresham Chronicles, Book 1)"
|
||||
0996135669,Vicious (Sinners of Saint) (Volume 1)
|
||||
000711835X,The Hobbit
|
||||
0060175400,The Poisonwood Bible
|
||||
0061969559,"I Am Number Four (Lorien Legacies, Book 1)"
|
||||
0099771519,Memoirs of a Geisha Uk
|
||||
0316098329,Room
|
||||
0399162380,Field of Prey
|
||||
0931432820,The Complete Book of Essential Oils and Aromatherapy
|
||||
1441766073,"Bonhoeffer: Pastor, Martyr, Prophet, Spy: A Righteous Gentile vs. the Third Reich"
|
||||
1503943429,A Criminal Defense (Philadelphia Legal)
|
||||
B001180MB2,Dune
|
||||
0151015392,The Princess Bride (Fox): S. Morgenstern's Classic Tale of True Love and High Adventure
|
||||
0385316917,Special Delivery
|
||||
0786965606,Player's Handbook (Dungeons & Dragons)
|
||||
1410440478,11/22/63 (Thorndike Press Large Print Core)
|
||||
0007181701,Fahrenheit 451
|
||||
0007378033,Unbroken: An Extraordinary True Story of Courage and Survival
|
||||
0062325388,Flesh and Blood CD: A Scarpetta Novel (Kay Scarpetta Series)
|
||||
0356502481,Blood Song: Book 1 of Raven's Shadow
|
||||
0385660073,The Kite Runner
|
||||
0684824906,Team of Rivals: The Political Genius of Abraham Lincoln
|
||||
0989450252,Crashed (The Driven Trilogy)
|
||||
B00ES25FBA,Night
|
||||
0091939526,"4-Hour Body An Uncommon Guide to Rapid Fat-Loss, Incredible Sex and Becoming Superhuman"
|
||||
0297859382,Gone Girl
|
||||
0571179924,Casino
|
||||
147003655X,Deadly Offerings (Volume 1)
|
||||
1491591846,Follow You Home
|
||||
B001C4VLZQ,Hobbit and Lord of the Rings Trilogy - Boxed Set of 4 Books
|
||||
0307962520,Prince Lestat
|
||||
0310330718,America the Beautiful: Rediscovering What Made This Nation Great
|
||||
0439228905,Black Beauty (Scholastic Classics)
|
||||
0446568813,Rich Dad Poor Dad (What the Rich Teach Their Kids About Money - That the Poor and Middle Class Do Not!)
|
||||
0957652232,Sleep Tight
|
||||
1477808701,Wayward (Wayward Pines)
|
||||
0007554850,The Girl with Seven Names
|
||||
0307475255,Into Thin Air: A Personal Account of the Mt. Everest Disaster
|
||||
034551162X,Aftermath: Star Wars: Journey to Star Wars: The Force Awakens
|
||||
0399159371,The Witness
|
||||
0399162372,Deadline (A Virgil Flowers Novel)
|
||||
0671015206,The Millionaire Next Door
|
||||
0758605323,"The Holy Bible: English Standard Version, Concordia Deluxe Reference Edition, ESV"
|
||||
1623156122,The Instant Pot Electric Pressure Cooker Cookbook: Easy Recipes for Fast & Healthy Meals
|
||||
0007119550,"A Storm of Swords: Part 2 Blood and Gold (A Song of Ice and Fire, Book 3)"
|
||||
0061728985,"Act Like a Lady, Think Like a Man: What Men Really Think About Love, Relationships, Intimacy, and Commitment"
|
||||
0140390316,The Jungle (The Penguin American Library)
|
||||
0641866240,The Glass Castle
|
||||
1476753164,Maybe Someday
|
||||
0062205579,A Prayer for Owen Meany
|
||||
044630557X,Upstairs at the White House
|
||||
0446547654,The Best of Me
|
||||
0451412729,In Good Faith (Joe Dillard)
|
||||
0785262180,Total Money Makeover
|
||||
1442362383,Doctor Sleep: A Novel
|
||||
B0000547HM,On Writing: A Memoir of the Craft
|
||||
031612091X,"Eat to Live: The Amazing Nutrient-Rich Program for Fast and Sustained Weight Loss, Revised Edition"
|
||||
0991140230,Bright Side
|
||||
1250010713,The Silent Sister: A Novel
|
||||
1910751774,The Girl in the Ice: A gripping serial killer thriller (Detective Erika Foster crime thriller novel) (Volume 1)
|
||||
0007271239,The Art of Racing in the Rain
|
||||
006058405X,Motor Mouth (Alex Barnaby Series #2)
|
||||
0307272591,Bad Monkey
|
||||
031218008X,One Thousand White Women: The Journals of May Dodd
|
||||
0613171373,A Child Called It: One Child's Courage To Survive (Turtleback School & Library Binding Edition)
|
||||
0800788036,Laugh-Out-Loud Jokes for Kids
|
||||
1477849734,No Ordinary Billionaire (The Sinclairs)
|
||||
000720924X,Looking for Alaska
|
||||
006073132X,Freakonomics: A Rogue Economist Explores the Hidden Side of Everything - by Steven D. Levitt & Stephen J. Dubner
|
||||
0062301233,"Elon Musk: Tesla, SpaceX, and the Quest for a Fantastic Future"
|
||||
0399157573,Dust
|
||||
0849946158,Heaven is for Real: A Little Boy's Astounding Story of His Trip to Heaven and Back
|
||||
0985777338,A Family Affair (Truth in Lies) (Volume 1)
|
||||
1492976423,Making Faces
|
||||
0002247399,A Dance with Dragons
|
||||
0982717105,Storm Clouds Rolling In
|
||||
0989450201,Driven ((The Driven Trilogy))
|
||||
0312356854,Sarah's Key
|
||||
0312655479,How the Light Gets In: A Chief Inspector Gamache Novel
|
||||
0373266154,Murder on the Mind: A Jeff Resnick Mystery
|
||||
0544264975,Hidden
|
||||
0805093079,Killing Lincoln: The Shocking Assassination that Changed America Forever (Bill O'Reilly's Killing Series)
|
||||
1439152802,The Secret Keeper: A Novel
|
||||
0061992704,Sh*t My Dad Says
|
||||
0143130609,George Washington's Secret Six: The Spy Ring That Saved the American Revolution
|
||||
0345539834,Golden Son: Book 2 of the Red Rising Saga (Red Rising Series)
|
||||
0374264260,The Silver Linings Playbook: A Novel
|
||||
1502446936,Stepbrother Dearest
|
||||
0140434968,Bleak House
|
||||
1455571156,The Fix (Memory Man series)
|
||||
0340824255,Land of Painted Caves
|
||||
1410472922,A Man Called Ove (Thorndike Press Large Print Core Series)
|
||||
1451621388,Brain on Fire: My Month of Madness
|
||||
0316349895,Career of Evil (A Cormoran Strike Novel)
|
||||
0762454970,E-Squared: Nine Do-It-Yourself Energy Experiments that Prove Your Thoughts Create Your Reality [Miniature Edition] (Miniature Editions)
|
||||
1416502491,7 Habits of Highly Effective People
|
||||
1878424319,The Four Agreements: A Practical Guide to Personal Freedom (A Toltec Wisdom Book)
|
||||
B0006EVIKG,The Armada (Easton Press)
|
||||
0007141424,The Giver (Collins Modern Classics)
|
||||
0062225448,Reconstructing Amelia: A Novel
|
||||
037543075X,The Rescue (Random House Large Print)
|
||||
0399146237,Running Blind
|
||||
0441008534,"Dead Until Dark (Sookie Stackhouse/True Blood, Book 1)"
|
||||
0451211634,Hostile Witness
|
||||
1477823476,Vanished (Callahan & McLane)
|
||||
1616440724,To Train Up a Child: Child Training for the 21st Century
|
||||
0002247437,A Feast for Crows (Song of Ice and Fire)
|
||||
0060740221,Shakespeare: The World as Stage (Eminent Lives)
|
||||
0062265423,"10% Happier: How I Tamed the Voice in My Head, Reduced Stress Without Losing My Edge, and Found Self-Help That Actually Works--A True Story"
|
||||
0340943831,Battlefield of the Mind: Winning the Battle in Your Mind
|
||||
1492291560,The Mind Readers (The Mind Readers Series)
|
||||
1503939448,Say Goodbye for Now
|
||||
1979172846,Betrayal
|
||||
0316225908,Two Kinds of Truth (A Harry Bosch Novel)
|
||||
0385689225,Born a Crime
|
||||
1250022118,A Great Reckoning: A Novel (Chief Inspector Gamache Novel)
|
||||
1477825576,My Sister's Grave (Tracy Crosswhite)
|
||||
0307743659,The Shining
|
||||
0385523394,Orange Is the New Black: My Year in a Women's Prison
|
||||
0762454873,I Declare: 31 Promises to Speak Over Your Life Running Press Miniature Edition (Miniature Editions)
|
||||
1477848355,Secondborn
|
||||
000755236X,Daniel Silva Thriller 6
|
||||
0140177388,Cannery Row
|
||||
030788743X,Ready Player One
|
||||
0062218832,Etched in Sand: A True Story of Five Siblings Who Survived an Unspeakable Childhood on Long Island
|
||||
006226303X,The Ocean at the End of the Lane CD: A Novel
|
||||
0143125842,The Signature of All Things: A Novel
|
||||
0307283666,Harry Potter and the Half-Blood Prince (Book 6)
|
||||
0312354355,The Long Way Home
|
||||
0316245283,Miss Peregrine's Home for Peculiar Children: The Graphic Novel (Miss Peregrine's Peculiar Children: The Graphic Novel)
|
||||
0030664128,Holes
|
||||
0062678418,The Woman in the Window: A Novel
|
||||
0091816971,Who Moved My Cheese?: An A-Mazing Way to Deal with Change in Your Work and in Your Life
|
||||
0399593489,The Midnight Line: A Jack Reacher Novel
|
||||
0613237528,The Perks Of Being A Wallflower (Turtleback School & Library Binding Edition)
|
||||
0765317583,One Second After (A John Matherson Novel)
|
||||
1408839121,Heir of Fireno. 3 (Throne of Glass)
|
||||
1484076249,A Shade Of Vampire 2: A Shade Of Blood
|
||||
0553292587,Dark Matter
|
||||
1556114931,Green Lake
|
||||
0062433229,Departure
|
||||
0356500950,Cold Days: A Dresden Files Novel (The Dresden Files)
|
||||
0385539258,A Little Life: A Novel
|
||||
1440072035,"Typee: A Peep at Polynesian Life, During a Four Months Residence in a Valley of the Marquesas, Vol. 1 (Classic Reprint)"
|
||||
1441731326,"The China Study, Revised and Expanded Edition: The Most Comprehensive Study of Nutrition Ever Conducted and the Startling Implications for Diet, Weight Loss, and Long-Term Health"
|
||||
1503281981,The Irish Cottage (Travel Romance Series BETH)
|
||||
1503954064,"White Rose, Black Forest"
|
||||
B0076JPX46,Where the Red Fern Grows
|
||||
0297851527,Sharp Objects
|
||||
0345542975,Tricky Twenty-Two: A Stephanie Plum Novel
|
||||
0060094273,Goodnight Moon Board Book & Baby Socks
|
||||
014242613X,Theodore Boone: The Accused
|
||||
0316225932,The Burning Room (A Harry Bosch Novel)
|
||||
0439249546,Harry Potter (4 Volumes set)
|
||||
1477822089,Trail of Broken Wings
|
||||
B001L7RCGG,Gone with the Wind
|
||||
0025853503,"Gone With the Wind, The Margaret Mitchell Anniversary Edition"
|
||||
006085880X,The Pact: A Love Story
|
||||
0399164456,The Collector
|
||||
1480522813,Guns
|
||||
0786012668,Cold Fear
|
||||
1101946342,Grey: Fifty Shades of Grey as Told by Christian (Fifty Shades of Grey Series)
|
||||
1910751243,The Girl With No Past: A gripping psychological thriller
|
||||
0006064922,The Holy Bible from the ancient Eastern text : George M. Lamsa's translations from the Aramaic of the Peshitta
|
||||
0451417089,The Shadows (Black Dagger Brotherhood)
|
||||
0525497145,A Column of Fire (Kingsbridge)
|
||||
0788844164,Sing Along Songs:Lion King - Circle
|
||||
1477820469,Miramont's Ghost
|
||||
1930448384,"The CalorieKing Calorie, Fat, & Carbohydrate Counter 2012 Larger Print Edition (Calorieking Calorie, Fat & Carbohydrate Counter (Larger Print Edition))"
|
||||
0143125478,The Boys in the Boat: Nine Americans and Their Epic Quest for Gold at the 1936 Berlin Olympics
|
||||
0307749606,A Wanted Man: A Jack Reacher Novel
|
||||
0007420412,Divergent
|
||||
097901977X,The Miracle Morning: The Not-So-Obvious Secret Guaranteed to Transform Your Life (Before 8am)
|
||||
1503933385,We're All Damaged
|
||||
0062491792,Commonwealth
|
||||
0136879721,The Power of Your Subconcious Mind
|
||||
0446612774,Long Time Coming
|
||||
0452296366,This Is Where I Leave You: A Novel
|
||||
1628600020,"Practical Paleo, 2nd Edition (Updated and Expanded): A Customized Approach to Health and a Whole-Foods Lifestyle"
|
||||
0140385622,The Diary of a Young Girl: Definitive Edition
|
||||
0307989909,Circling the Sun: A Novel
|
||||
141046900X,Mr. Mercedes
|
||||
1410493547,Killing The Rising Sun: How America Vanquished World War II Japan (Wheeler Publishing Large Print Book Series)
|
||||
B00FJ3AC10,Natchez Burning: A Novel (Penn Cage Book 4) - Kindle edition
|
||||
0307245934,The Miraculous Journey of Edward Tulane
|
||||
0751541184,The Time Keeper
|
||||
006056492X,Slaughterhouse Five
|
||||
0307280721,"Eldest (Inheritance, Book 2)"
|
||||
0425266060,Bared to You / Reflected in You / Entwined with You
|
||||
1401940676,"Dying To Be Me: My Journey from Cancer, to Near Death, to True Healing"
|
||||
1470381788,Finding Me
|
||||
1501257544,The Atlantis Plague (The Origin Mystery)
|
||||
1934193798,Great Food Fast : Bob Warden's Ultimate Pressure Cooker Recipes
|
||||
0307731715,"To Heaven and Back: A Doctor's Extraordinary Account of Her Death, Heaven, Angels, and Life Again: A True Story"
|
||||
0310435609,"NIV, Thinline Craft Collection Bible, Hardcover, Tan/Purple, Red Letter Edition"
|
||||
0316408751,14th Deadly Sin (Women's Murder Club)
|
||||
0345514408,I Know Why the Caged Bird Sings
|
||||
0345543254,Gray Mountain: A Novel
|
||||
0778316556,The Good Girl (English Edition)
|
||||
1477848827,I Am Livia
|
||||
1517028817,The Grave Man - A Sam Prichard Novel (The Sam Prichard Series) (Volume 1)
|
||||
1530126894,"The Pursuit of God: AW Tozer, Christian classics: The Pursuit of God"
|
||||
0099740915,The Handmaid's Tale (Contemporary Classics)
|
||||
0134374940,Night: With Connected Readings
|
||||
0525955097,Fool Me Once
|
||||
1455124176,The Art of Hearing Heartbeats: A Novel
|
||||
1461085977,Flat-Out Love
|
||||
1503945626,Life and Other Near-Death Experiences
|
||||
1612185304,Supreme Justice (Reeder and Rogers Thriller)
|
||||
0060899220,Kitchen Confidential Updated Edition: Adventures in the Culinary Underbelly (P.S.)
|
||||
0451414136,The Stranger
|
||||
0595440096,Still Alice
|
||||
0890425558,"Diagnostic and Statistical Manual of Mental Disorders, 5th Edition: DSM-5"
|
||||
1503933547,The Light of the Fireflies
|
||||
0263234541,Waking Up Married (Mills & Boon Hardback Romance)
|
||||
0606371192,Secret Garden: An Inky Treasure Hunt And Coloring Book (Turtleback School & Library Binding Edition)
|
||||
0615590586,The Pecan Man
|
||||
0718079183,The Magnolia Story
|
||||
0749958790,Proof of Heaven: A Neurosurgeon's Journey into the Afterlife
|
||||
1250066115,How Not to Die: Discover the Foods Scientifically Proven to Prevent and Reverse Disease
|
||||
0030554179,Animal Farm with Connections (HRW Library Study Guides)
|
||||
0743566572,City of Bones (The Mortal Instruments)
|
||||
0140277633,Easy Way to Stop Smoking
|
||||
0340820462,On Writing
|
||||
0982301820,10-Day Green Smoothie Cleanse: Lose Up to 15 Pounds in 10 Days!
|
||||
1466287047,Russo's Gold
|
||||
1501086138,Maude
|
||||
0399167447,Somewhere Safe with Somebody Good (Mitford)
|
||||
0692312374,A Crime of Passion (Joe Dillard Series Book 7) (Volume 7)
|
||||
0758278454,What She Left Behind
|
||||
1250000971,The Sins of the Father (The Clifton Chronicles)
|
||||
0006895492,Essentials of Human Anatomy and Physiology- Text Only 8th edition by Elaine N. Marieb (2006) Paperback
|
||||
0060518049,The Secret History
|
||||
0147524210,One Nation: What We Can All Do to Save America's Future
|
||||
1987987039,Code Name Camelot - A Noah Wolf Thriller (Volume 1)
|
||||
0307408868,Dead Wake: The Last Crossing of the Lusitania
|
||||
0316557994,Extinction Horizon(The Extinction Cycle Book 1)
|
||||
0340364777,It
|
||||
1592642195,The Misremembered Man
|
||||
0399160477,Command Authority (Jack Ryan)
|
||||
0425256391,Dead Ever After (Sookie Stackhouse/True Blood)
|
||||
0451482212,Between the World and Me
|
||||
0671449028,The Going-To-Bed Book
|
||||
0062270486,Spider Woman's Daughter (A Leaphorn and Chee Novel)
|
||||
0399160450,"Threat Vector (Jack Ryan, Jr.)"
|
||||
1410470997,Act Of War (Thorndike Press Large Print Core)
|
||||
1503937623,Walk Into Silence (Jo Larsen)
|
||||
1452605165,The Untethered Soul: The Journey Beyond Yourself
|
||||
1250109302,One with You (Crossfire)
|
||||
1442367636,The Liberty Amendments: Restoring the American Republic
|
||||
1499616015,"77 Days in September: A Novel of Survival, Dedication, and Love (The Kyle Tait Series) (Volume 1)"
|
||||
1501260235,The New Jim Crow: Mass Incarceration in the Age of Colorblindness
|
||||
0091948177,The Fast Metabolism Diet: Lose Up to 20 Pounds in 28 Days: Eat More Food & Lose More Weight
|
||||
144235948X,Beautiful Disaster
|
||||
1442384344,Finders Keepers: A Novel
|
||||
1492707872,Girl Jacked
|
||||
B011UNEZN8,The Last Girl (The Dominion Trilogy Book 1) eBook
|
||||
0007450664,A Song of Ice and Fire: The Story So Far (5 Volumes)
|
||||
0030554543,"Holt McDougal Library, High School with Connections: Individual Reader Narrative of the Life of Frederick Douglas"
|
||||
0671207822,"Man's Search for Meaning: An Introduction to Logotherapy, Revised and Enlarged Edition"
|
||||
0805448659,The Love Dare
|
||||
0989450236,Fueled (The Driven Trilogy)
|
||||
140885788X,A Court of Mist and Fury (Court of Thorns and Roses)
|
||||
1477817182,Out of Breath (Breathing)
|
||||
1491534583,The Afterlife of Billy Fingers: How My Bad-Boy Brother Proved to Me There's Life After Death
|
||||
1503936724,The Buried Book
|
||||
0385393997,Y is for Yesterday (A Kinsey Millhone Novel)
|
||||
0385543026,Camino Island: A Novel
|
||||
1503942767,Wives of War
|
||||
0345544943,Leaving Time (with bonus novella Larger Than Life): A Novel
|
||||
0451412656,AN Innocent Client (Joe Dillard)
|
||||
0786224681,Left Behind: A Novel of the Earth's Last Days (Left Behind #1)
|
||||
1442391235,The Japanese Lover
|
||||
0739438069,redeeming Love
|
||||
014219672X,On the Island
|
||||
0345543017,Turbo Twenty-Three: A Stephanie Plum Novel
|
||||
1469290103,Walk Me Home
|
||||
B00F8F3J2S,Duty
|
||||
0061351415,The Art of War: The New Translation (Harper Perennial Modern Classics)
|
||||
0062561723,Commonwealth CD
|
||||
0312069782,Battlefield Earth: A Saga of the Year 3000
|
||||
0316199869,NYPD Red
|
||||
0880801441,The Constitution of the United States
|
||||
0984502203,Yellow Crocus: A Novel
|
||||
1503936198,Blood Defense (Samantha Brinkman)
|
||||
1503936902,A River in Darkness: One Man's Escape from North Korea
|
||||
1786811138,The Missing Ones: An absolutely gripping thriller with a jaw-dropping twist (Detective Lottie Parker) (Volume 1)
|
||||
0345542894,Takedown Twenty (Stephanie Plum)
|
||||
091585600X,Alcoholics Anonymous: The Story of How Many Thousands of Men and Women Have Recovered from Alcoholism
|
||||
1482066300,"The Lake: (The Lake Series, Book 1)"
|
||||
1602600155,Know Your Bible: All 66 Books Explained and Applied (Value Books)
|
||||
B000K5THYU,"THE LORD OF THE RINGS Trilogy - (The Fellowship of the Ring, The Return of the Ring, The Two Towers) - 3 BOOK SET (MOVIE COVERS)"
|
||||
0988234807,"Saving Grace (What Doesn't Kill You, #1): A Katie Romantic Mystery"
|
||||
1400116554,"Empire of the Summer Moon: Quanah Parker and the Rise and Fall of the Comanches, the Most Powerful Indian Tribe in American History"
|
||||
1455540412,"Al Franken, Giant of the Senate"
|
||||
B00CLMX0D4,The Miracle Morning: The Not-So-Obvious Secret Guaranteed to Transform Your Life - Before 8AM
|
||||
0307408841,"In the Garden of Beasts: Love, Terror, and an American Family in Hitler's Berlin"
|
||||
0316339377,The Murder House
|
||||
034554398X,A Storm of Swords (HBO Tie-in Edition): A Song of Ice and Fire: Book Three
|
||||
B00005TZY5,The Universe in a Nutshell
|
||||
B00V731OIG,The English Spy
|
||||
0755361881,Until Tuesday
|
||||
0937611468,You Can Heal Your Life (Unabridged)
|
||||
1542046599,I Am Watching You
|
||||
1612181953,The Barkeep
|
||||
1943591024,The True Story of Fake News: How Mainstream Media Manipulates Millions
|
||||
0062124277,Flight Behavior: A Novel
|
||||
0312853238,Ender's Game (The Ender Quintet)
|
||||
1484015800,Dark Space
|
||||
B004N58TYW,"The Hiding Place Publisher: Blackstone Audio, Inc.; Unabridged edition"
|
||||
1986566854,Of Mice and Men
|
||||
B000GVWRVS,"Purpose-driven Life [Paperback] by Warren , Rick"
|
||||
B00A9WRH3M,Great Expectations By Charles Dickens - The Franklin Library (Hardcover - 1979)
|
||||
0143111582,Dune (Penguin Galaxy)
|
||||
0307594882,My Beloved World
|
||||
0312577222,The Nightingale: A Novel
|
||||
0316044695,Lone Survivor: The Eyewitness Account of Operation Redwing and the Lost Heroes of SEAL Team 10
|
||||
037032921X,The BOOK THIEF
|
||||
0451165209,The Richest Man in Babylon
|
||||
0553212737,Emma (Bantam Classics)
|
||||
1410458229,Ordinary Grace (Thorndike Press Large Print Mystery)
|
||||
147781826X,A Merciful Death (Mercy Kilpatrick)
|
||||
0307743683,The Stand
|
||||
0316404152,The Remaining
|
||||
1503934152,The House by the Lake
|
||||
0006280544,Mere Christianity
|
||||
0316407046,Cross Justice (Alex Cross)
|
||||
0739462911,Younger Next Year for Women - LARGE PRINT
|
||||
1433805596,Publication Manual of the American Psychological Association
|
||||
1503950255,The Short Drop (Gibson Vaughn)
|
||||
0439804078,Chicka Chicka Boom Boom
|
||||
1442384433,Code of Conduct: A Thriller
|
||||
1503939324,From Sand and Ash
|
||||
0007447868,A Feast for Crows
|
||||
0060099402,The Giving Tree with Gift Card
|
||||
0307266303,"Born to Run: A Hidden Tribe, Superathletes, and the Greatest Race the World Has Never Seen"
|
||||
0307747441,Killers of the Flower Moon: The Osage Murders and the Birth of the FBI
|
||||
044654759X,Safe Haven
|
||||
1503936821,Doubt (Caroline Auden)
|
||||
B0061YX9MU,The Book Case: A Short Story Featuring Detective John Corey
|
||||
B01CIYURJE,Instant Pot Electric Pressure Cooker Cookbook
|
||||
0316069434,The Black Box (A Harry Bosch Novel)
|
||||
0451419707,On Dublin Street (On Dublin Street Series)
|
||||
0001844423,Magician's Nephew - Folio Society Hardcover
|
||||
000726755X,Odd Hours
|
||||
0345472322,Mindset: The New Psychology of Success
|
||||
0439139600,Harry Potter And The Goblet Of Fire
|
||||
0781414024,Crazy Love: Overwhelmed by a Relentless God
|
||||
0142800805,Shadow of the Wind
|
||||
0439287197,Giraffes Can't Dance
|
||||
0547744943,Elizabeth Street
|
||||
0983492700,Irreparable Harm (Sasha McCandless Legal Thriller) (Volume 1)
|
||||
1503950778,Ghost Gifts (A Ghost Gifts Novel)
|
||||
0140012486,The Catcher in the Rye (Modern Classics S.)
|
||||
0140324623,Anne of Green Gables
|
||||
0439358078,Harry Potter And The Order Of The Phoenix
|
||||
0739431234,"Candle in the Darkness (Refiner's Fire, Book 1)"
|
||||
1410491161,My Brilliant Friend (The Neapolitan Novels)
|
||||
0099553473,Zoo (Zoo Series)
|
||||
0307387178,Into the Wild
|
||||
0439023521,The Hunger Games (Book 1)
|
||||
0451218043,"Lover Eternal (Black Dagger Brotherhood, Book 2)"
|
||||
1400203759,Love Does: Discover a Secretly Incredible Life in an Ordinary World
|
||||
1455883549,The Gifts of Imperfection: Let Go of Who You Think You're Supposed to Be and Embrace Who You Are
|
||||
0385342462,An Echo in the Bone: A Novel (Outlander)
|
||||
0425252868,A Higher Call: An Incredible True Story of Combat and Chivalry in the War-Torn Skies of World War II
|
||||
1477821937,Wreckage
|
||||
0399142533,"Killing Floor (Jack Reacher, No. 1)"
|
||||
1442360925,Agenda 21
|
||||
1514792400,Blindsided - A Thriller
|
||||
0062320165,The English Spy (Gabriel Allon)
|
||||
0307010856,The Monster at the End of This Book
|
||||
0310708257,The Jesus Storybook Bible: Every Story Whispers His Name
|
||||
0316206873,The Silkworm (A Cormoran Strike Novel)
|
||||
0812976894,Still Life with Bread Crumbs: A Novel
|
||||
0857208748,The Last Man (Mitch Rapp)
|
||||
110188696X,Troublemaker: Surviving Hollywood and Scientology
|
||||
1501215213,The Atlantis World (The Origin Mystery)
|
||||
1607105551,Sense and Sensibility (Word Cloud Classics)
|
||||
0060586133,Three Wishes: A Novel
|
||||
0307941515,The Litigators
|
||||
1503934713,The Butterfly Garden (The Collector)
|
||||
1503943372,Beneath a Scarlet Sky: A Novel
|
||||
0062107321,The Valley of Amazement
|
||||
0152056610,Little Blue Truck
|
||||
038568231X,The Girl on the Train
|
||||
0399167064,Big Little Lies
|
||||
0606365273,The Escape (Turtleback School & Library Binding Edition) (John Puller)
|
||||
0812469496,Love You Forever
|
||||
1433524724,ESV New Classic Reference Bible (Black)
|
||||
1442378182,Rush Revere and the American Revolution: Time-Travel Adventures With Exceptional Americans
|
||||
1477826106,Finding Rebecca
|
||||
1503950646,The Moonlit Garden
|
||||
1503952088,The Last Girl (The Dominion Trilogy)
|
||||
1514193159,Dawn of Wonder (The Wakening) (Volume 1)
|
||||
B00OPAJ7VO,A Shade of Vampire 2: A Shade of Blood
|
||||
0099579936,Fifty Shades of Grey
|
||||
0312330529,Shantaram: A Novel
|
||||
0312857055,"Wizard's First Rule (Sword of Truth, Book 1)"
|
||||
0007350856,The Jungle Book (Collins Classics)
|
||||
0147524199,Winter of the World: Book Two of the Century Trilogy
|
||||
0307265439,The Road
|
||||
0356500276,Storm Front (Dresden Files (Unnumbered Paperback))
|
||||
1250132363,Behind Closed Doors: A Novel
|
||||
1535197722,The Gender Game (Volume 1)
|
||||
0007155662,The Alchemist
|
||||
0099302780,"GUNS, GERMS AND STEEL - A Short History of Everybody for the Last 13,000 Years"
|
||||
0099456761,The Curious Incident of the Dog in the Night-Time
|
||||
0312169787,The Red Tent: A Novel
|
||||
0340979496,The Shack
|
||||
0340992565,Under the Dome
|
||||
0385539436,Rogue Lawyer: A Novel
|
||||
080419257X,Zealot: The Life and Times of Jesus of Nazareth
|
||||
014312577X,The Girl You Left Behind: A Novel
|
||||
0345546881,The One & Only: A Novel
|
||||
1455548987,The Edge of Never
|
||||
1477820019,Take Me With You
|
||||
1495179400,The Tumor: A Non-Legal Thriller
|
||||
014241493X,Paper Towns
|
||||
0307957837,His Dark Materials: The Golden Compass / The Subtle Knife / The Amber Spyglass
|
||||
037543318X,Angels & Demons (Random House Large Print)
|
||||
0425280101,Stars of Fortune (Guardians Trilogy)
|
||||
1410445224,Steve Jobs: A Biography
|
||||
1442366109,"Happy, Happy, Happy: My Life and Legacy as the Duck Commander"
|
||||
1479370118,Awakened (Vampire Awakenings 1) (Volume 1)
|
||||
0062429078,Pretty Girls
|
||||
0310325501,Praying Circles around Your Children
|
||||
1503950549,Justice Redeemed (Darren Street)
|
||||
1503952231,While You Were Mine
|
||||
1785770527,Silent Scream (D.I. Kim Stone)
|
||||
0007350899,A Tale of Two Cities (Collins Classics)
|
||||
0140569324,The Very Hungry Caterpillar (Picture Puffins)
|
||||
0027701301,Hatchet
|
||||
0030624266,The Wizard of Oz
|
||||
0316290033,15th Affair (Women's Murder Club)
|
||||
0374214913,Mr. Penumbra's 24-Hour Bookstore: A Novel
|
||||
0446580848,The Panther (A John Corey Novel)
|
||||
1439153663,The Kitchen House: A Novel
|
||||
144947425X,Milk and Honey
|
||||
1469291118,The Sisterhood
|
||||
0141192496,Oliver Twist (Penguin Clothbound Classics)
|
||||
0307966666,"Power of Habit, the (Lib)(CD)"
|
||||
0310321913,One Thousand Gifts: A Dare to Live Fully Right Where You Are
|
||||
0547745524,Awol on the Appalachian Trail
|
||||
1469984202,Wool - Omnibus Edition
|
||||
1517153158,Split Second
|
||||
0062372106,Down the Rabbit Hole: Curious Adventures and Cautionary Tales of a Former Playboy Bunny
|
||||
0375434321,"One Summer: America, 1927 (Random House Large Print)"
|
||||
194205209X,The Housewife Assassin's Handbook (The Housewife Assassin Series) (Volume 1)
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,500 +0,0 @@
|
||||
A1083XB66WEUA7,0692213740,4
|
||||
A1083XB66WEUA7,1492718475,4
|
||||
A10D4A1K64CXE2,0553393235,4
|
||||
A10D4A1K64CXE2,0062457713,4
|
||||
A10D4A1K64CXE2,0060094273,5
|
||||
A10HN0EH8WBMMK,0143121707,5
|
||||
A10HN0EH8WBMMK,0062409883,2
|
||||
A10HN0EH8WBMMK,0307989909,5
|
||||
A10HN0EH8WBMMK,0060518049,2
|
||||
A10HN0EH8WBMMK,038568231X,4
|
||||
A10SGV8C0KG3LN,6077547328,5
|
||||
A10SGV8C0KG3LN,0470560770,5
|
||||
A10SGV8C0KG3LN,1469228009,4
|
||||
A10SGV8C0KG3LN,1477827226,5
|
||||
A10SGV8C0KG3LN,0307582884,5
|
||||
A10SGV8C0KG3LN,1477818065,4
|
||||
A11DI9YTDOP03P,B017WJ5PR4,5
|
||||
A11DI9YTDOP03P,B017V4IPPO,5
|
||||
A11DI9YTDOP03P,0439249546,5
|
||||
A131ZILQUNCTSA,0141339578,4
|
||||
A13GJ2S168F9EN,0446520594,5
|
||||
A13GJ2S168F9EN,0446568813,5
|
||||
A13T12UGTVBNNH,0143170104,5
|
||||
A13T12UGTVBNNH,1611735270,3
|
||||
A13T12UGTVBNNH,B0076JPX46,5
|
||||
A13UUE3XMRK8YG,1475031904,5
|
||||
A13UUE3XMRK8YG,1500697974,5
|
||||
A13ZGTJ64STW4X,1542722829,4
|
||||
A13ZGTJ64STW4X,1786811138,4
|
||||
A14LL6IVVFAUGJ,0451417054,5
|
||||
A14LL6IVVFAUGJ,0451218043,5
|
||||
A14OENBC3FM2BG,1623156122,2
|
||||
A14OENBC3FM2BG,1477820469,1
|
||||
A14OENBC3FM2BG,B01CIYURJE,2
|
||||
A150TBYJQMBQ61,7208061645,4
|
||||
A150TBYJQMBQ61,0385660073,4
|
||||
A159KVMQ4TTC45,147782314X,4
|
||||
A159KVMQ4TTC45,1477820450,3
|
||||
A159KVMQ4TTC45,1469228009,4
|
||||
A159KVMQ4TTC45,1503945626,3
|
||||
A15G3FSXXZ0M8,099047982X,5
|
||||
A15G3FSXXZ0M8,1477809732,4
|
||||
A15G3FSXXZ0M8,1477829407,4
|
||||
A15HPE00GOC3WO,1477822585,5
|
||||
A15HPE00GOC3WO,0991677196,4
|
||||
A15ZFIBL0Z0GX0,1466287047,5
|
||||
A15ZFIBL0Z0GX0,0312577222,5
|
||||
A1634ZLFN36LN5,0060557818,5
|
||||
A1634ZLFN36LN5,0060558121,5
|
||||
A167DMHQREZS7N,1455530093,5
|
||||
A167DMHQREZS7N,080509668X,5
|
||||
A167DMHQREZS7N,0425252868,5
|
||||
A16JKXK45F4945,0147520762,4
|
||||
A16JKXK45F4945,006195070X,4
|
||||
A16JKXK45F4945,0099521296,5
|
||||
A16KBJHAVKVCEJ,0028180062,4
|
||||
A16KBJHAVKVCEJ,B015QPEV9E,4
|
||||
A16KBJHAVKVCEJ,006195070X,4
|
||||
A16KBJHAVKVCEJ,141433625X,5
|
||||
A16NXFZ2SOIEYU,1491598778,4
|
||||
A16NXFZ2SOIEYU,1477820876,5
|
||||
A16NXFZ2SOIEYU,1477825576,4
|
||||
A16P1CQ0YG4JO7,1503936171,2
|
||||
A16P1CQ0YG4JO7,0385368267,5
|
||||
A16P1CQ0YG4JO7,1477820876,2
|
||||
A16P1CQ0YG4JO7,0849946158,5
|
||||
A16RKEBQUNDE15,0312330529,4
|
||||
A16RKEBQUNDE15,0147524199,3
|
||||
A16TTRYBDQDXC5,B017WJ5PR4,5
|
||||
A16TTRYBDQDXC5,B017V4IPPO,5
|
||||
A16TTRYBDQDXC5,0307987647,5
|
||||
A16TTRYBDQDXC5,0002247399,5
|
||||
A16TTRYBDQDXC5,0002247437,5
|
||||
A16TTRYBDQDXC5,0307283666,5
|
||||
A16TTRYBDQDXC5,0439249546,5
|
||||
A16TTRYBDQDXC5,034554398X,5
|
||||
A16TTRYBDQDXC5,0007447868,5
|
||||
A16TTRYBDQDXC5,0439358078,5
|
||||
A16UMGBGLZHLA1,0989450252,5
|
||||
A16UMGBGLZHLA1,0989450201,5
|
||||
A16VCEP3GYUI5H,081298840X,5
|
||||
A16VCEP3GYUI5H,080509668X,5
|
||||
A16VCEP3GYUI5H,0316335614,5
|
||||
A170H8LXTPH10O,000735083X,5
|
||||
A170H8LXTPH10O,0765309408,4
|
||||
A170H8LXTPH10O,B000BGS8T8,5
|
||||
A174G8TLHC2ZFW,0615953948,5
|
||||
A174G8TLHC2ZFW,1477829865,5
|
||||
A174G8TLHC2ZFW,1477829822,5
|
||||
A174G8TLHC2ZFW,1492123595,4
|
||||
A174G8TLHC2ZFW,1477820450,3
|
||||
A174G8TLHC2ZFW,0062073184,4
|
||||
A174G8TLHC2ZFW,0141027126,4
|
||||
A174G8TLHC2ZFW,1491591846,5
|
||||
A174G8TLHC2ZFW,0345543254,5
|
||||
A174G8TLHC2ZFW,1503945626,4
|
||||
A174G8TLHC2ZFW,1612185304,5
|
||||
A174G8TLHC2ZFW,1503936198,5
|
||||
A174G8TLHC2ZFW,038568231X,4
|
||||
A174G8TLHC2ZFW,1503952231,4
|
||||
A1770KPIZC5BAZ,0385336667,4
|
||||
A1770KPIZC5BAZ,0525492127,5
|
||||
A1770KPIZC5BAZ,0385340559,3
|
||||
A1770KPIZC5BAZ,0451468740,2
|
||||
A1770KPIZC5BAZ,0399144676,4
|
||||
A17A42XU7X9YO4,1503953319,5
|
||||
A17A42XU7X9YO4,0312069782,5
|
||||
A17KVAZCV4SDEQ,0849946158,2
|
||||
A17KVAZCV4SDEQ,0060899220,5
|
||||
A17OUVDR2D0KX0,1410472922,3
|
||||
A17OUVDR2D0KX0,0385689225,5
|
||||
A17UT84AR48XZI,0143038419,4
|
||||
A17UT84AR48XZI,0007155662,5
|
||||
A17UZGLI8FHIVU,B00006JO24,5
|
||||
A17UZGLI8FHIVU,B00006JO24,5
|
||||
A17UZGLI8FHIVU,0307966666,1
|
||||
A18J44XTV61DLZ,0007141424,5
|
||||
A18J44XTV61DLZ,0030554179,5
|
||||
A18NXOJSKPOGDT,1503945545,5
|
||||
A18NXOJSKPOGDT,0297859382,5
|
||||
A18NXOJSKPOGDT,1491591846,5
|
||||
A18NXOJSKPOGDT,1477820469,5
|
||||
A18NXOJSKPOGDT,1503950255,5
|
||||
A18NXOJSKPOGDT,0307265439,3
|
||||
A18RZNW11Z01B9,1452605165,5
|
||||
A18RZNW11Z01B9,1452605165,5
|
||||
A190OSOCDM2H8O,0764218913,5
|
||||
A190OSOCDM2H8O,0439228905,5
|
||||
A190OSOCDM2H8O,0140390316,5
|
||||
A190OSOCDM2H8O,1530126894,5
|
||||
A1914ESUBEESNL,0425273865,2
|
||||
A1914ESUBEESNL,0991379667,5
|
||||
A1914ESUBEESNL,0425273865,2
|
||||
A1914ESUBEESNL,0425266060,5
|
||||
A198L0FS24RK7E,0297859382,4
|
||||
A198L0FS24RK7E,0007141424,4
|
||||
A19LUSGE47C2M5,0843961449,3
|
||||
A19LUSGE47C2M5,0062073184,5
|
||||
A19UIU65J0AQVC,1477818294,3
|
||||
A19UIU65J0AQVC,1455571156,4
|
||||
A1A0NHOV7TEBZ5,0613171373,5
|
||||
A1A0NHOV7TEBZ5,0099579936,4
|
||||
A1AAVTAPP71QK8,B017WJ5PR4,5
|
||||
A1AAVTAPP71QK8,B017V4IPPO,5
|
||||
A1AAVTAPP71QK8,0439249546,5
|
||||
A1AAXVBMX4MWVC,0312853238,5
|
||||
A1AAXVBMX4MWVC,0027701301,3
|
||||
A1AQNMHSOJVLUT,0615581927,5
|
||||
A1AQNMHSOJVLUT,0007141424,5
|
||||
A1AQNMHSOJVLUT,097901977X,5
|
||||
A1AQNMHSOJVLUT,144235948X,5
|
||||
A1AQNMHSOJVLUT,1477817182,5
|
||||
A1AQNMHSOJVLUT,B00CLMX0D4,5
|
||||
A1BBA8U54JAN9T,1503936864,5
|
||||
A1BBA8U54JAN9T,1503938778,4
|
||||
A1BIICNFWM8JWP,0147520762,3
|
||||
A1BIICNFWM8JWP,0375434542,5
|
||||
A1BIICNFWM8JWP,1520396074,5
|
||||
A1BIICNFWM8JWP,0316225983,5
|
||||
A1BIICNFWM8JWP,0393072231,5
|
||||
A1BIICNFWM8JWP,B002DY9LZQ,5
|
||||
A1BIICNFWM8JWP,0316055433,3
|
||||
A1BIICNFWM8JWP,0316225932,4
|
||||
A1BIICNFWM8JWP,0385543026,5
|
||||
A1BIICNFWM8JWP,038568231X,5
|
||||
A1BIICNFWM8JWP,B002DY9LZQ,5
|
||||
A1BIICNFWM8JWP,0312330529,5
|
||||
A1BIOJVIBZJ7FG,0316206857,5
|
||||
A1BIOJVIBZJ7FG,0316199869,3
|
||||
A1BIOJVIBZJ7FG,0399167064,5
|
||||
A1BL1JSEXBUSKZ,0307476073,5
|
||||
A1BL1JSEXBUSKZ,006017322X,3
|
||||
A1BP8Z2BKUUA0V,1683247353,4
|
||||
A1BP8Z2BKUUA0V,1503943372,4
|
||||
A1BPGCE8S1Q63K,0028180062,5
|
||||
A1BPGCE8S1Q63K,B015QPEV9E,5
|
||||
A1BSAU7YWTZJGB,1501110365,5
|
||||
A1BSAU7YWTZJGB,0758278454,4
|
||||
A1BT1G82CQX3IG,0143170104,3
|
||||
A1BT1G82CQX3IG,0451468740,5
|
||||
A1BT1G82CQX3IG,B0076JPX46,3
|
||||
A1DAPMST4M1AAL,0099911701,4
|
||||
A1DAPMST4M1AAL,0553418025,4
|
||||
A1DAPMST4M1AAL,B011UNEZN8,5
|
||||
A1DAPMST4M1AAL,0312577222,5
|
||||
A1DAPMST4M1AAL,1503952088,5
|
||||
A1DOB3T0CHWVXL,0307967115,5
|
||||
A1DOB3T0CHWVXL,0060194480,5
|
||||
A1DOB3T0CHWVXL,0099740915,4
|
||||
A1DPG1Y95TPY88,0001048767,4
|
||||
A1DPG1Y95TPY88,7208061645,5
|
||||
A1DPG1Y95TPY88,0385660073,5
|
||||
A1DQSOAIF3IZYN,0316225908,5
|
||||
A1DQSOAIF3IZYN,1442384344,5
|
||||
A1DRDTGZUGYDE3,0141328290,2
|
||||
A1DRDTGZUGYDE3,1477823832,2
|
||||
A1DRDTGZUGYDE3,0505527847,2
|
||||
A1DRDTGZUGYDE3,1490527516,2
|
||||
A1DRDTGZUGYDE3,1477824944,3
|
||||
A1DRDTGZUGYDE3,0099911701,5
|
||||
A1DRDTGZUGYDE3,147003655X,2
|
||||
A1DRDTGZUGYDE3,0141328290,2
|
||||
A1DRDTGZUGYDE3,0739438069,3
|
||||
A1DRDTGZUGYDE3,1477820019,5
|
||||
A1E408D9QFMHT9,074356619X,2
|
||||
A1E408D9QFMHT9,1503935183,2
|
||||
A1E408D9QFMHT9,1475070306,4
|
||||
A1E408D9QFMHT9,0993862500,5
|
||||
A1E408D9QFMHT9,0316069515,5
|
||||
A1E408D9QFMHT9,0385541171,5
|
||||
A1E408D9QFMHT9,1503935183,2
|
||||
A1E408D9QFMHT9,0615437850,5
|
||||
A1E408D9QFMHT9,0544320832,5
|
||||
A1E408D9QFMHT9,1477818065,3
|
||||
A1E408D9QFMHT9,0385523394,5
|
||||
A1E408D9QFMHT9,1503281981,5
|
||||
A1E408D9QFMHT9,1503937623,5
|
||||
A1E5ZAWTFDX2XJ,B000X1MX7E,2
|
||||
A1E5ZAWTFDX2XJ,B000X1MX7E,2
|
||||
A1ECB48QT6QXR1,006195070X,5
|
||||
A1ECB48QT6QXR1,0141043768,5
|
||||
A1ECB48QT6QXR1,0641866240,5
|
||||
A1EJ7WD6TJRWKT,0143038419,3
|
||||
A1EJ7WD6TJRWKT,0307966666,4
|
||||
A1F91JZ0QP46P9,0141328290,4
|
||||
A1F91JZ0QP46P9,B00EJQY4BM,2
|
||||
A1F91JZ0QP46P9,030788743X,5
|
||||
A1F91JZ0QP46P9,0141328290,4
|
||||
A1F91JZ0QP46P9,B00EJQY4BM,2
|
||||
A1FFOPGABS1W46,1683247353,4
|
||||
A1FFOPGABS1W46,1503943372,4
|
||||
A1FLCXKFP527HQ,0140390197,5
|
||||
A1FLCXKFP527HQ,0007351054,5
|
||||
A1FLCXKFP527HQ,0140437681,5
|
||||
A1FOMPFDY7U3BI,B00ES25FBA,5
|
||||
A1FOMPFDY7U3BI,0134374940,5
|
||||
A1FRWGL4ECOM9Z,0143130609,5
|
||||
A1FRWGL4ECOM9Z,0399160477,5
|
||||
A1GNX8US3AGYOL,031604461X,5
|
||||
A1GNX8US3AGYOL,0316027650,5
|
||||
A1GPORG8BYJ6HL,1433688670,5
|
||||
A1GPORG8BYJ6HL,0529120887,5
|
||||
A1GPORG8BYJ6HL,0340943831,5
|
||||
A1H3DOCWKURMKM,0743572203,5
|
||||
A1H3DOCWKURMKM,1455521299,4
|
||||
A1H3DOCWKURMKM,0399160450,5
|
||||
A1H5V1TJ1XSQ6H,0544264975,3
|
||||
A1H5V1TJ1XSQ6H,0765317583,5
|
||||
A1HGP6QO240WGA,B000X1MX7E,5
|
||||
A1HGP6QO240WGA,B000X1MX7E,5
|
||||
A1HGP6QO240WGA,0099911701,1
|
||||
A1I3LB35X224OD,0143109464,5
|
||||
A1I3LB35X224OD,0143108867,4
|
||||
A1ICCQ975XCMOM,0316225940,5
|
||||
A1ICCQ975XCMOM,1410472922,4
|
||||
A1ICCQ975XCMOM,0385539436,4
|
||||
A1ID4D68J0XTGR,1492976423,5
|
||||
A1ID4D68J0XTGR,006226303X,4
|
||||
A1IMHMJBYYSF5S,0545582881,1
|
||||
A1IMHMJBYYSF5S,0373266154,5
|
||||
A1IU5YCJ8BBQ69,B017WJ5PR4,5
|
||||
A1IU5YCJ8BBQ69,B017V4IPPO,5
|
||||
A1IU5YCJ8BBQ69,0439249546,5
|
||||
A1IYN8CZ2VQUMG,0399128298,5
|
||||
A1IYN8CZ2VQUMG,0849946158,5
|
||||
A1J08B9DAXAZVY,0575081406,2
|
||||
A1J08B9DAXAZVY,054774501X,3
|
||||
A1J08B9DAXAZVY,0982717105,1
|
||||
A1J3VV1YTDBJ45,1101946342,5
|
||||
A1J3VV1YTDBJ45,1503934713,5
|
||||
A1JBS9DH6HTZRH,0684824906,5
|
||||
A1JBS9DH6HTZRH,0345539834,5
|
||||
A1KHEHIYSI46RU,1475031904,5
|
||||
A1KHEHIYSI46RU,1500697974,5
|
||||
A1KISBM4ST9O3U,0002171856,5
|
||||
A1KISBM4ST9O3U,1613757808,5
|
||||
A1KISBM4ST9O3U,0316001821,5
|
||||
A1KISBM4ST9O3U,0024181900,5
|
||||
A1KISBM4ST9O3U,0316405388,5
|
||||
A1KISBM4ST9O3U,0316210900,5
|
||||
A1KISBM4ST9O3U,B00Y68O6WK,5
|
||||
A1KISBM4ST9O3U,B0000547HM,5
|
||||
A1KISBM4ST9O3U,0340820462,5
|
||||
A1KISBM4ST9O3U,0316407046,5
|
||||
A1KISBM4ST9O3U,0399142533,5
|
||||
A1KJBL473MFZLC,1477809732,5
|
||||
A1KJBL473MFZLC,0615553028,4
|
||||
A1KJBL473MFZLC,147782801X,4
|
||||
A1KKKR2JE1OXG4,0375434542,3
|
||||
A1KKKR2JE1OXG4,1447259297,2
|
||||
A1KKKR2JE1OXG4,0345543254,3
|
||||
A1KUPIB95Q84KW,B00714PZMQ,5
|
||||
A1KUPIB95Q84KW,B00714PZMQ,5
|
||||
A1KYPSYY4TK5AG,0375969020,5
|
||||
A1KYPSYY4TK5AG,006017322X,5
|
||||
A1KYPSYY4TK5AG,0641866240,5
|
||||
A1KYPSYY4TK5AG,1503954064,5
|
||||
A1KYPSYY4TK5AG,0310708257,5
|
||||
A1LLZVH7PUTEUT,1455134767,5
|
||||
A1LLZVH7PUTEUT,0749958790,5
|
||||
A1LOVR4PLGP9NJ,0446691437,5
|
||||
A1LOVR4PLGP9NJ,006226303X,5
|
||||
A1MB58NX8Q9GRZ,0310081122,5
|
||||
A1MB58NX8Q9GRZ,0310435609,5
|
||||
A1MBH97XJMGGME,1433688670,5
|
||||
A1MBH97XJMGGME,1477848150,5
|
||||
A1MBH97XJMGGME,1477820469,2
|
||||
A1MEVFFTB1MNX1,1455530093,5
|
||||
A1MEVFFTB1MNX1,0805098542,5
|
||||
A1N14KPDPUKWXG,0307967115,3
|
||||
A1N14KPDPUKWXG,0062409883,2
|
||||
A1N14KPDPUKWXG,1503950778,4
|
||||
A1NYPLDLIHMN7B,0141328290,5
|
||||
A1NYPLDLIHMN7B,0141328290,5
|
||||
A1O6838A2ABUBR,000735083X,5
|
||||
A1O6838A2ABUBR,B000BGS8T8,5
|
||||
A1OS11W07BLB57,1433688670,5
|
||||
A1OS11W07BLB57,0310209749,5
|
||||
A1P9WNP5AOTL25,0615953948,5
|
||||
A1P9WNP5AOTL25,0375433392,4
|
||||
A1P9WNP5AOTL25,6077547328,4
|
||||
A1P9WNP5AOTL25,0991677196,2
|
||||
A1P9WNP5AOTL25,0385336667,5
|
||||
A1P9WNP5AOTL25,0692282343,4
|
||||
A1P9WNP5AOTL25,030770663X,2
|
||||
A1P9WNP5AOTL25,0385336675,5
|
||||
A1P9WNP5AOTL25,0307582884,4
|
||||
A1P9WNP5AOTL25,1480504246,3
|
||||
A1P9WNP5AOTL25,0399146237,5
|
||||
A1P9WNP5AOTL25,0007420412,5
|
||||
A1P9WNP5AOTL25,1514193159,4
|
||||
A1PDIJPCZXXLHE,0439023521,5
|
||||
A1PEMYFU0HZJW,0147520762,4
|
||||
A1PEMYFU0HZJW,1501188291,4
|
||||
A1PEMYFU0HZJW,0446580856,4
|
||||
A1PEMYFU0HZJW,1455521299,3
|
||||
A1PEMYFU0HZJW,1592983073,1
|
||||
A1PEMYFU0HZJW,0307272591,3
|
||||
A1PEMYFU0HZJW,1250022118,4
|
||||
A1PEMYFU0HZJW,0312354355,5
|
||||
A1PEMYFU0HZJW,141046900X,4
|
||||
A1PEMYFU0HZJW,038568231X,4
|
||||
A1PEMYFU0HZJW,1785770527,3
|
||||
A1PGY2O509YOPA,6077547328,5
|
||||
A1PGY2O509YOPA,140883233X,1
|
||||
A1PGY2O509YOPA,0307706591,2
|
||||
A1PGY2O509YOPA,0307582884,5
|
||||
A1PGY2O509YOPA,0007420412,5
|
||||
A1PGY2O509YOPA,0439023521,4
|
||||
A1POIXEXQ6K4EM,0007350783,4
|
||||
A1POIXEXQ6K4EM,0553212737,4
|
||||
A1POIXEXQ6K4EM,1607105551,4
|
||||
A1Q2WP43N0SKJ1,1491598778,5
|
||||
A1Q2WP43N0SKJ1,1477822593,5
|
||||
A1Q2WP43N0SKJ1,044654759X,4
|
||||
A1Q2WP43N0SKJ1,1503934713,5
|
||||
A1QAHXQZLYHDN2,0439287197,5
|
||||
A1QAHXQZLYHDN2,0152056610,5
|
||||
A1QHQOA9GRPTGP,045141411X,4
|
||||
A1QHQOA9GRPTGP,0316069434,5
|
||||
A1QS37L3EZH54U,0307408868,5
|
||||
A1QS37L3EZH54U,0307747441,5
|
||||
A1RDGHVNW71OQD,0316228532,5
|
||||
A1RDGHVNW71OQD,0545582881,5
|
||||
A1RI3JDWWSHHIK,0140143491,5
|
||||
A1RI3JDWWSHHIK,044654759X,4
|
||||
A1RNS9XJOHEBP,0307346609,5
|
||||
A1RNS9XJOHEBP,0060558121,5
|
||||
A1RNS9XJOHEBP,0345504976,4
|
||||
A1RNS9XJOHEBP,006226303X,5
|
||||
A1RNS9XJOHEBP,0061351415,3
|
||||
A1RNS9XJOHEBP,0312857055,1
|
||||
A1RNS9XJOHEBP,0307957837,5
|
||||
A1RQZNVME1YKQD,1477848665,5
|
||||
A1RQZNVME1YKQD,0425280101,5
|
||||
A1S0MLKW9YHW9L,B017WJ5PR4,5
|
||||
A1S0MLKW9YHW9L,B017V4IPPO,5
|
||||
A1S1VUYDV3NTAY,0062320084,5
|
||||
A1S1VUYDV3NTAY,0307966666,5
|
||||
A1S85GNR84Q94B,B017WJ5PR4,5
|
||||
A1S85GNR84Q94B,B017V4IPPO,5
|
||||
A1S85GNR84Q94B,0439064864,5
|
||||
A1T5FOQUI72UFX,1492707872,5
|
||||
A1T5FOQUI72UFX,1514792400,5
|
||||
A1TCIYY3NCIFZG,0297859382,4
|
||||
A1TCIYY3NCIFZG,0007119550,5
|
||||
A1TDT5W9TTXVH2,1939457319,2
|
||||
A1TDT5W9TTXVH2,0399159347,5
|
||||
A1TTVHNYDY07EL,0375432329,4
|
||||
A1TTVHNYDY07EL,0641866240,5
|
||||
A1TUSRKT9ZBY2J,0374374562,5
|
||||
A1TUSRKT9ZBY2J,0891097287,5
|
||||
A1U0O2SY44MN3Z,0743554450,5
|
||||
A1U0O2SY44MN3Z,0375969020,5
|
||||
A1U0O2SY44MN3Z,0143109464,5
|
||||
A1U0O2SY44MN3Z,006195070X,5
|
||||
A1U0O2SY44MN3Z,0312495412,5
|
||||
A1U0TE8G5QUS8K,0575097418,5
|
||||
A1U0TE8G5QUS8K,1939416205,1
|
||||
A1U5CDU09SK2W8,1477829822,5
|
||||
A1U5CDU09SK2W8,1482066300,5
|
||||
A1U8LJ53ZH1EVH,151738799X,5
|
||||
A1U8LJ53ZH1EVH,1469228009,5
|
||||
A1U8LJ53ZH1EVH,1556114931,5
|
||||
A1UA8U939GUEJU,0143121707,5
|
||||
A1UA8U939GUEJU,0297859382,2
|
||||
A1UEAMO0GKN9GR,1683247353,5
|
||||
A1UEAMO0GKN9GR,1503953386,4
|
||||
A1UEAMO0GKN9GR,1503936902,5
|
||||
A1UEAMO0GKN9GR,1503943372,5
|
||||
A1UGORYUC6LZMQ,0099557266,5
|
||||
A1UGORYUC6LZMQ,006195070X,5
|
||||
A1UGORYUC6LZMQ,0099557266,5
|
||||
A1UGQG4RZ5KX6M,B000X1MX7E,1
|
||||
A1UGQG4RZ5KX6M,B000X1MX7E,1
|
||||
A1UODQHZY2JEOJ,1477819681,2
|
||||
A1UODQHZY2JEOJ,0312577222,5
|
||||
A1UQXEQTW65VEF,081298840X,5
|
||||
A1UQXEQTW65VEF,0142800422,5
|
||||
A1UYCEK48AN9FJ,0739453939,5
|
||||
A1UYCEK48AN9FJ,0785289623,5
|
||||
A1V1Z7QDBQ9MSP,1469227886,5
|
||||
A1V1Z7QDBQ9MSP,1477821937,4
|
||||
A1V94OK2RU2OLC,1683247353,5
|
||||
A1V94OK2RU2OLC,1477820876,4
|
||||
A1V94OK2RU2OLC,1410472922,5
|
||||
A1V94OK2RU2OLC,1503943372,5
|
||||
A1VHDO8J6GF98,7208061645,5
|
||||
A1VHDO8J6GF98,0385660073,5
|
||||
A1VPBBQAN1512I,0385296479,5
|
||||
A1VPBBQAN1512I,0758278454,5
|
||||
A1VTJE3FDUMF00,0385336675,1
|
||||
A1VTJE3FDUMF00,0399142533,1
|
||||
A1VW27RIEZ9IKC,0099557266,3
|
||||
A1VW27RIEZ9IKC,0099557266,3
|
||||
A1W3YN639CW7V7,1477822585,5
|
||||
A1W3YN639CW7V7,141047383X,5
|
||||
A1W3YN639CW7V7,060632416X,5
|
||||
A1W3YN639CW7V7,1469216051,5
|
||||
A1W3YN639CW7V7,1477808701,5
|
||||
A1W3YN639CW7V7,1442362383,5
|
||||
A1W3YN639CW7V7,141046900X,5
|
||||
A1W3YN639CW7V7,0030554179,5
|
||||
A1W3YN639CW7V7,0316044695,5
|
||||
A1WC841QYCROY3,0615351913,4
|
||||
A1WC841QYCROY3,B000X1MX7E,5
|
||||
A1WC841QYCROY3,0062065246,4
|
||||
A1WC841QYCROY3,B000X1MX7E,5
|
||||
A1WC841QYCROY3,0385296479,5
|
||||
A1WC841QYCROY3,1503953386,4
|
||||
A1WC841QYCROY3,0312069782,5
|
||||
A1WC841QYCROY3,0385539436,4
|
||||
A1WLD93M9TF77T,1463514581,5
|
||||
A1WLD93M9TF77T,1492123595,2
|
||||
A1WLD93M9TF77T,0345543246,5
|
||||
A1WLD93M9TF77T,0307932540,4
|
||||
A1WLD93M9TF77T,0984502203,3
|
||||
A1X56BCRFP0GX9,0062060554,5
|
||||
A1X56BCRFP0GX9,0399159347,5
|
||||
A1X56BCRFP0GX9,0595440096,5
|
||||
A1XCISLG77CDSG,141046668X,5
|
||||
A1XCISLG77CDSG,0399162380,5
|
||||
A1XZ8CB5U1ZSSM,0062060554,5
|
||||
A1XZ8CB5U1ZSSM,0007173156,5
|
||||
A1XZ8CB5U1ZSSM,1477818243,4
|
||||
A1XZ8CB5U1ZSSM,0297859382,4
|
||||
A1XZ8CB5U1ZSSM,038568231X,5
|
||||
A1XZ8CB5U1ZSSM,0340979496,5
|
||||
A1YNMEW855P902,0375969020,4
|
||||
A1YNMEW855P902,0615581927,4
|
||||
A1YNMEW855P902,0007420412,5
|
||||
A1YNMEW855P902,1461085977,3
|
||||
A1YQ9OHQ31XOVW,1503935310,5
|
||||
A1YQ9OHQ31XOVW,0307943232,5
|
||||
A1YQ9OHQ31XOVW,006195070X,5
|
||||
A1YQ9OHQ31XOVW,0062225448,5
|
||||
A1YQ9OHQ31XOVW,0345543254,2
|
||||
A1YQJ5DWT7TKKL,1477827021,5
|
||||
A1YQJ5DWT7TKKL,1503943941,4
|
||||
A1Z2JQMMIECK9C,0805093079,5
|
||||
A1Z2JQMMIECK9C,B00FJ3AC10,5
|
||||
A1Z2JQMMIECK9C,0984502203,5
|
||||
A1Z2JQMMIECK9C,1612181953,5
|
||||
A1Z2JQMMIECK9C,0307941515,5
|
||||
A1Z2JQMMIECK9C,038568231X,5
|
||||
A1Z6M3AOX94DEG,0316055433,5
|
||||
A1Z6M3AOX94DEG,0345544943,5
|
||||
A1Z6M3AOX94DEG,0399167064,5
|
||||
A1ZAUN0NVBCUM1,0399159010,5
|
||||
A1ZAUN0NVBCUM1,0316206873,5
|
||||
A1ZDGTSRT1BYOM,1491598778,4
|
||||
A1ZDGTSRT1BYOM,0230755062,4
|
||||
A1ZDGTSRT1BYOM,0778316556,5
|
||||
A1ZDLH8XALJCAQ,0143109464,4
|
||||
A1ZDLH8XALJCAQ,0316055433,2
|
||||
A1ZDLH8XALJCAQ,038568231X,3
|
||||
A1ZLZP6LMPUCNV,0062454943,5
|
||||
A1ZLZP6LMPUCNV,0349407762,3
|
||||
A1ZX432N5CHWQI,0141328290,5
|
||||
A1ZX432N5CHWQI,0606256725,4
|
||||
|
@@ -1,100 +0,0 @@
|
||||
A1083XB66WEUA7,0692213740,4
|
||||
A1083XB66WEUA7,1492718475,4
|
||||
A10D4A1K64CXE2,0553393235,4
|
||||
A10D4A1K64CXE2,0062457713,4
|
||||
A10D4A1K64CXE2,0060094273,5
|
||||
A10HN0EH8WBMMK,0143121707,5
|
||||
A10HN0EH8WBMMK,0062409883,2
|
||||
A10HN0EH8WBMMK,0307989909,5
|
||||
A10HN0EH8WBMMK,0060518049,2
|
||||
A10HN0EH8WBMMK,038568231X,4
|
||||
A10SGV8C0KG3LN,6077547328,5
|
||||
A10SGV8C0KG3LN,0470560770,5
|
||||
A10SGV8C0KG3LN,1469228009,4
|
||||
A10SGV8C0KG3LN,1477827226,5
|
||||
A10SGV8C0KG3LN,0307582884,5
|
||||
A10SGV8C0KG3LN,1477818065,4
|
||||
A11DI9YTDOP03P,B017WJ5PR4,5
|
||||
A11DI9YTDOP03P,B017V4IPPO,5
|
||||
A11DI9YTDOP03P,0439249546,5
|
||||
A131ZILQUNCTSA,0141339578,4
|
||||
A13GJ2S168F9EN,0446520594,5
|
||||
A13GJ2S168F9EN,0446568813,5
|
||||
A13T12UGTVBNNH,0143170104,5
|
||||
A13T12UGTVBNNH,1611735270,3
|
||||
A13T12UGTVBNNH,B0076JPX46,5
|
||||
A13UUE3XMRK8YG,1475031904,5
|
||||
A13UUE3XMRK8YG,1500697974,5
|
||||
A13ZGTJ64STW4X,1542722829,4
|
||||
A13ZGTJ64STW4X,1786811138,4
|
||||
A14LL6IVVFAUGJ,0451417054,5
|
||||
A14LL6IVVFAUGJ,0451218043,5
|
||||
A14OENBC3FM2BG,1623156122,2
|
||||
A14OENBC3FM2BG,1477820469,1
|
||||
A14OENBC3FM2BG,B01CIYURJE,2
|
||||
A150TBYJQMBQ61,7208061645,4
|
||||
A150TBYJQMBQ61,0385660073,4
|
||||
A159KVMQ4TTC45,147782314X,4
|
||||
A159KVMQ4TTC45,1477820450,3
|
||||
A159KVMQ4TTC45,1469228009,4
|
||||
A159KVMQ4TTC45,1503945626,3
|
||||
A15G3FSXXZ0M8,099047982X,5
|
||||
A15G3FSXXZ0M8,1477809732,4
|
||||
A15G3FSXXZ0M8,1477829407,4
|
||||
A15HPE00GOC3WO,1477822585,5
|
||||
A15HPE00GOC3WO,0991677196,4
|
||||
A15ZFIBL0Z0GX0,1466287047,5
|
||||
A15ZFIBL0Z0GX0,0312577222,5
|
||||
A1634ZLFN36LN5,0060557818,5
|
||||
A1634ZLFN36LN5,0060558121,5
|
||||
A167DMHQREZS7N,1455530093,5
|
||||
A167DMHQREZS7N,080509668X,5
|
||||
A167DMHQREZS7N,0425252868,5
|
||||
A16JKXK45F4945,0147520762,4
|
||||
A16JKXK45F4945,006195070X,4
|
||||
A16JKXK45F4945,0099521296,5
|
||||
A16KBJHAVKVCEJ,0028180062,4
|
||||
A16KBJHAVKVCEJ,B015QPEV9E,4
|
||||
A16KBJHAVKVCEJ,006195070X,4
|
||||
A16KBJHAVKVCEJ,141433625X,5
|
||||
A16NXFZ2SOIEYU,1491598778,4
|
||||
A16NXFZ2SOIEYU,1477820876,5
|
||||
A16NXFZ2SOIEYU,1477825576,4
|
||||
A16P1CQ0YG4JO7,1503936171,2
|
||||
A16P1CQ0YG4JO7,0385368267,5
|
||||
A16P1CQ0YG4JO7,1477820876,2
|
||||
A16P1CQ0YG4JO7,0849946158,5
|
||||
A16RKEBQUNDE15,0312330529,4
|
||||
A16RKEBQUNDE15,0147524199,3
|
||||
A16TTRYBDQDXC5,B017WJ5PR4,5
|
||||
A16TTRYBDQDXC5,B017V4IPPO,5
|
||||
A16TTRYBDQDXC5,0307987647,5
|
||||
A16TTRYBDQDXC5,0002247399,5
|
||||
A16TTRYBDQDXC5,0002247437,5
|
||||
A16TTRYBDQDXC5,0307283666,5
|
||||
A16TTRYBDQDXC5,0439249546,5
|
||||
A16TTRYBDQDXC5,034554398X,5
|
||||
A16TTRYBDQDXC5,0007447868,5
|
||||
A16TTRYBDQDXC5,0439358078,5
|
||||
A16UMGBGLZHLA1,0989450252,5
|
||||
A16UMGBGLZHLA1,0989450201,5
|
||||
A16VCEP3GYUI5H,081298840X,5
|
||||
A16VCEP3GYUI5H,080509668X,5
|
||||
A16VCEP3GYUI5H,0316335614,5
|
||||
A170H8LXTPH10O,000735083X,5
|
||||
A170H8LXTPH10O,0765309408,4
|
||||
A170H8LXTPH10O,B000BGS8T8,5
|
||||
A174G8TLHC2ZFW,0615953948,5
|
||||
A174G8TLHC2ZFW,1477829865,5
|
||||
A174G8TLHC2ZFW,1477829822,5
|
||||
A174G8TLHC2ZFW,1492123595,4
|
||||
A174G8TLHC2ZFW,1477820450,3
|
||||
A174G8TLHC2ZFW,0062073184,4
|
||||
A174G8TLHC2ZFW,0141027126,4
|
||||
A174G8TLHC2ZFW,1491591846,5
|
||||
A174G8TLHC2ZFW,0345543254,5
|
||||
A174G8TLHC2ZFW,1503945626,4
|
||||
A174G8TLHC2ZFW,1612185304,5
|
||||
A174G8TLHC2ZFW,1503936198,5
|
||||
A174G8TLHC2ZFW,038568231X,4
|
||||
A174G8TLHC2ZFW,1503952231,4
|
||||
|
@@ -1,9 +0,0 @@
|
||||
user1,0545582881,1
|
||||
user2,0545582881,5
|
||||
user3,0545582881,5
|
||||
user1,0316228532,4
|
||||
user3,0316228532,5
|
||||
user4,0316228532,5
|
||||
user1,0345807294,3
|
||||
user3,0307747441,5
|
||||
user5,0307747441,2
|
||||
|
@@ -1,300 +0,0 @@
|
||||
A1083XB66WEUA7,1492718475,4
|
||||
A10D4A1K64CXE2,0062457713,4
|
||||
A10HN0EH8WBMMK,0062409883,2
|
||||
A10SGV8C0KG3LN,0470560770,5
|
||||
A11DI9YTDOP03P,B017V4IPPO,5
|
||||
A13GJ2S168F9EN,0446568813,5
|
||||
A13T12UGTVBNNH,1611735270,3
|
||||
A13UUE3XMRK8YG,1500697974,5
|
||||
A13ZGTJ64STW4X,1786811138,4
|
||||
A14LL6IVVFAUGJ,0451218043,5
|
||||
A14OENBC3FM2BG,1477820469,1
|
||||
A150TBYJQMBQ61,0385660073,4
|
||||
A159KVMQ4TTC45,1477820450,3
|
||||
A15G3FSXXZ0M8,1477809732,4
|
||||
A15HPE00GOC3WO,0991677196,4
|
||||
A15ZFIBL0Z0GX0,0312577222,5
|
||||
A1634ZLFN36LN5,0060558121,5
|
||||
A167DMHQREZS7N,080509668X,5
|
||||
A16JKXK45F4945,006195070X,4
|
||||
A16KBJHAVKVCEJ,B015QPEV9E,4
|
||||
A16NXFZ2SOIEYU,1477820876,5
|
||||
A16P1CQ0YG4JO7,0385368267,5
|
||||
A16RKEBQUNDE15,0147524199,3
|
||||
A16TTRYBDQDXC5,B017V4IPPO,5
|
||||
A16UMGBGLZHLA1,0989450201,5
|
||||
A16VCEP3GYUI5H,080509668X,5
|
||||
A170H8LXTPH10O,0765309408,4
|
||||
A174G8TLHC2ZFW,1477829865,5
|
||||
A1770KPIZC5BAZ,0525492127,5
|
||||
A17A42XU7X9YO4,0312069782,5
|
||||
A17KVAZCV4SDEQ,0060899220,5
|
||||
A17OUVDR2D0KX0,0385689225,5
|
||||
A17UT84AR48XZI,0007155662,5
|
||||
A17UZGLI8FHIVU,0307966666,1
|
||||
A18J44XTV61DLZ,0030554179,5
|
||||
A18NXOJSKPOGDT,0297859382,5
|
||||
A190OSOCDM2H8O,0439228905,5
|
||||
A1914ESUBEESNL,0991379667,5
|
||||
A198L0FS24RK7E,0007141424,4
|
||||
A19LUSGE47C2M5,0062073184,5
|
||||
A19UIU65J0AQVC,1455571156,4
|
||||
A1A0NHOV7TEBZ5,0099579936,4
|
||||
A1AAVTAPP71QK8,B017V4IPPO,5
|
||||
A1AAXVBMX4MWVC,0027701301,3
|
||||
A1AQNMHSOJVLUT,0007141424,5
|
||||
A1BBA8U54JAN9T,1503938778,4
|
||||
A1BIICNFWM8JWP,0375434542,5
|
||||
A1BIOJVIBZJ7FG,0316199869,3
|
||||
A1BL1JSEXBUSKZ,006017322X,3
|
||||
A1BP8Z2BKUUA0V,1503943372,4
|
||||
A1BPGCE8S1Q63K,B015QPEV9E,5
|
||||
A1BSAU7YWTZJGB,0758278454,4
|
||||
A1BT1G82CQX3IG,0451468740,5
|
||||
A1DAPMST4M1AAL,0553418025,4
|
||||
A1DOB3T0CHWVXL,0060194480,5
|
||||
A1DPG1Y95TPY88,7208061645,5
|
||||
A1DQSOAIF3IZYN,1442384344,5
|
||||
A1DRDTGZUGYDE3,1477823832,2
|
||||
A1E408D9QFMHT9,1503935183,2
|
||||
A1ECB48QT6QXR1,0141043768,5
|
||||
A1EJ7WD6TJRWKT,0307966666,4
|
||||
A1F91JZ0QP46P9,B00EJQY4BM,2
|
||||
A1FFOPGABS1W46,1503943372,4
|
||||
A1FLCXKFP527HQ,0007351054,5
|
||||
A1FOMPFDY7U3BI,0134374940,5
|
||||
A1FRWGL4ECOM9Z,0399160477,5
|
||||
A1GNX8US3AGYOL,0316027650,5
|
||||
A1GPORG8BYJ6HL,0529120887,5
|
||||
A1H3DOCWKURMKM,1455521299,4
|
||||
A1H5V1TJ1XSQ6H,0765317583,5
|
||||
A1HGP6QO240WGA,0099911701,1
|
||||
A1I3LB35X224OD,0143108867,4
|
||||
A1ICCQ975XCMOM,1410472922,4
|
||||
A1ID4D68J0XTGR,006226303X,4
|
||||
A1IMHMJBYYSF5S,0373266154,5
|
||||
A1IU5YCJ8BBQ69,B017V4IPPO,5
|
||||
A1IYN8CZ2VQUMG,0849946158,5
|
||||
A1J08B9DAXAZVY,054774501X,3
|
||||
A1J3VV1YTDBJ45,1503934713,5
|
||||
A1JBS9DH6HTZRH,0345539834,5
|
||||
A1KHEHIYSI46RU,1500697974,5
|
||||
A1KISBM4ST9O3U,1613757808,5
|
||||
A1KJBL473MFZLC,0615553028,4
|
||||
A1KKKR2JE1OXG4,1447259297,2
|
||||
A1KYPSYY4TK5AG,006017322X,5
|
||||
A1LLZVH7PUTEUT,0749958790,5
|
||||
A1LOVR4PLGP9NJ,006226303X,5
|
||||
A1MB58NX8Q9GRZ,0310435609,5
|
||||
A1MBH97XJMGGME,1477848150,5
|
||||
A1MEVFFTB1MNX1,0805098542,5
|
||||
A1N14KPDPUKWXG,0062409883,2
|
||||
A1O6838A2ABUBR,B000BGS8T8,5
|
||||
A1OS11W07BLB57,0310209749,5
|
||||
A1P9WNP5AOTL25,0375433392,4
|
||||
A1PEMYFU0HZJW,1501188291,4
|
||||
A1PGY2O509YOPA,140883233X,1
|
||||
A1POIXEXQ6K4EM,0553212737,4
|
||||
A1Q2WP43N0SKJ1,1477822593,5
|
||||
A1QAHXQZLYHDN2,0152056610,5
|
||||
A1QHQOA9GRPTGP,0316069434,5
|
||||
A1QS37L3EZH54U,0307747441,5
|
||||
A1RDGHVNW71OQD,0545582881,5
|
||||
A1RI3JDWWSHHIK,044654759X,4
|
||||
A1RNS9XJOHEBP,0060558121,5
|
||||
A1RQZNVME1YKQD,0425280101,5
|
||||
A1S0MLKW9YHW9L,B017V4IPPO,5
|
||||
A1S1VUYDV3NTAY,0307966666,5
|
||||
A1S85GNR84Q94B,B017V4IPPO,5
|
||||
A1T5FOQUI72UFX,1514792400,5
|
||||
A1TCIYY3NCIFZG,0007119550,5
|
||||
A1TDT5W9TTXVH2,0399159347,5
|
||||
A1TTVHNYDY07EL,0641866240,5
|
||||
A1TUSRKT9ZBY2J,0891097287,5
|
||||
A1U0O2SY44MN3Z,0375969020,5
|
||||
A1U0TE8G5QUS8K,1939416205,1
|
||||
A1U5CDU09SK2W8,1482066300,5
|
||||
A1U8LJ53ZH1EVH,1469228009,5
|
||||
A1UA8U939GUEJU,0297859382,2
|
||||
A1UEAMO0GKN9GR,1503953386,4
|
||||
A1UGORYUC6LZMQ,006195070X,5
|
||||
A1UODQHZY2JEOJ,0312577222,5
|
||||
A1UQXEQTW65VEF,0142800422,5
|
||||
A1UYCEK48AN9FJ,0785289623,5
|
||||
A1V1Z7QDBQ9MSP,1477821937,4
|
||||
A1V94OK2RU2OLC,1477820876,4
|
||||
A1VHDO8J6GF98,0385660073,5
|
||||
A1VPBBQAN1512I,0758278454,5
|
||||
A1VTJE3FDUMF00,0399142533,1
|
||||
A1W3YN639CW7V7,141047383X,5
|
||||
A1WC841QYCROY3,B000X1MX7E,5
|
||||
A1WLD93M9TF77T,1492123595,2
|
||||
A1X56BCRFP0GX9,0399159347,5
|
||||
A1XCISLG77CDSG,0399162380,5
|
||||
A1XZ8CB5U1ZSSM,0007173156,5
|
||||
A1YNMEW855P902,0615581927,4
|
||||
A1YQ9OHQ31XOVW,0307943232,5
|
||||
A1YQJ5DWT7TKKL,1503943941,4
|
||||
A1Z2JQMMIECK9C,B00FJ3AC10,5
|
||||
A1Z6M3AOX94DEG,0345544943,5
|
||||
A1ZAUN0NVBCUM1,0316206873,5
|
||||
A1ZDGTSRT1BYOM,0230755062,4
|
||||
A1ZDLH8XALJCAQ,0316055433,2
|
||||
A1ZLZP6LMPUCNV,0349407762,3
|
||||
A1ZX432N5CHWQI,0606256725,4
|
||||
A20E8HIPZ0HT2O,0316176494,4
|
||||
A20LHSAUWUG1TA,1469291118,4
|
||||
A20RCL83U809H8,0385541198,5
|
||||
A20TEBJLX1UWH4,0446568813,5
|
||||
A20V39SPYTDHHW,0545582881,5
|
||||
A2195FCGAJ73B8,0140390316,5
|
||||
A21HPTRNX6YA70,0141188936,4
|
||||
A21IV2M914F0V0,B000FK9M18,5
|
||||
A21M5XIX2MJHEJ,0297859382,1
|
||||
A21VUPOJEX5FWD,0345543246,2
|
||||
A221QWSGPRZ9Q9,0425263908,4
|
||||
A22OOPQATY3ZQU,0399162380,3
|
||||
A22X02NQMFQZUM,1250158060,5
|
||||
A23E8UF0JJQA73,0340364777,4
|
||||
A23VDUNJ752D0S,0307408841,4
|
||||
A25AZXLUQC00VX,147782801X,3
|
||||
A25NO0QJL9KMX7,0316044695,5
|
||||
A25PW1GOABO2ZS,0891097287,5
|
||||
A25U8HW354SFYD,0553526936,5
|
||||
A26RJBEYPYLGRW,0439023521,4
|
||||
A26Y6PFQODRI4V,1477823832,5
|
||||
A27059HN36AALJ,141046900X,4
|
||||
A27C3DO08AXCZS,037032921X,5
|
||||
A27KNPHGFZBQFF,0307749606,4
|
||||
A27ZXMNRCTWFOZ,1410472922,1
|
||||
A283W1V5YX1X4U,0985777338,5
|
||||
A289XKGD1WFWVH,1451621388,4
|
||||
A28FP9QJ8SI5H5,0316056871,5
|
||||
A28G2DF43IAGY5,0099911701,5
|
||||
A28LXAQTE5KEJX,1439173249,5
|
||||
A29QN3TMA21B5O,1501228722,5
|
||||
A2A8KQSD4U6RDX,0062270486,5
|
||||
A2AC6CLAMGT6OL,1439152802,5
|
||||
A2AIRPJZ8KRBEZ,0451211634,5
|
||||
A2AOH00PG2EIR0,1612181953,4
|
||||
A2B52XI1CIYUBN,0060558121,2
|
||||
A2B7VK7C5QGILU,030788743X,3
|
||||
A2BB2XHWO4XCME,0545582881,4
|
||||
A2BJ1AHFYLCJNR,1503935205,2
|
||||
A2BTCZNNU8HUNU,0385537859,4
|
||||
A2BVPIYZQEF6AF,0312354355,4
|
||||
A2BXSKPAO8LZ8A,1477848665,5
|
||||
A2BYPK55DSNDBS,0805096663,1
|
||||
A2C5EAT21ZSGA9,1477829407,4
|
||||
A2CE8K4YCSE27G,0091906814,5
|
||||
A2D5MKY23PKLR7,0545582881,5
|
||||
A2DA14LDK4Q22D,1683247353,5
|
||||
A2DC75RV1R2KBA,0007368658,5
|
||||
A2DIQWMRBQTKQN,1455568872,5
|
||||
A2E0L063K77T0Q,0060558121,5
|
||||
A2E21VW3ERCTRH,009917961X,4
|
||||
A2F00CZXC9VT40,0030554179,3
|
||||
A2F8OFYD37UY6L,1556114931,3
|
||||
A2FBFF0ZKJVE4Q,038568231X,3
|
||||
A2FBWBYVUNX5O3,B000FK9M18,4
|
||||
A2FWE24HHJ060W,B017V4IPPO,3
|
||||
A2FYJ1U4FTAQ2F,0007378033,5
|
||||
A2FZEFCGLJI39P,0143108867,3
|
||||
A2FZZX6PDGJN5T,0552778478,3
|
||||
A2G9J6KBTCQIM1,0843961449,4
|
||||
A2GC4V0KX1C1TY,0988234807,5
|
||||
A2GU6W82ZGDA9X,0606365273,4
|
||||
A2HCEBKF6W654P,1410472922,4
|
||||
A2HF8DTQC307W6,0385537859,4
|
||||
A2HIO5VU6WNS2X,0988234807,5
|
||||
A2HLHOV170YKEL,0345544978,5
|
||||
A2I5HCQ4VS5F0W,0786012668,4
|
||||
A2I5XW4FXH3RFQ,0606365273,5
|
||||
A2ID1L7P9YYPKY,038568231X,3
|
||||
A2IK9KEWJE4ARH,0345544943,5
|
||||
A2IOFMH1WSYK1Y,0307749649,4
|
||||
A2IV73MSIV394Z,044630557X,5
|
||||
A2IW9QY6REVFRP,0141034262,5
|
||||
A2J4LHIPUYJG2,0553418025,5
|
||||
A2J5557JADGW8A,031604461X,5
|
||||
A2J7M7HKJ3JS5S,0316056871,5
|
||||
A2JABOYB5SBD4R,0001050230,5
|
||||
A2JF9VE60I6FSY,000755236X,5
|
||||
A2JFV0F85OTOPD,1433524724,4
|
||||
A2JVQYESSU7PTZ,0758605323,2
|
||||
A2JVV2YKZJI2IA,0385537859,5
|
||||
A2KHG0OU7KK5S5,0451412656,5
|
||||
A2KHLFZN6KEQ6M,0761463275,4
|
||||
A2KR0JVZO8S5G0,1500697974,1
|
||||
A2L8JD26QFHBH1,0008102147,4
|
||||
A2LQ2YEDKFTFZ6,0263234541,2
|
||||
A2N0H1XJHHY1LG,0805093079,5
|
||||
A2N3F8LN22TCJA,0307989909,5
|
||||
A2O17F8NJ9K4DF,0312537409,5
|
||||
A2O1Q2LP378W49,0989450201,5
|
||||
A2O6GHKAM4MQ3Y,0545582881,5
|
||||
A2ODKHNAVQV9RS,0425252868,5
|
||||
A2OH2B87QPROAE,1441731326,5
|
||||
A2OSVMDAAZ8UAR,B000BGS8T8,5
|
||||
A2OUBXLFKXWBDD,0316001821,4
|
||||
A2OYV7779V7SYN,0345542924,5
|
||||
A2P6GYT0C7XA03,1469984202,5
|
||||
A2P6QCZWW3H1X6,0099579936,2
|
||||
A2P8JVRXW5IK06,0451165209,5
|
||||
A2P9FK07ITFAC3,0007350899,5
|
||||
A2P9GK6G6I9DLM,0545582881,5
|
||||
A2PBIA3R0E7PIL,0007368658,1
|
||||
A2PEWQLNMPOSXS,1449966128,5
|
||||
A2R00FRL5V5K80,1466287047,4
|
||||
A2R7R7CWHE35Z6,0525492127,5
|
||||
A2RBLZC3MJ5FNM,0843961449,5
|
||||
A2RL8MAKJP7NMN,0316055433,5
|
||||
A2RYY40Y9DMBJN,0385257406,5
|
||||
A2S141YV97V9I8,0545582881,5
|
||||
A2SE5DQL94TUR7,1477826106,5
|
||||
A2TAFLD4HZ66II,1503939308,4
|
||||
A2TIDCINAVYN33,1442362383,5
|
||||
A2TIID72931JQF,0505527847,4
|
||||
A2TJL20K3BGJ8C,0316339377,4
|
||||
A2USDT9S7MAQEO,0613171373,2
|
||||
A2V15KFD2AIKTP,0307932540,5
|
||||
A2V5CHSJOIMS8D,1477825576,4
|
||||
A2VFB4ADWJYVIO,0307967115,5
|
||||
A2VGP1I785W4YW,0449012751,5
|
||||
A2VHHPTF03MPGE,1101946342,1
|
||||
A2VIHA1MD1PHEK,B017V4IPPO,5
|
||||
A2VJ8FUV9J3G2B,1503934713,5
|
||||
A2VNAW97TZA11L,0749958790,3
|
||||
A2VXZQUAQM66SL,1477848150,4
|
||||
A2W7NKQMF80AVD,006226303X,5
|
||||
A2W8RW2XHKR9I,1410472922,5
|
||||
A2WQWLAL8VHC1B,0764218913,3
|
||||
A2WS4Y7NJRRQTU,0002247437,2
|
||||
A2WSFFXENAUBXT,0399128298,5
|
||||
A2WVYTY7EZEDMD,1477825576,5
|
||||
A2X35BQV3DJ4QA,1501200267,5
|
||||
A2XOON634EZW4M,0575097418,5
|
||||
A2XSTAN2QNAV1L,0316055433,1
|
||||
A2Y0D709WISMJX,0739474979,5
|
||||
A2Y6RJR3VDDPST,0375434542,3
|
||||
A2Y9HLADYV4A6F,0307476073,5
|
||||
A2YFND2I35JXIO,1477824944,3
|
||||
A2YJNH6X6I2QPV,1401940676,5
|
||||
A2ZKGPDO93TWRR,0142800805,3
|
||||
A2ZVETF78CVNO2,1477821937,5
|
||||
A302DPQQH4FKTZ,0062316869,5
|
||||
A303VNW2CSJYBI,110188696X,4
|
||||
A30FONF59YYBQX,7208061645,5
|
||||
A30HPKL3XLXJGX,0312655479,5
|
||||
A30KH532DSTET2,0143111582,5
|
||||
A30Y6B4FBORW46,141046900X,5
|
||||
A31OWT5JT6V1KY,1477822089,3
|
||||
A31QSJWU0FQRES,0316044695,5
|
||||
A31T3OMZRCDVS9,1477848827,2
|
||||
A32H5AISNB39P0,0692282343,3
|
||||
A32XDVGUL7D3M9,B017V4IPPO,5
|
||||
A33C26IKKXA1G,0141043768,5
|
||||
A33NDI6YIK6HQX,0142428280,5
|
||||
A33P1TUQM63UUM,0307408868,5
|
||||
A33RRGPKVBWTXC,0345514408,5
|
||||
A33V0DALFQ1B54,054774501X,4
|
||||
|
@@ -1,201 +0,0 @@
|
||||
"""CSC111 Winter 2022 Prep 10: Programming Exercises
|
||||
|
||||
Instructions (READ THIS FIRST!)
|
||||
===============================
|
||||
|
||||
This module contains the mergesort algorithm from the prep readings, as well as a few
|
||||
additional functions for you to implement.
|
||||
|
||||
We have marked each place you need to write code with the word "TODO".
|
||||
As you complete your work in this file, delete each TODO comment.
|
||||
|
||||
You may add additional doctests, but they will not be graded. You should test your work
|
||||
carefully before submitting it!
|
||||
|
||||
Copyright and Usage Information
|
||||
===============================
|
||||
|
||||
This file is provided solely for the personal and private use of students
|
||||
taking CSC111 at the University of Toronto St. George campus. All forms of
|
||||
distribution of this code, whether as given or with any changes, are
|
||||
expressly prohibited. For more information on copyright for CSC111 materials,
|
||||
please consult our Course Syllabus.
|
||||
|
||||
This file is Copyright (c) 2022 Mario Badr and David Liu.
|
||||
"""
|
||||
|
||||
|
||||
def mergesort(lst: list) -> list:
|
||||
"""Return a new sorted list with the same elements as lst.
|
||||
|
||||
This is a *non-mutating* version of mergesort; it does not mutate the
|
||||
input list.
|
||||
|
||||
>>> mergesort([10, 2, 5, -6, 17, 10])
|
||||
[-6, 2, 5, 10, 10, 17]
|
||||
"""
|
||||
if len(lst) < 2:
|
||||
return lst.copy() # Use the list.copy method to return a new list object
|
||||
else:
|
||||
# Divide the list into two parts, and sort them recursively.
|
||||
mid = len(lst) // 2
|
||||
left_sorted = mergesort(lst[:mid])
|
||||
right_sorted = mergesort(lst[mid:])
|
||||
|
||||
# Merge the two sorted halves. Using a helper here!
|
||||
return _merge(left_sorted, right_sorted)
|
||||
|
||||
|
||||
def _merge(lst1: list, lst2: list) -> list:
|
||||
"""Return a sorted list with the elements in lst1 and lst2.
|
||||
|
||||
Preconditions:
|
||||
- is_sorted(lst1)
|
||||
- is_sorted(lst2)
|
||||
|
||||
>>> _merge([-1, 3, 7, 10], [-3, 0, 2, 6])
|
||||
[-3, -1, 0, 2, 3, 6, 7, 10]
|
||||
"""
|
||||
i1, i2 = 0, 0
|
||||
sorted_so_far = []
|
||||
|
||||
while i1 < len(lst1) and i2 < len(lst2):
|
||||
# Loop invariant:
|
||||
# sorted_so_far is a merged version of lst1[:i1] and lst2[:i2]
|
||||
assert sorted_so_far == sorted(lst1[:i1] + lst2[:i2])
|
||||
|
||||
if lst1[i1] <= lst2[i2]:
|
||||
sorted_so_far.append(lst1[i1])
|
||||
i1 += 1
|
||||
else:
|
||||
sorted_so_far.append(lst2[i2])
|
||||
i2 += 1
|
||||
|
||||
# When the loop is over, either i1 == len(lst1) or i2 == len(lst2)
|
||||
assert i1 == len(lst1) or i2 == len(lst2)
|
||||
|
||||
# In either case, the remaining unmerged elements can be concatenated to sorted_so_far.
|
||||
if i1 == len(lst1):
|
||||
return sorted_so_far + lst2[i2:]
|
||||
else:
|
||||
return sorted_so_far + lst1[i1:]
|
||||
|
||||
|
||||
################################################################################
|
||||
# Prep exercises
|
||||
################################################################################
|
||||
def merge_indexed(lst: list, m: int) -> list:
|
||||
"""Return a sorted list containing the items in lst.
|
||||
|
||||
This function should use the same algorithm as the _merge helper function,
|
||||
with the two "sorted lists" being lst[:m] and lst[m:].
|
||||
Don't use built-in sorting functions or other list operations; follow the
|
||||
implementation of _merge as closely as possible. You don't need to copy over
|
||||
the loop invariant, although you may find it helpful to do so.
|
||||
|
||||
Note that this function is public, as we are importing and testing it directly.
|
||||
|
||||
Preconditions:
|
||||
- 0 <= m < len(lst)
|
||||
- is_sorted_sublist(lst, 0, m)
|
||||
- is_sorted_sublist(lst, m, len(lst))
|
||||
|
||||
(You're welcome to copy over your implementation of is_sorted_sublist from last week's
|
||||
prep; if you don't, PythonTA will just ignore the last two preconditions.)
|
||||
|
||||
>>> lst = [10, 20, 30, 4, 15, 16, 99]
|
||||
>>> merge_indexed(lst, 3) # sorted sublists are lst[:3] and lst[3:]
|
||||
[4, 10, 15, 16, 20, 30, 99]
|
||||
"""
|
||||
i1, i2 = 0, m
|
||||
sorted_so_far = []
|
||||
|
||||
while i1 < m and i2 < len(lst):
|
||||
# Loop invariant:
|
||||
# sorted_so_far is a merged version of lst1[:i1] and lst2[:i2]
|
||||
assert sorted_so_far == sorted(lst[:i1] + lst[m:i2])
|
||||
|
||||
if lst[i1] <= lst[i2]:
|
||||
sorted_so_far.append(lst[i1])
|
||||
i1 += 1
|
||||
else:
|
||||
sorted_so_far.append(lst[i2])
|
||||
i2 += 1
|
||||
|
||||
# When the loop is over, either i1 or i2 reached the end
|
||||
assert i1 == m or i2 == len(lst)
|
||||
|
||||
# In either case, the remaining unmerged elements can be concatenated to sorted_so_far.
|
||||
return sorted_so_far + (lst[i2:] if i1 == m else lst[i1:m])
|
||||
|
||||
|
||||
def merge_sublists(lst: list, b: int, m: int, e: int) -> None:
|
||||
"""Merge two sorted sublists in lst into one sorted sublist.
|
||||
|
||||
This is similar to merge_indexed, except:
|
||||
- The two sublists are now lst[b:m] and lst[m:e]
|
||||
- Rather than returning a new list, this function mutates lst so that
|
||||
lst[b:e] is a sorted version of the two previous sublists.
|
||||
|
||||
Preconditions:
|
||||
- 0 <= b <= m <= e < len(lst)
|
||||
- is_sorted_sublist(lst, b, m)
|
||||
- is_sorted_sublist(lst, m, e)
|
||||
|
||||
>>> lst = [100, 3, 10, 16, 2, 11, 20, 30, -1]
|
||||
>>> merge_sublists(lst, 1, 4, 8) # sorted sublists are lst[1:4] and lst[4:8]
|
||||
>>> lst # Note that the 100 and -1 aren't affected.
|
||||
[100, 2, 3, 10, 11, 16, 20, 30, -1]
|
||||
>>> merge_sublists(lst, 3, 3, 3)
|
||||
>>> lst # No change
|
||||
[100, 2, 3, 10, 11, 16, 20, 30, -1]
|
||||
>>> lst = [100, 10, 20, 30, 4, 15, 16, 99, -1]
|
||||
>>> merge_sublists(lst, 1, 4, 8)
|
||||
>>> lst
|
||||
[100, 4, 10, 15, 16, 20, 30, 99, -1]
|
||||
|
||||
IMPORTANT implementation note: even though this function doesn't return a new list,
|
||||
you can still create a new local list object to do the merging, and then copy the
|
||||
contents back to lst[b:e] when you're done. This means that this algorithm won't be
|
||||
in-place (since it creates a list object of non-constant size), but that's okay.
|
||||
It's actually very complex to try to implement this function in an in-place way,
|
||||
just like it's hard to implement an in-place mergesort.
|
||||
|
||||
As with merge_indexed, you should not use built-in sorting functions or other list
|
||||
methods, but instead follow the implementation of _merge as closely as possible.
|
||||
You may, but are not required to, assign to a list slice, e.g. lst[0:10] = ...
|
||||
"""
|
||||
i1, i2 = b, m
|
||||
sorted_so_far = []
|
||||
|
||||
while i1 < m and i2 < e:
|
||||
# Loop invariant:
|
||||
# sorted_so_far is a merged version of lst1[:i1] and lst2[:i2]
|
||||
assert sorted_so_far == sorted(lst[b:i1] + lst[m:i2])
|
||||
|
||||
if lst[i1] <= lst[i2]:
|
||||
sorted_so_far.append(lst[i1])
|
||||
i1 += 1
|
||||
else:
|
||||
sorted_so_far.append(lst[i2])
|
||||
i2 += 1
|
||||
|
||||
# When the loop is over, either i1 or i2 reached the end
|
||||
assert i1 == m or i2 == e
|
||||
|
||||
# Assign slice
|
||||
lst[b:e] = sorted_so_far + (lst[i2:e] if i1 == m else lst[i1:m])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import python_ta.contracts
|
||||
python_ta.contracts.check_all_contracts()
|
||||
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
|
||||
import python_ta
|
||||
python_ta.check_all(config={
|
||||
'max-line-length': 100,
|
||||
'disable': ['E1136']
|
||||
})
|
||||
@@ -1,254 +0,0 @@
|
||||
"""CSC111 Winter 2022 Prep 8: Programming Exercises
|
||||
|
||||
Instructions (READ THIS FIRST!)
|
||||
===============================
|
||||
|
||||
This module contains the graph implementation we studied in lecture, with a few
|
||||
additional methods for you to implement on this exercise.
|
||||
|
||||
We have marked each place you need to write code with the word "TODO".
|
||||
As you complete your work in this file, delete each TODO comment.
|
||||
|
||||
You may add additional doctests, but they will not be graded. You should test your work
|
||||
carefully before submitting it!
|
||||
|
||||
Copyright and Usage Information
|
||||
===============================
|
||||
|
||||
This file is provided solely for the personal and private use of students
|
||||
taking CSC111 at the University of Toronto St. George campus. All forms of
|
||||
distribution of this code, whether as given or with any changes, are
|
||||
expressly prohibited. For more information on copyright for CSC111 materials,
|
||||
please consult our Course Syllabus.
|
||||
|
||||
This file is Copyright (c) 2022 Mario Badr and David Liu.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
from typing import Any
|
||||
|
||||
|
||||
class Graph:
|
||||
"""A graph.
|
||||
"""
|
||||
# Private Instance Attributes:
|
||||
# - _vertices:
|
||||
# A collection of the vertices contained in this graph.
|
||||
# Maps item to _Vertex object.
|
||||
_vertices: dict[Any, _Vertex]
|
||||
|
||||
def __init__(self) -> None:
|
||||
"""Initialize an empty graph (no vertices or edges)."""
|
||||
self._vertices = {}
|
||||
|
||||
def add_vertex(self, item: Any) -> None:
|
||||
"""Add a vertex with the given item to this graph.
|
||||
|
||||
The new vertex is not adjacent to any other vertices.
|
||||
"""
|
||||
self._vertices[item] = _Vertex(item, set())
|
||||
|
||||
def add_edge(self, item1: Any, item2: Any) -> None:
|
||||
"""Add an edge between the two vertices with the given items in this graph.
|
||||
|
||||
Raise a ValueError if item1 or item2 do not appear as vertices in this graph.
|
||||
|
||||
Preconditions:
|
||||
- item1 != item2
|
||||
"""
|
||||
if item1 in self._vertices and item2 in self._vertices:
|
||||
v1 = self._vertices[item1]
|
||||
v2 = self._vertices[item2]
|
||||
|
||||
# Add the new edge
|
||||
v1.neighbours.add(v2)
|
||||
v2.neighbours.add(v1)
|
||||
else:
|
||||
# We didn't find an existing vertex for both items.
|
||||
raise ValueError
|
||||
|
||||
def connected(self, item1: Any, item2: Any) -> bool:
|
||||
"""Return whether item1 and item2 are connected vertices in this graph.
|
||||
|
||||
Return False if item1 or item2 do not appear as vertices in this graph.
|
||||
|
||||
>>> g = Graph()
|
||||
>>> g.add_vertex(1)
|
||||
>>> g.add_vertex(2)
|
||||
>>> g.add_vertex(3)
|
||||
>>> g.add_vertex(4)
|
||||
>>> g.add_edge(1, 2)
|
||||
>>> g.add_edge(2, 3)
|
||||
>>> g.connected(1, 3)
|
||||
True
|
||||
>>> g.connected(1, 4)
|
||||
False
|
||||
"""
|
||||
if item1 in self._vertices and item2 in self._vertices:
|
||||
v1 = self._vertices[item1]
|
||||
return v1.check_connected(item2, set()) # Pass in an empty "visited" set
|
||||
else:
|
||||
return False
|
||||
|
||||
def get_connected_component(self, item: Any) -> set:
|
||||
"""Return a set of all ITEMS connected to the given item in this graph.
|
||||
|
||||
Raise a ValueError if item does not appears as a vertex in this graph.
|
||||
|
||||
>>> g = Graph()
|
||||
>>> for i in range(0, 5):
|
||||
... g.add_vertex(i)
|
||||
>>> g.add_edge(0, 1)
|
||||
>>> g.add_edge(1, 2)
|
||||
>>> g.add_edge(1, 3)
|
||||
>>> g.add_edge(2, 3)
|
||||
>>> g.get_connected_component(0) == {0, 1, 2, 3}
|
||||
True
|
||||
|
||||
Note: we've implemented this method for you, and you should not change it.
|
||||
Instead, your task is to implement _Vertex.get_connected_component below.
|
||||
"""
|
||||
if item not in self._vertices:
|
||||
raise ValueError
|
||||
else:
|
||||
return self._vertices[item].get_connected_component(set())
|
||||
|
||||
def in_cycle(self, item: Any) -> bool:
|
||||
"""Return whether the given item is in a cycle in this graph.
|
||||
|
||||
Return False if item does not appears as a vertex in this graph.
|
||||
|
||||
KEY OBSERVATION. A vertex v is in a cycle if and only if:
|
||||
v has two distinct neighbours u and w that are connected to each other
|
||||
by a path that doesn't use v.
|
||||
|
||||
>>> g = Graph()
|
||||
>>> for i in range(0, 5):
|
||||
... g.add_vertex(i)
|
||||
>>> g.add_edge(0, 1)
|
||||
>>> g.add_edge(1, 2)
|
||||
>>> g.add_edge(1, 3)
|
||||
>>> g.add_edge(2, 3)
|
||||
>>> g.in_cycle(1)
|
||||
True
|
||||
>>> g.in_cycle(0)
|
||||
False
|
||||
>>> g.add_edge(4, 0)
|
||||
>>> g.in_cycle(0)
|
||||
False
|
||||
|
||||
Implementation notes:
|
||||
1. This method should call _Vertex.check_connected (following the above
|
||||
description).
|
||||
2. Don't try to make this method recursive, or copy and paste the implementation
|
||||
of _Vertex.check_connected! That's not necessary here.
|
||||
"""
|
||||
# Does not exist
|
||||
if item not in self._vertices:
|
||||
return False
|
||||
v = self._vertices[item]
|
||||
|
||||
# Combinations
|
||||
for u in v.neighbours:
|
||||
for w in v.neighbours:
|
||||
# Distinct combinations
|
||||
if u == w or u == v or w == v:
|
||||
continue
|
||||
|
||||
if u.check_connected(w.item, {v}):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
class _Vertex:
|
||||
"""A vertex in a graph.
|
||||
|
||||
Instance Attributes:
|
||||
- item: The data stored in this vertex.
|
||||
- neighbours: The vertices that are adjacent to this vertex.
|
||||
|
||||
Representation Invariants:
|
||||
- self not in self.neighbours
|
||||
- all(self in u.neighbours for u in self.neighbours)
|
||||
"""
|
||||
item: Any
|
||||
neighbours: set[_Vertex]
|
||||
|
||||
def __init__(self, item: Any, neighbours: set[_Vertex]) -> None:
|
||||
"""Initialize a new vertex with the given item and neighbours."""
|
||||
self.item = item
|
||||
self.neighbours = neighbours
|
||||
|
||||
def check_connected(self, target_item: Any, visited: set[_Vertex]) -> bool:
|
||||
"""Return whether this vertex is connected to a vertex corresponding to the target_item,
|
||||
WITHOUT using any of the vertices in visited.
|
||||
|
||||
Preconditions:
|
||||
- self not in visited
|
||||
"""
|
||||
if self.item == target_item:
|
||||
# Our base case: the target_item is the current vertex
|
||||
return True
|
||||
else:
|
||||
visited.add(self) # Add self to the set of visited vertices
|
||||
for u in self.neighbours:
|
||||
if u not in visited: # Only recurse on vertices that haven't been visited
|
||||
if u.check_connected(target_item, visited):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def get_connected_component(self, visited: set[_Vertex]) -> set:
|
||||
"""Return a set of all ITEMS connected to self by a path that does not use
|
||||
any vertices in visited.
|
||||
|
||||
The items of the vertices in visited CANNOT appear in the returned set.
|
||||
|
||||
Preconditions:
|
||||
- self not in visited
|
||||
|
||||
Implementation notes:
|
||||
1. This can be implemented in a similar way to _Vertex.check_connected.
|
||||
2. This method must be recursive, and will have an implicit base case:
|
||||
when all vertices in self.neighbours are already in visited.
|
||||
3. Use a loop accumulator to store a set of the vertices connected to self.
|
||||
|
||||
>>> g = Graph()
|
||||
>>> for i in range(0, 7):
|
||||
... g.add_vertex(i)
|
||||
>>> g.add_edge(0, 1)
|
||||
>>> g.add_edge(1, 2)
|
||||
>>> g.add_edge(1, 3)
|
||||
>>> g.add_edge(2, 3)
|
||||
>>> g.get_connected_component(1) == {0, 1, 2, 3}
|
||||
True
|
||||
>>> g.add_edge(4, 0)
|
||||
>>> g.get_connected_component(0) == {0, 1, 2, 3, 4}
|
||||
True
|
||||
>>> g.get_connected_component(5)
|
||||
{5}
|
||||
>>> g._vertices[5].get_connected_component({g._vertices[5]})
|
||||
set()
|
||||
>>> g._vertices[6].get_connected_component(set())
|
||||
{6}
|
||||
"""
|
||||
if self in visited:
|
||||
return set()
|
||||
visited.add(self)
|
||||
nums = {self.item}
|
||||
for u in self.neighbours:
|
||||
nums = nums.union(u.get_connected_component(visited))
|
||||
return nums
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Note: we are NOT using python_ta.contracts for this prep.
|
||||
# (Feel free to ask why in office hours/Campuswire.)
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
|
||||
import python_ta
|
||||
python_ta.check_all(config={
|
||||
'max-line-length': 100,
|
||||
'disable': ['E1136'],
|
||||
'max-nested-blocks': 4
|
||||
})
|
||||
@@ -1,191 +0,0 @@
|
||||
"""CSC111 Winter 2022 Prep 9: Programming Exercises
|
||||
|
||||
Instructions (READ THIS FIRST!)
|
||||
===============================
|
||||
|
||||
This module contains some functions related to sorting and/or Python lists for practice.
|
||||
In particular, some of these functions give you practice with *index parameters*,
|
||||
which we commonly use to specify that a function should only operate on a part of a list.
|
||||
(This is generally more efficient than requiring the user to create a new list. We'll explor
|
||||
this idea further in lecture this week.)
|
||||
|
||||
Do NOT use recursion for any of these functions.
|
||||
|
||||
We have marked each place you need to write code with the word "TODO".
|
||||
As you complete your work in this file, delete each TODO comment.
|
||||
|
||||
You may add additional doctests, but they will not be graded. You should test your work
|
||||
carefully before submitting it!
|
||||
|
||||
Copyright and Usage Information
|
||||
===============================
|
||||
|
||||
This file is provided solely for the personal and private use of students
|
||||
taking CSC111 at the University of Toronto St. George campus. All forms of
|
||||
distribution of this code, whether as given or with any changes, are
|
||||
expressly prohibited. For more information on copyright for CSC111 materials,
|
||||
please consult our Course Syllabus.
|
||||
|
||||
This file is Copyright (c) 2022 Mario Badr and David Liu.
|
||||
"""
|
||||
|
||||
|
||||
def is_sorted(lst: list) -> bool:
|
||||
"""Return whether lst is sorted.
|
||||
|
||||
Formally, a list `lst` is sorted when for every index i between 0 and len(lst),
|
||||
lst[i] <= lst[i + 1]. Note that empty lists and lists of length 1 are always sorted.
|
||||
|
||||
Do not call `sorted` or `list.sort`, or otherwise sort `lst` in this function.
|
||||
|
||||
>>> is_sorted([2, 7, 3, 4, 5])
|
||||
False
|
||||
>>> is_sorted([2, 3, 4, 5, 7])
|
||||
True
|
||||
>>> is_sorted([-1, 0, 0, 1])
|
||||
True
|
||||
>>> is_sorted([-1, 0, 0, -1])
|
||||
False
|
||||
"""
|
||||
return all(lst[i] <= lst[i + 1] for i in range(len(lst) - 1))
|
||||
|
||||
|
||||
def is_sorted_sublist(lst: list, b: int, e: int) -> bool:
|
||||
"""Return whether the sublist lst[b:e] is sorted.
|
||||
|
||||
Do not create a new list or call is_sorted. Instead, adapt the definition from
|
||||
is_sorted to complete this function.
|
||||
|
||||
Note that if b >= e, then lst[b:e] is an empty list, and so is sorted.
|
||||
|
||||
Preconditions:
|
||||
- 0 <= b < len(lst)
|
||||
- 0 <= e <= len(lst)
|
||||
|
||||
>>> is_sorted_sublist([2, 7, 3, 4, 5], 0, 5) # Equivalent to is_sorted([2, 7, 3, 4, 5])
|
||||
False
|
||||
>>> is_sorted_sublist([2, 7, 3, 4, 5], 2, 5) # Equivalent to is_sorted([2, 7, 3, 4, 5][2:5])
|
||||
True
|
||||
>>> is_sorted_sublist([-1, 0, 0, -1], 0, 3)
|
||||
True
|
||||
>>> is_sorted_sublist([-1, 0, 0, -1], 0, 4)
|
||||
False
|
||||
"""
|
||||
return all(lst[i] <= lst[i + 1] for i in range(b, e - 1))
|
||||
|
||||
|
||||
def min_index(lst: list) -> int:
|
||||
"""Return the index of the smallest element of lst.
|
||||
|
||||
In the case of ties, return the smaller index (i.e., the index that appears first).
|
||||
|
||||
Preconditions:
|
||||
- lst != []
|
||||
|
||||
>>> min_index([-10, 7, 3, 5])
|
||||
0
|
||||
>>> min_index([7, 7, 7, 7])
|
||||
0
|
||||
>>> min_index([8, 7, 7, 7])
|
||||
1
|
||||
>>> min_index([8, 7, 7, -1])
|
||||
3
|
||||
>>> min_index([99999999])
|
||||
0
|
||||
"""
|
||||
lowest = lst[0]
|
||||
index = 0
|
||||
|
||||
for i in range(len(lst)):
|
||||
if lst[i] < lowest:
|
||||
lowest = lst[i]
|
||||
index = i
|
||||
|
||||
return index
|
||||
|
||||
|
||||
def min_index_sublist(lst: list, b: int, e: int) -> int:
|
||||
"""Return the index of the smallest item in lst[b:e].
|
||||
|
||||
In the case of ties, return the smaller index (i.e., the index that appears first).
|
||||
|
||||
This is similar to min_index, except we are only considering the elements
|
||||
with indexes between b and e - 1, inclusive.
|
||||
|
||||
Preconditions:
|
||||
- 0 <= b < e <= len(lst)
|
||||
|
||||
>>> min_index_sublist([-10, 7, 3, 5], 0, 4)
|
||||
0
|
||||
>>> min_index_sublist([-10, 7, 3, 5], 1, 3)
|
||||
2
|
||||
"""
|
||||
lowest = lst[b]
|
||||
index = b
|
||||
|
||||
for i in range(b, e):
|
||||
if lst[i] < lowest:
|
||||
lowest = lst[i]
|
||||
index = i
|
||||
|
||||
return index
|
||||
|
||||
|
||||
def cycle(lst: list) -> None:
|
||||
"""Rearrange the elements of lst by shifting every element one spot to the right.
|
||||
|
||||
The last list element moves to the front of the list.
|
||||
|
||||
Preconditions:
|
||||
- lst != []
|
||||
|
||||
>>> lst = [10, 3, 5, 7, 9000]
|
||||
>>> cycle(lst)
|
||||
>>> lst
|
||||
[9000, 10, 3, 5, 7]
|
||||
|
||||
Implementation notes:
|
||||
- Do NOT call any list methods; instead, move the elements by assigning to indexes
|
||||
(e.g., lst[1] = list[0] or lst[i] = lst[i + 1]).
|
||||
"""
|
||||
last = lst[-1]
|
||||
for i in reversed(range(len(lst))):
|
||||
lst[i] = lst[i - 1]
|
||||
lst[0] = last
|
||||
|
||||
|
||||
def cycle_sublist(lst: list, b: int, e: int) -> None:
|
||||
"""Rearrange the elements of lst[b:e] by shifting every element one spot to the right.
|
||||
|
||||
The element lst[e - 1] moves to index b.
|
||||
|
||||
Preconditions:
|
||||
- 0 <= b < e <= len(lst)
|
||||
|
||||
>>> lst = [10, 3, 5, 7, 9000]
|
||||
>>> cycle_sublist(lst, 0, 5) # Equivalent to cycle(lst)
|
||||
>>> lst
|
||||
[9000, 10, 3, 5, 7]
|
||||
>>> lst2 = [10, 3, 5, 7, 9000]
|
||||
>>> cycle_sublist(lst2, 1, 4)
|
||||
>>> lst2
|
||||
[10, 7, 3, 5, 9000]
|
||||
"""
|
||||
last = lst[e - 1]
|
||||
for i in reversed(range(b, e)):
|
||||
lst[i] = lst[i - 1]
|
||||
lst[b] = last
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import python_ta.contracts
|
||||
python_ta.contracts.check_all_contracts()
|
||||
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
|
||||
import python_ta
|
||||
python_ta.check_all(config={
|
||||
'max-line-length': 100,
|
||||
'disable': ['E1136']
|
||||
})
|
||||
Reference in New Issue
Block a user