Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

advanced_heuristics #9

Open
wants to merge 114 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 93 commits
Commits
Show all changes
114 commits
Select commit Hold shift + click to select a range
d19410d
add Advanced Heuristics Folder
mmdrez4 Oct 29, 2021
6386ff3
Create matadat.yml
mmdrez4 Oct 29, 2021
5d71e0f
Delete notebooks/Advanced Heuristics directory
mmdrez4 Oct 29, 2021
a20d57d
create advanced_heuristics folder
mmdrez4 Oct 29, 2021
e9f818c
Create matadata.yml
mmdrez4 Oct 29, 2021
6e33d36
Update index.md
mmdrez4 Oct 29, 2021
16e60fc
Update index.md
mmdrez4 Oct 29, 2021
a9db3b6
Update index.md
mmdrez4 Oct 29, 2021
faee70f
Update index.md
mmdrez4 Oct 29, 2021
57da872
Update index.md
mmdrez4 Oct 29, 2021
980d455
Update index.md
mmdrez4 Oct 29, 2021
7c38aff
Update index.md
mmdrez4 Oct 29, 2021
5badd0d
Update index.md
mmdrez4 Oct 29, 2021
51630dd
add table of contents
mmdrez4 Oct 29, 2021
c7d6df9
Update index.md
mmdrez4 Oct 29, 2021
cca9b1a
Update index.md
mmdrez4 Oct 29, 2021
28e2cba
Update index.md
mmdrez4 Oct 29, 2021
8ebe58b
Update index.md
mmdrez4 Oct 29, 2021
7c6fb89
Update index.md
mmdrez4 Oct 29, 2021
d633278
Update index.md
mmdrez4 Oct 29, 2021
7199db1
Update index.md
mmdrez4 Oct 29, 2021
09d90ec
Update index.md
mmdrez4 Oct 29, 2021
80ed11d
Update index.md
mmdrez4 Oct 29, 2021
8f34660
Create index.md
mmdrez4 Oct 29, 2021
e37d8ab
Update index.md
mmdrez4 Oct 29, 2021
96a3d16
Update index.md
mmdrez4 Oct 29, 2021
77a7f7a
finish table of contents
mmdrez4 Oct 29, 2021
c2d4f2c
Update index.md
mmdrez4 Oct 29, 2021
166ae07
Update index.md
mmdrez4 Oct 29, 2021
db2d38d
Update index.md
mmdrez4 Oct 29, 2021
fceb3fe
Update index.md
mmdrez4 Oct 29, 2021
cf99738
Update index.md
mmdrez4 Oct 29, 2021
d2a4e6a
Update index.md
mmdrez4 Oct 29, 2021
356bc7d
Update index.md
mmdrez4 Oct 29, 2021
9109e3c
Update index.md
mmdrez4 Oct 29, 2021
dbcd5bc
Update index.md
mmdrez4 Oct 29, 2021
4ae8652
Update index.md
mmdrez4 Oct 29, 2021
f095d72
Update index.md
mmdrez4 Oct 29, 2021
0f0e75f
Update index.md
mmdrez4 Oct 29, 2021
9881f03
Update index.md
mmdrez4 Oct 29, 2021
25d72f8
Update index.md
mmdrez4 Oct 29, 2021
8d8dd3d
Update index.md
mmdrez4 Oct 29, 2021
3ea76ad
Update index.md
mmdrez4 Oct 29, 2021
26dbbf9
Update index.md
mmdrez4 Oct 29, 2021
1515cad
Update index.md
mmdrez4 Oct 29, 2021
5751157
Update index.md
mmdrez4 Oct 29, 2021
dda4753
Update index.md
mmdrez4 Oct 29, 2021
b642b0b
Update index.md
mmdrez4 Oct 29, 2021
9703ab7
Update index.md
mmdrez4 Oct 29, 2021
d07cb1c
Update index.md
mmdrez4 Oct 29, 2021
cf0a8b3
Update index.md
mmdrez4 Oct 29, 2021
2d7cee3
Update index.md
mmdrez4 Oct 29, 2021
199e89f
Update index.md
mmdrez4 Oct 29, 2021
1eb2286
Update index.md
mmdrez4 Oct 29, 2021
ae79238
Update index.md
mmdrez4 Oct 29, 2021
f3accb2
Update index.md
mmdrez4 Oct 29, 2021
4c82f09
Update index.md
mmdrez4 Oct 29, 2021
891787e
Update index.md
mmdrez4 Oct 29, 2021
bf7c69f
Update index.md
mmdrez4 Oct 29, 2021
97abd5c
Update index.md
mmdrez4 Oct 29, 2021
c464cf7
Update index.md
mmdrez4 Oct 29, 2021
da79457
Update index.md
mmdrez4 Oct 29, 2021
e15ac06
Delete consistency.png
mmdrez4 Oct 29, 2021
8d14d63
Add files via upload
mmdrez4 Oct 29, 2021
cd85258
Delete consistency.png
mmdrez4 Oct 29, 2021
55919c5
Add files via upload
mmdrez4 Oct 29, 2021
1f464fe
Update index.md
mmdrez4 Oct 29, 2021
9a5c21a
Update index.md
mmdrez4 Oct 29, 2021
8865804
Update index.md
mmdrez4 Oct 29, 2021
0c39611
Update index.md
mmdrez4 Oct 29, 2021
0c3007d
Update index.md
mmdrez4 Oct 29, 2021
3785787
Update index.md
mmdrez4 Oct 29, 2021
9b6cf09
Delete proof.png
mmdrez4 Oct 29, 2021
2645c60
Add files via upload
mmdrez4 Oct 29, 2021
73ea219
Delete proof.png
mmdrez4 Oct 29, 2021
78d5272
Add files via upload
mmdrez4 Oct 29, 2021
1741692
Add files via upload
mmdrez4 Oct 29, 2021
b88ceac
Update index.md
mmdrez4 Oct 29, 2021
fa7b75e
Update index.md
mmdrez4 Oct 29, 2021
248e74d
Update index.md
mmdrez4 Oct 29, 2021
2b85c98
Update index.md
mmdrez4 Oct 29, 2021
639961f
Update index.md
mmdrez4 Oct 29, 2021
be6e63f
Update index.md
mmdrez4 Oct 29, 2021
12136f5
Update index.md
mmdrez4 Oct 29, 2021
bea73a9
Update index.md
mmdrez4 Oct 29, 2021
a8aa8b9
Delete example.png
mmdrez4 Oct 29, 2021
4b71e98
Add files via upload
mmdrez4 Oct 29, 2021
4e80933
Update index.md
sepehrkianian09 Oct 29, 2021
80d0a50
Update index.md
mmdrez4 Oct 29, 2021
c9d7006
Update index.md
mmdrez4 Oct 29, 2021
88155ac
Update index.md
mmdrez4 Oct 29, 2021
11e04cf
Add files via upload
mmdrez4 Oct 29, 2021
0d2bc97
Update index.md
mmdrez4 Oct 29, 2021
615f331
Update index.md
mmdrez4 Oct 29, 2021
12d111a
Update index.md
mmdrez4 Oct 29, 2021
25afe1a
Update index.md
mmdrez4 Oct 29, 2021
7cec7cc
Update index.md
mmdrez4 Oct 29, 2021
92deefe
Update matadata.yml
mmdrez4 Oct 29, 2021
c066f64
Update index.md
mmdrez4 Nov 12, 2021
06dee17
Update index.md
mmdrez4 Nov 12, 2021
9bc92f8
Update index.md
mmdrez4 Nov 12, 2021
5453eee
Update index.md
mmdrez4 Nov 12, 2021
0fab07f
Update index.md
mmdrez4 Nov 12, 2021
a61db97
Update index.md
mmdrez4 Nov 12, 2021
6cb298e
Update index.md
mmdrez4 Nov 12, 2021
639623a
fix(index.md): Fixed my problems
sepehrkianian09 Nov 12, 2021
d352360
feat(index.md): Add Pattern-DB Pics
sepehrkianian09 Nov 12, 2021
d5c3390
feat(index.md): Add Pattern-DB pics to the note
sepehrkianian09 Nov 12, 2021
0dcacf0
Fix(index.md): Fix Image dimensions
sepehrkianian09 Nov 12, 2021
eb8baef
Update index.md
mmdrez4 Nov 12, 2021
51b316b
Update index.md
sepehrkianian09 Nov 12, 2021
70d27a2
fix(adv_heuristics): final Fix of Sep_parts
sepehrkianian09 Nov 15, 2021
202f9e7
fix(adv_heuristics): Fix final parts of Sep
sepehrkianian09 Nov 15, 2021
8ec8e00
fix(adv_heuristics): Fix final parts of Sep
sepehrkianian09 Nov 15, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
237 changes: 237 additions & 0 deletions notebooks/advanced_heuristics/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,237 @@
# Advanced Heuristics
#### Kahbod Aeini, Mohammadreza Daviran and Sepehr Kianian

