diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json index 57c2cae..cd18f67 100644 --- a/dev/.documenter-siteinfo.json +++ b/dev/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.10.5","generation_timestamp":"2024-09-27T11:32:27","documenter_version":"1.7.0"}} \ No newline at end of file +{"documenter":{"julia_version":"1.10.5","generation_timestamp":"2024-09-30T15:25:09","documenter_version":"1.7.0"}} \ No newline at end of file diff --git a/dev/LEQ/index.html b/dev/LEQ/index.html index 169d5f3..26dcf4d 100644 --- a/dev/LEQ/index.html +++ b/dev/LEQ/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/asp/index.html b/dev/asp/index.html index 23cd7ab..896609b 100644 --- a/dev/asp/index.html +++ b/dev/asp/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/getting_started_with_julia/index.html b/dev/getting_started_with_julia/index.html index cc42186..2c838c8 100644 --- a/dev/getting_started_with_julia/index.html +++ b/dev/getting_started_with_julia/index.html @@ -15,4 +15,4 @@ DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195"

Copy the contents of previous code block into a file called Project.toml and place it in an empty folder named newproject. It is important that the file is named Project.toml. You can create a new folder from the REPL with

julia> mkdir("newproject")

To install all the packages registered in this file you need to activate the folder containing your Project.toml file

(@v1.10) pkg> activate newproject

and then instantiating it

(newproject) pkg> instantiate

The instantiate command will download and install all listed packages and their dependencies in just one click.

Getting help in package mode

You can get help about a particular package operator by writing help in front of it

(@v1.10) pkg> help activate

You can get an overview of all package commands by typing help alone

(@v1.10) pkg> help

Package operations in Julia code

In some situations it is required to use package commands in Julia code, e.g., to automatize installation and deployment of Julia applications. This can be done using the Pkg package. For instance

julia> using Pkg
 julia> Pkg.status()

is equivalent to calling status in package mode.

(@v1.10) pkg> status

Creating you own package

In many situations, it is useful to create your own package, for instance, when working with a large code base, when you want to reduce compilation latency using Revise.jl, or if you want to eventually register your package and share it with others.

The simplest way of generating a package (called MyPackage) is as follows. Open Julia, go to package mode, and type

(@v1.10) pkg> generate MyPackage

This will crate a minimal package consisting of a new folder MyPackage with two files:

Tip

This approach only generates a very minimal package. To create a more sophisticated package skeleton (including unit testing, code coverage, readme file, licence, etc.) use PkgTemplates.jl or BestieTemplate.jl. The later one is developed in Amsterdam at the Netherlands eScience Center.

You can add dependencies to the package by activating the MyPackage folder in package mode and adding new dependencies as always:

(@v1.10) pkg> activate MyPackage
 (MyPackage) pkg> add MPI

This will add MPI to your package dependencies.

Using your own package

To use your package you first need to add it to a package environment of your choice. This is done by changing to package mode and typing develop followed by the path to the folder containing the package. For instance:

(@v1.10) pkg> develop MyPackage
Note

You do not need to "develop" your package if you activated the package folder MyPackage.

Now, we can go back to standard Julia mode and use it as any other package:

using MyPackage
-MyPackage.greet()

Here, we just called the example function defined in MyPackage/src/MyPackage.jl.

Conclusion

We have learned the basics of how to work with Julia, including how to run serial and parallel code, and how to manage, create, and use Julia packages. This knowledge will allow you to follow the course effectively! If you want to further dig into the topics we have covered here, you can take a look at the following links:

+MyPackage.greet()

Here, we just called the example function defined in MyPackage/src/MyPackage.jl.

Conclusion

We have learned the basics of how to work with Julia, including how to run serial and parallel code, and how to manage, create, and use Julia packages. This knowledge will allow you to follow the course effectively! If you want to further dig into the topics we have covered here, you can take a look at the following links:

diff --git a/dev/index.html b/dev/index.html index c2084c5..6061ecf 100644 --- a/dev/index.html +++ b/dev/index.html @@ -2,4 +2,4 @@ Home · XM_40017

Programming Large-Scale Parallel Systems (XM_40017)

Welcome to the interactive lecture notes of the Programming Large-Scale Parallel Systems course at VU Amsterdam!

What