## Contents
1.[Introduction](https://github.com/mmdrez4/notes/blob/master/notebooks/advanced_heuristics/index.md#introduction)

2.[Body](https://github.com/mmdrez4/notes/blob/master/notebooks/advanced_heuristics/index.md#body)
        
* [Distance](https://github.com/mmdrez4/notes/blob/master/notebooks/advanced_heuristics/index.md#distance)
        
* [Heuristic](https://github.com/mmdrez4/notes/blob/master/notebooks/advanced_heuristics/index.md#heuristic)
        
* [Monotonicity implies admissibility](https://github.com/mmdrez4/notes/blob/master/notebooks/advanced_heuristics/index.md#monotonicity-implies-admissibility)
        
* [Monotonic heuristic function](https://github.com/mmdrez4/notes/blob/master/notebooks/advanced_heuristics/index.md#monotonic-heuristic-function)
        
* [Heuristic dominance](https://github.com/mmdrez4/notes/blob/master/notebooks/advanced_heuristics/index.md#heuristic-dominance)
        
* [Relaxing](https://github.com/mmdrez4/notes/blob/master/notebooks/advanced_heuristics/index.md#relaxing)
        
* [Pattern DB](https://github.com/mmdrez4/notes/blob/master/notebooks/advanced_heuristics/index.md#pattern-db)
        
* [Combining Pattern DB](https://github.com/mmdrez4/notes/blob/master/notebooks/advanced_heuristics/index.md#combining-pattern-db)
        
* [Disjoint Pattern DB](https://github.com/mmdrez4/notes/blob/master/notebooks/advanced_heuristics/index.md#disjoint-pattern-db)

3.[Conclusion](https://github.com/mmdrez4/notes/blob/master/notebooks/advanced_heuristics/index.md#conclusion)

4.[References](https://github.com/mmdrez4/notes/blob/master/notebooks/advanced_heuristics/index.md#references)

## Introduction
nothing yet!

a ≥ b

a<sup>2

## Body

### Distance
First we review some basic definitions:

Distance is a numerical measurement of how far apart objects or points are:
* [Euclidean Distance](https://en.wikipedia.org/wiki/Euclidean_distance) calculates the distance between two real-valued vectors.
* [Manhattan Distance](https://en.wikipedia.org/wiki/Taxicab_geometry) is sum of the absolute differences of their Cartesian coordinates.
<p align="center">
<img src="pic/distance.png" alt="distance" width="400" height="300"/>
</p>

<hr style="border:2px solid gray"> </hr>

### Heuristic
* Heuristic guidance means how far is the goal state from a given state approximately.

***Admissiblity of a heuristic function means value of the function is always a Lower Bound of the remaining cost.***

So an **Admissible Heuristic** is a *non-negative* function h of nodes, where **h(n)** is *never greater than the actual cost of the shortest path from node n to a goal.* thus it means that the cost to reach the goal is never overestimated.

Effect of **Admissibility** on a Heuristic is shown in the below schema:
<p align="center">
<img src="pic/admissible.png" alt="admissible" width="600" height="300"/>
</p>

Now we define **f(n)** function as **f(n) = h(n) + g(n)** where g(n) is sum of costs from root to n node.

***Monotonicity or Consistency is that the heuristic function holds in triangle inequality.*** Namely **f(n) is never Decreasing.**
<p align="center">
<img src="pic/consistency.png" alt="consistency" width="270" height="350"/>
</p>
A heuristic is consistent if: <em>h(n) &le; c(n, a, n’) + h(n’)</em>

if h is consistent, we have: <em>f(n’) = g(n’) + h (n’) = g(n) + c(n, a, n’) + h(n’) &ge; g(n) + h(n) [= f(n)]</em>
sepehrAmini marked this conversation as resolved.
Show resolved Hide resolved

I.e., f(n) is nondecreasing along any path.

Effect of **Monotonicity** on a Heuristic is shown in the below schema:
<p align="center">
<img src="pic/monotonic.png" alt="monotonic" width="600" height="300"/>
</p>

for more information and better understanding watch this video: [watch](https://www.youtube.com/watch?v=CJmlP03ik5g)

<hr style="border:2px solid gray"> </hr>

### Monotonicity implies admissibility
We will prove that **Consistency** implies **Admissibility** whereas the opposite is not necessarily true.
<p align="center">
<img src="pic/proof.png" alt="proof" width="800" height="130"/>
</p>
<em> h(n<sub>1</sub>) &le; c(n<sub>1</sub> ,a<sub>1</sub> , n<sub>2</sub>) + h(n<sub>2</sub>) </em>
<em> &le; c(n<sub>1</sub> ,a<sub>1</sub> , n<sub>2</sub>) + c(n<sub>1</sub> ,a<sub>1</sub> , n<sub>3</sub>) + h(n<sub>3</sub>) &le;</em>

<em> &le; &Sigma; c(n<sub>1</sub> ,a<sub>1</sub> , n<sub>i+1</sub>) + 0 &#8658; h(n<sub>1</sub>) &le; cost of (every) path from n<sub>1</sub> to goal &le; cost of optimal path from n<sub>1</sub> to goal </em>
mmdrez4 marked this conversation as resolved.
Show resolved Hide resolved

Now we want to show an **inconsistent, admissible example!**
So consider this figure:

<p align="center">
<img src="pic/example.png" alt="example"/>
</p>

If our heuristic is admissible, we have that **h(n) &le; h*(n)** for every node n where **h*** is the real cost to the goal. So we deduct that **h(A) &le; 4**, **h(C) &le; 3** and **h(G) &le; 0**.

If we want our heuristic to be *Consistent* we should have **h(G) = 0** and **h(n) &le; cost(n, c) + h(c)** so in our case we have **h(A) &le; 1 + h(C)** and **h(C) &le; 3 + h(G) = 3**

Because of the *Admissibility* **h(C) should be less than 3**, but if **h(A) > 1 + h(C)** then our heuristic is *Inconsistent!*. Hence if we assume that **h(C) = 1**, **h(G) = 0** and **h(A) = 4** our heuristic is *Admissible but Inconsistent!*

<hr style="border:2px solid gray"> </hr>

### Monotonic heuristic function
We also can make a non-monotonic heuristic, monotonic with some changes!
For this we only need to define a new and more appropriate heuristic like the below schema.
<p align="center">
<img src="pic/c.png" alt="new heuristic" width="500" height="150"/>
</p>



**ℏ(n’) = max(h(n’), ℏ(n’) - c(n, a, n’))**


Above Heuristic is defined Recursively.
<p align="center">
<img src="pic/heuristic proof.png" alt="heuristic proof" width="400" height="300"/>
</p>

**ℏ(n’) &ge; ℏ(n) - c(n, a, n')**

So obviously we have **ℏ(n’) + c(n, a, n') &ge; ℏ(n)**

<hr style="border:2px solid gray"> </hr>

### Heuristic Dominance

For one heuristic to dominate another, all of its values must be greater than or equal to the corresponding values of the other heuristic.
So if h<sub>2</sub> dominates h<sub>1</sub>(both are admissible) it means that A* algorithm expands less nodes with h<sub>2</sub> in the target path than h<sub>1</sub>.
On another hand it means if a node is expanded by h<sub>2</sub> it will be expanded by h<sub>1</sub>(consider that it’s not a biconditional proposition!)

*Proof:*

If h<sub>2</sub> dominate h<sub>1</sub>, A* with h<sub>2</sub> expands at most the same number of nodes as when using h<sub>1</sub>.

A* opens all node with **f(n) < C** and some with **f(n) = C**.


Note that
**h<sub>2</sub>(n)
&ge;
h<sub>1</sub>(n)**

If node n is expanded by A* with h<sub>2</sub> then **h<sub>2</sub>(n) < C - g(n)**

So ***h<sub>1</sub>(n) &le; h<sub>2</sub>(n) < C - g(n)*** and it would be expanded by A* with h<sub>1</sub> as well.


We also can improve our heuristic by some methods.

We are always trying to lower the difference between h* and h, expanded nodes and algorithm time complexity by making change in our heuristic.

One of the main ways for improving heuristics is **Relaxing** the problem.

In this procedure we try to enlarge the feasible answers set by simplifying the problem.

<hr style="border:2px solid gray"> </hr>

### Relaxing

One of the most common ways to find efficient heuristic function is that we convert our hard problem which is indissoluble in reasonable time, to a *more general problem with larger state space*.

Discussing more specifically, original problem has a set of constraints. Noe we **ignore some constraints** and solve the expanded problem. Since number of constraints have decreased, we have more goal states and our state space expands.

***Proof that Relaxing works***

Consider h as the answer and h' as our heuristic

h' = min(S'), h = min(S) &and; S &SubsetEqual; S' &and; &forall; s, s': if s &SubsetEqual; s' &#8658; min(s') &le; min(s) &#8658; h' &le; h


***Example***

In below problem, which is an NP-hard problem (indissoluble in linear time), we want to find the Hamiltonian path with least weight.

<p align="center">
<img src="pic/hamilton path.png" alt="hamilton path" width="500" height="300"/>
</p>

Hamilton path is a tree which every its inner node have exactly one leaf. Hence, the problem is converting above graph to a 1-array tree, which covers all nodes of the graph with existing edges and minimum sum of edges' weight. Now we ignore being 1-array tree constraint to convert original problem to a more general one. Accordingly our problem is now a Minimum Spaning Tree problem which is soluable in n<sup>2</sup> time complexity.
sepehrAmini marked this conversation as resolved.
Show resolved Hide resolved

<hr style="border:2px solid gray"> </hr>

### Pattern DB

In previous sectionwe introduced relaxing method which improves heuristic function by lowering constraints. Pattern DB is yet another way to improve heuristic function which is actually a subset of Relaxing method.

In this method we choose a subset of constraints by a specific pattern and ignore the other constraints. Since we ignored some constraints we did relaxing method and hence answer of the converted problem is a heuristic gfunction.
sepehrAmini marked this conversation as resolved.
Show resolved Hide resolved

for further information watch this video: [watch](https://www.youtube.com/watch?v=HZWV4uOJWk8)
<hr style="border:2px solid gray"> </hr>

### Combining Pattern DB

We can act further and use couple of patterns and choose couple of constraints' subsets. Therefore we have couple of heuristic functions. This helps dominancy of our heuristic function. First thing to do finding the dominant heuristic function is to choose the maximum function of the obtained heuristic functions. Since every heuristic is always less than the real answer, maximum of these functions is a lower bound of the real answer and for every set of obtained heuristic functions we can implement this method to find a dominant heuristic function.
sepehrAmini marked this conversation as resolved.
Show resolved Hide resolved

<hr style="border:2px solid gray"> </hr>

### Disjoint Pattern DB

One of the main flaws of choosing maximum of the obtained heuristic functions is that in many cases, there is an upper bound for these functions. Therefore even by expanding subset of chosen constraints, we will not cross the upper bound.

One solution for solving this drawback is Disjoint Pattern DB. In this method we apport set of constraints and define independent actions for the general problem. Now we can sum the obtained heuristic function to achieve a greater heuristic function, which improves the time complexity. It is proven that the sum of obtained heuristic functions is still a lower bound of real answer of the probelm.

**Example**

<p align="center">
<img src="pic/pattern.png" alt="pattern" width="500" height="300"/>
</p>

As you can see in this problem we have an undirected graph, which each of its nodes is a florist shop and has some flower breeds. Two brothers should march from start_node towards goal_node in a way that has the least cost and they met every existing flower breeds. In this case we choose a subset of flower breeds S that reach goal_node by a specific pattern and set goal_state as satisfying path with the least cost and meeting every existing flower breeds of set S. Hitherto we used pure Pattern DB.
sepehrAmini marked this conversation as resolved.
Show resolved Hide resolved

Now we can have souple of flower breeds subset and combine obtained answers by them. For example if we have K flower breeds, we can solve the problem for each flower breed and calculate its heuristic function and then choose maximum of the functions. So we used Combining Pattern DB to achieve a better heuristic function.

## Conclusion
So far we've introduced some efficient ways to make our heuristic closer to the real answer. some of them were to make our heuristic monotonic and Dominant, or to make a dominant heuristic based on some heuristics we had. some advanced ways were for even more basic problem, namely how to create a heuristic function for a problem. these included Relaxing problems and Patternal DBs. We Entered deeply into the Patternal DBs And introduced ways to improve them a lot. despite all these ways, there are so many problems that aren't solvable by even these ways, and there are so many ways ahead of us that you have to learn & use further. thanks for reading all of these concepts and we wish you have a great future. a bid farewell.

## References
https://machinelearningmastery.com/distance-measures-for-machine-learning/

https://artint.info/2e/html/ArtInt2e.Ch3.S6.SS2.html

https://en.wikipedia.org/wiki/Consistent_heuristic

sepehrAmini marked this conversation as resolved.
Show resolved Hide resolved
https://stackoverflow.com/questions/1568600/what-is-the-difference-between-monotonicity-and-the-admissibility-of-a-heuristic

https://stackoverflow.com/questions/46554459/intuitively-understanding-why-consistency-is-required-for-optimality-in-a-searc

https://courses.cs.washington.edu/courses/cse473/12sp/slides/04-heuristics.pdf
25 changes: 25 additions & 0 deletions notebooks/advanced_heuristics/matadata.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
title: <change this> # shown on browser tab

header:
title: advanced Heuristics # title of your notebook
description: <change this> # short description of your notebook

authors:
label:
position: top
content:
# list of notebook authors
- name: Mohammadreza Daviran # name of author
role: Author # change this if you want
contact:
# list of contact information
- link: https://github.com/<your_github_username>
icon: fab fa-github
# optionally add other contact information like
# - link: <change this> # contact link
# icon: <change this> # awsomefont tag for link (check: https://fontawesome.com/v5.15/icons)

comments:
# enable comments for your post
label: false
kind: comments
Binary file added notebooks/advanced_heuristics/pic/admissible.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added notebooks/advanced_heuristics/pic/c.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added notebooks/advanced_heuristics/pic/consistency.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added notebooks/advanced_heuristics/pic/distance.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added notebooks/advanced_heuristics/pic/example.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added notebooks/advanced_heuristics/pic/monotonic.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added notebooks/advanced_heuristics/pic/pattern.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added notebooks/advanced_heuristics/pic/proof.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.