This page contains part of the course material of the Programming Large-Scale Parallel Systems course at VU Amsterdam. We provide several lecture notes in jupyter notebook format, which will help you to learn how to design, analyze, and program parallel algorithms on multi-node computing systems. Further information about the course is found in the study guide (click here) and our Canvas page (for registered students).

Note

Material will be added incrementally to the website as the course advances.

Warning

This page will eventually contain only a part of the course material. The rest will be available on Canvas. In particular, the material in this public webpage does not fully cover all topics in the final exam.

How to use this page

You have two main ways of studying the notebooks:

  • Download the notebooks and run them locally on your computer (recommended). At each notebook page you will find a green box with links to download the notebook.
  • You also have the static version of the notebooks displayed in this webpage for quick reference.

How to run the notebooks locally

To run a notebook locally follow these steps:

  • Install Julia (if not done already). More information in Getting started.
  • Download the notebook.
  • Launch Julia. More information in Getting started.
  • Execute these commands in the Julia command line:
julia> using Pkg
 julia> Pkg.add("IJulia")
 julia> using IJulia
-julia> notebook()
  • These commands will open a jupyter in your web browser. Navigate in jupyter to the notebook file you have downloaded and open it.

Authors

This material is created by Francesc Verdugo with the help of Gelieza Kötterheinrich. Part of the notebooks are based on the course slides by Henri Bal.

License

All material on this page that is original to this course may be used under a CC BY 4.0 license.

Acknowledgment

This page was created with the support of the Faculty of Science of Vrije Universiteit Amsterdam in the framework of the project "Interactive lecture notes and exercises for the Programming Large-Scale Parallel Systems course" funded by the "Innovation budget BETA 2023 Studievoorschotmiddelen (SVM) towards Activated Blended Learning".

+julia> notebook()

Authors

This material is created by Francesc Verdugo with the help of Gelieza Kötterheinrich. Part of the notebooks are based on the course slides by Henri Bal.

License

All material on this page that is original to this course may be used under a CC BY 4.0 license.

Acknowledgment

This page was created with the support of the Faculty of Science of Vrije Universiteit Amsterdam in the framework of the project "Interactive lecture notes and exercises for the Programming Large-Scale Parallel Systems course" funded by the "Innovation budget BETA 2023 Studievoorschotmiddelen (SVM) towards Activated Blended Learning".

diff --git a/dev/jacobi_2D/index.html b/dev/jacobi_2D/index.html index 15a8c03..a634d30 100644 --- a/dev/jacobi_2D/index.html +++ b/dev/jacobi_2D/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/jacobi_method/index.html b/dev/jacobi_method/index.html index ff96593..4742ba6 100644 --- a/dev/jacobi_method/index.html +++ b/dev/jacobi_method/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/julia_async/index.html b/dev/julia_async/index.html index 63396d6..bd23f1b 100644 --- a/dev/julia_async/index.html +++ b/dev/julia_async/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/julia_basics/index.html b/dev/julia_basics/index.html index 8b1edb9..5f2d3a3 100644 --- a/dev/julia_basics/index.html +++ b/dev/julia_basics/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/julia_distributed/index.html b/dev/julia_distributed/index.html index 9f8ed1f..affd79b 100644 --- a/dev/julia_distributed/index.html +++ b/dev/julia_distributed/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/julia_intro/index.html b/dev/julia_intro/index.html index b77a241..d68243a 100644 --- a/dev/julia_intro/index.html +++ b/dev/julia_intro/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/julia_jacobi/index.html b/dev/julia_jacobi/index.html index 9fa76c7..c166c71 100644 --- a/dev/julia_jacobi/index.html +++ b/dev/julia_jacobi/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/julia_mpi/index.html b/dev/julia_mpi/index.html index 05db9a7..84c0600 100644 --- a/dev/julia_mpi/index.html +++ b/dev/julia_mpi/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/julia_tutorial/index.html b/dev/julia_tutorial/index.html index 2ac0245..22bbc68 100644 --- a/dev/julia_tutorial/index.html +++ b/dev/julia_tutorial/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/matrix_matrix/index.html b/dev/matrix_matrix/index.html index bf9ca1d..fb3e849 100644 --- a/dev/matrix_matrix/index.html +++ b/dev/matrix_matrix/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/mpi_collectives/index.html b/dev/mpi_collectives/index.html index e7fc21f..19ed10b 100644 --- a/dev/mpi_collectives/index.html +++ b/dev/mpi_collectives/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/mpi_tutorial/index.html b/dev/mpi_tutorial/index.html index bcc391b..4bcb366 100644 --- a/dev/mpi_tutorial/index.html +++ b/dev/mpi_tutorial/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/notebook-hello/index.html b/dev/notebook-hello/index.html index 4a775f0..c829706 100644 --- a/dev/notebook-hello/index.html +++ b/dev/notebook-hello/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/pdes/index.html b/dev/pdes/index.html index d9e4788..1c57129 100644 --- a/dev/pdes/index.html +++ b/dev/pdes/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/solutions/index.html b/dev/solutions/index.html index edc9560..e095033 100644 --- a/dev/solutions/index.html +++ b/dev/solutions/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); - + diff --git a/dev/solutions_for_all_notebooks/index.html b/dev/solutions_for_all_notebooks/index.html index ab2edc1..11e19c4 100644 --- a/dev/solutions_for_all_notebooks/index.html +++ b/dev/solutions_for_all_notebooks/index.html @@ -333,4 +333,4 @@ end

« Traveling salesperson problem
+end diff --git a/dev/tsp.ipynb b/dev/tsp.ipynb index 06263f5..8ad88e9 100644 --- a/dev/tsp.ipynb +++ b/dev/tsp.ipynb @@ -72,7 +72,7 @@ "## The traveling sales person (TSP) problem\n", "\n", "\n", - "In this notebook, we will study another algorithm that works with graphs, the [traveling sales person (TSP) problem](https://en.wikipedia.org/wiki/Travelling_salesman_problem). The classical formulation of this problem is as follows (quoted from Wikipedia) \"Given a list of cities and the distances between each pair of cities, what is the shortest possible route that visits each city exactly once?\" This problem has applications in combinatorial optimization, theoretical computer science, and operations research. It is very expensive problem to solve (NP-hard problem), which makes parallel computing often required to solve it.\n", + "In this notebook, we will study another algorithm that works with graphs, the [traveling sales person (TSP) problem](https://en.wikipedia.org/wiki/Travelling_salesman_problem). The classical formulation of this problem is as follows (quoted from Wikipedia) \"Given a list of cities and the distances between each pair of cities, what is the shortest possible route that visits each city exactly once?\" This problem has applications in combinatorial optimization, theoretical computer science, and operations research. It is a very expensive problem to solve (NP-hard problem), which makes parallel computing often required.\n", "\n", "
\n", "Note: There are two key variations of this problem. One in which the sales person returns to the initial city, and another in which the sales person does not return to the initial city. We will consider the second variant for simplicity.\n", @@ -265,7 +265,22 @@ "id": "f769627c", "metadata": {}, "source": [ - " This returns a vector of tuples that contains information about the connections to this city of the form (destination, distance). In this case, city 3 is connected to city 3 at distance 0 (itself), then with city 1 at distance 3, then with city 4 at distance 3, and finally with city 2 at distance 4. Note that the connections are sorted by their distance in ascending order (here is where the nearest city first heuristic is used). " + " This returns a vector of tuples that contains information about the connections to this city of the form (destination, distance). In this case, city 3 is connected to city 3 at distance 0 (itself), then with city 1 at distance 3, then with city 4 at distance 3, and finally with city 2 at distance 4. Note that the connections are sorted by their distance in ascending order (here is where the nearest city first heuristic is used). Remember the graph with the distance between cities:" + ] + }, + { + "attachments": { + "g27477.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "6758ba5d", + "metadata": {}, + "source": [ + "
\n", + "\n", + "
" ] }, { diff --git a/dev/tsp/index.html b/dev/tsp/index.html index 14b9c45..a24accb 100644 --- a/dev/tsp/index.html +++ b/dev/tsp/index.html @@ -14,4 +14,4 @@ var myIframe = document.getElementById("notebook"); iFrameResize({log:true}, myIframe); }); -
+ diff --git a/dev/tsp_src/index.html b/dev/tsp_src/index.html index 3975795..a9dd779 100644 --- a/dev/tsp_src/index.html +++ b/dev/tsp_src/index.html @@ -7591,7 +7591,7 @@ a.anchor-link {
+
+ +
+