commit ee71bfbd5d94d2708084f72116c0501c98a621ae Author: Claudio Maggioni Date: Thu Sep 17 11:43:56 2020 +0200 mp1: added template diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..79ba647 --- /dev/null +++ b/.gitignore @@ -0,0 +1,147 @@ +*.ijvm +*.mic1 + +# ---> TeX +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc + +## Intermediate documents: +*.dvi +*-converted-to.* +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +# *.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.brf +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync + +## Auxiliary and intermediate files from other packages: + + +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.snm +*.vrb + +#(e)ledmac/(e)ledpar +*.end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls + +# gnuplottex +*-gnuplottex-* + +# hyperref +*.brf + +# knitr +*-concordance.tex +*.tikz +*-tikzDictionary + +# listings +*.lol + +# makeidx +*.idx +*.ilg +*.ind +*.ist + +# minitoc +*.maf +*.mtc +*.mtc[0-9] +*.mtc[1-9][0-9] + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# mylatexformat +*.fmt + +# nomencl +*.nlo + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# todonotes +*.tdo + +# xindy +*.xdy + +# WinEdt +*.bak +*.sav + +# Mac stupid tmp files +.DS_Store + +!*.pdf + +*~ diff --git a/mp1/Makefile b/mp1/Makefile new file mode 100644 index 0000000..3698b37 --- /dev/null +++ b/mp1/Makefile @@ -0,0 +1,13 @@ +filename=template + +pdf: + pdflatex ${filename} + pdflatex ${filename} + make clean + +read: + evince ${filename}.pdf & + + +clean: + rm -f ${filename}.out ${filename}.log ${filename}.bbl ${filename}.blg ${filename}.au ${filename}.log ${filename}.ps ${filename}.aux ${filename}.out ${filename}.dvi ${filename}.bbl ${filename}.blg ${filename}.toc ${filename}.nav ${filename}.vrb ${filename}.snm diff --git a/mp1/assignment.sty b/mp1/assignment.sty new file mode 100644 index 0000000..54ff904 --- /dev/null +++ b/mp1/assignment.sty @@ -0,0 +1,95 @@ +\usepackage{ifthen} +\usepackage[utf8]{inputenc} +\usepackage{graphics} +\usepackage{graphicx} +\usepackage{hyperref} + +\pagestyle{plain} +\voffset -5mm +\oddsidemargin 0mm +\evensidemargin -11mm +\marginparwidth 2cm +\marginparsep 0pt +\topmargin 0mm +\headheight 0pt +\headsep 0pt +\topskip 0pt +\textheight 255mm +\textwidth 165mm + +\newcommand{\duedate} {} +\newcommand{\setduedate}[1]{% +\renewcommand\duedate {Due date:~ #1}} +\newcommand\isassignment {false} +\newcommand{\setassignment}{\renewcommand\isassignment {true}} +\newcommand{\ifassignment}[1]{\ifthenelse{\boolean{\isassignment}}{#1}{}} +\newcommand{\ifnotassignment}[1]{\ifthenelse{\boolean{\isassignment}}{}{#1}} + +\newcommand{\assignmentpolicy}{ +\begin{table}[h] +\begin{center} +\scalebox{0.8} {% +\begin{tabular}{|p{0.02cm}p{16cm}|} +\hline +&\\ +\multicolumn{2}{|c|}{\Large\textbf{Numerical Computing 2020 --- Submission Instructions}}\\ +\multicolumn{2}{|c|}{\large\textbf{(Please, notice that following instructions are mandatory: }}\\ +\multicolumn{2}{|c|}{\large\textbf{submissions that don't comply with, won't be considered)}}\\ +&\\ +\textbullet & Assignments must be submitted to \href{https://www.icorsi.ch/course/view.php?id=10018}{iCorsi} (i.e. in electronic format).\\ +\textbullet & Provide both executable package and sources (e.g. C/C++ files, Matlab). +If you are using libraries, please add them in the file. Sources must be organized in directories called:\\ +\multicolumn{2}{|c|}{\textit{Project\_number\_lastname\_firstname}}\\ +& and the file must be called:\\ +\multicolumn{2}{|c|}{\textit{project\_number\_lastname\_firstname.zip}}\\ +\multicolumn{2}{|c|}{\textit{project\_number\_lastname\_firstname.pdf}}\\ +\textbullet & The TAs will grade your project by reviewing your project write-up, and looking at the implementation + you attempted, and benchmarking your code's performance.\\ + +\textbullet & You are allowed to discuss all questions with anyone you like; however: (i) your submission must list anyone you discussed problems with and (ii) you must write up your submission independently.\\ +\hline +\end{tabular} +} +\end{center} +\end{table} +} +\newcommand{\punkte}[1]{\hspace{1ex}\emph{\mdseries\hfill(#1~\ifcase#1{Points}\or{Points}\else{Points}\fi)}} + + +\newcommand\serieheader[6]{ +\thispagestyle{empty}% +\begin{flushleft} +\includegraphics[width=0.4\textwidth]{usi_inf} +\end{flushleft} + \noindent% + {\large\ignorespaces{\textbf{#1}}\hspace{\fill}\ignorespaces{ \textbf{#2}}}\\ \\% + {\large\ignorespaces #3 \hspace{\fill}\ignorespaces #4}\\ + \noindent% + \bigskip + \hrule\par\bigskip\noindent% + \bigskip {\ignorespaces {\Large{\textbf{#5}}} + \hspace{\fill}\ignorespaces \large \ifthenelse{\boolean{\isassignment}}{\duedate}{#6}} + \hrule\par\bigskip\noindent% \linebreak + } + +\makeatletter +\def\enumerateMod{\ifnum \@enumdepth >3 \@toodeep\else + \advance\@enumdepth \@ne + \edef\@enumctr{enum\romannumeral\the\@enumdepth}\list + {\csname label\@enumctr\endcsname}{\usecounter + {\@enumctr}%%%? the following differs from "enumerate" + \topsep0pt% + \partopsep0pt% + \itemsep0pt% + \def\makelabel##1{\hss\llap{##1}}}\fi} +\let\endenumerateMod =\endlist +\makeatother + + + + +\usepackage{textcomp} + + + + diff --git a/mp1/files_data/ETH500.mat b/mp1/files_data/ETH500.mat new file mode 100644 index 0000000..2221bfb Binary files /dev/null and b/mp1/files_data/ETH500.mat differ diff --git a/mp1/files_data/pagerank.m b/mp1/files_data/pagerank.m new file mode 100644 index 0000000..3d8d801 --- /dev/null +++ b/mp1/files_data/pagerank.m @@ -0,0 +1,56 @@ +function x = pagerank(U,G,p) +% PAGERANK Google's PageRank +% pagerank(U,G,p) uses the URLs and adjacency matrix produced by SURFER, +% together with a damping factory p, (default is .85), to compute and plot +% a bar graph of page rank, and print the dominant URLs in page rank order. +% x = pagerank(U,G,p) returns the page ranks instead of printing. +% See also SURFER, SPY. + +if nargin < 3, p = .85; end + +% Eliminate any self-referential links +%G = G - diag(diag(G)); + +% c = out-degree, r = in-degree +[~,n] = size(G); +c = sum(G,1); +r = sum(G,2); + +% Scale column sums to be 1 (or 0 where there are no out links). +k = find(c~=0); +D = sparse(k,k,1./c(k),n,n); + +e = ones(n,1); +I = speye(n,n); + +% ---------------------------------- DEFAULT ------------------------------ +% Solve (I - p*G*D)*x = e +disp('Using default implementation\n'); +x = (I - p*G*D)\e; + +% ------------------------------------------------------------------------- + +% Normalize so that sum(x) == 1. +x = x/sum(x); + +% Bar graph of page rank. +shg +bar(x) +title('Page Rank') + +% Print URLs in page rank order. + +if nargout < 1 + [~,q] = sort(-x); + disp(' page-rank in out url') + k = 1; + maxN = length(U); + while (k <= maxN) && (x(q(k)) >= .005) + disp(k) + j = q(k); + temp1 = r(j); + temp2 = c(j); + disp(fprintf(' %3.0f %8.4f %4.0f %4.0f %s', j,x(j),full(temp1),full(temp2),U{j})) + k = k+1; + end +end diff --git a/mp1/files_data/surfer.m b/mp1/files_data/surfer.m new file mode 100644 index 0000000..51bdecf --- /dev/null +++ b/mp1/files_data/surfer.m @@ -0,0 +1,149 @@ +function [U,G] = surfer(root,n) +% UPDATED VERSION + +% SURFER Create the adjacency graph of a portion of the Web. +% [U,G] = surfer(root,n) starts at the URL root and follows +% Web links until it forms an adjacency graph with n nodes. +% U = a cell array of n strings, the URLs of the nodes. +% G = an n-by-n sparse matrix with G(i,j)=1 if node j is linked to node i. +% +% Example: [U,G] = surfer('https://inf.ethz.ch/',500); +% See also PAGERANK. +% +% This function currently has two defects. (1) The algorithm for +% finding links is naive. We just look for the string 'http:'. +% (2) An attempt to read from a URL that is accessible, but very slow, +% might take an unacceptably long time to complete. In some cases, +% it may be necessary to have the operating system terminate MATLAB. +% Key words from such URLs can be added to the skip list in surfer.m. + +% Initialize + +clf +shg +set(gcf,'doublebuffer','on') +axis([0 n 0 n]) +axis square +axis ij +box on +set(gca,'position',[.12 .20 .78 .78]) +uicontrol('style','frame','units','normal','position',[.01 .09 .98 .07]); +uicontrol('style','frame','units','normal','position',[.01 .01 .98 .07]); +t1 = uicontrol('style','text','units','normal','position',[.02 .10 .94 .04], ... + 'horiz','left'); +t2 = uicontrol('style','text','units','normal','position',[.02 .02 .94 .04], ... + 'horiz','left'); +slow = uicontrol('style','toggle','units','normal', ... + 'position',[.01 .24 .07 .05],'string','slow','value',0); +quit = uicontrol('style','toggle','units','normal', ... + 'position',[.01 .17 .07 .05],'string','quit','value',0); + +U = cell(n,1); +hash = zeros(n,1); +G = logical(sparse(n,n)); +m = 1; +U{m} = root; +hash(m) = hashfun(root); + +j = 1; +while j < n && get(quit,'value') == 0 + + % Try to open a page. + + try + set(t1,'string',sprintf('%5d %s',j,U{j})) + set(t2,'string',''); + drawnow + page = urlread(U{j}); + catch + set(t1,'string',sprintf('fail: %5d %s',j,U{j})) + drawnow + j = j+1; + continue + end + if get(slow,'value') + pause(.25) + end + + % Follow the links from the open page. + + for f = strfind(page, 'https:') + + % A link starts with 'http:' and ends with the next quote. + + e = min([strfind(page(f:end),'"') strfind(page(f:end),'''')]); + if isempty(e), continue, end + url = deblank(page(f:f+e-2)); + url(url<' ') = '!'; % Nonprintable characters + if url(end) == '/', url(end) = []; end + + % Look for links that should be skipped. + + skips = {'.gif','.jpg','.jpeg','.pdf','.css','.asp','.mwc','.ram', ... + '.cgi','lmscadsi','cybernet','w3.org','google','yahoo', ... + 'scripts','netscape','shockwave','webex','fansonly', ... + 'idref.fr', 'purl.org', 'freedomdefined','wernfbox' }; + + skip = any(url=='!') | any(url=='?'); + k = 0; + while ~skip && (k < length(skips)) + k = k+1; + skip = ~isempty(strfind(url,skips{k})); + end + if skip + if ~contains(url,'.gif') && ~contains(url,'.jpg') + set(t2,'string',sprintf('skip: %s',url)) + drawnow + if get(slow,'value') + pause(.25) + end + end + continue + end + + % Check if page is already in url list. + + i = 0; + for k = find(hash(1:m) == hashfun(url))' + if isequal(U{k},url) + i = k; + break + end + end + + % Add a new url to the graph there if are fewer than n. + + if (i == 0) && (m < n) + m = m+1; + U{m} = url; + hash(m) = hashfun(url); + i = m; + end + + % Add a new link. + + if i > 0 + G(i,j) = 1; + set(t2,'string',sprintf('%5d %s',i,url)) + line(j,i,'marker','.','markersize',6) + drawnow + if get(slow,'value') + pause(.5) + end + end + end + + j = j+1; +end +delete(t1) +delete(t2) +delete(slow) +set(quit,'string','close','callback','close(gcf)','value',0) + + + +%------------------------ + +function h = hashfun(url) +% Almost unique numeric hash code for pages already visited. +h = length(url) + 1024*sum(url); diff --git a/mp1/template.pdf b/mp1/template.pdf new file mode 100644 index 0000000..6f50a80 Binary files /dev/null and b/mp1/template.pdf differ diff --git a/mp1/template.tex b/mp1/template.tex new file mode 100644 index 0000000..f9d9c67 --- /dev/null +++ b/mp1/template.tex @@ -0,0 +1,31 @@ +\documentclass[unicode,11pt,a4paper,oneside,numbers=endperiod,openany]{scrartcl} + +\input{assignment.sty} +\begin{document} + + +\setassignment +\setduedate{Thursday, 8 October 2020, 12:00 AM} + +\serieheader{Numerical Computing}{2020}{Student: Claudio Maggioni}{Discussed with: --}{Solution for Project 1}{} +\newline + +\assignmentpolicy +The purpose of this assignment\footnote{This document is originally based on a SIAM book chapter from \textsl{Numerical Computing with Matlab} from Clever B. Moler.} is to learn the importance of numerical linear algebra algorithms to solve fundamental linear algebra problems that occur in search engines. + + + +\section{Page-Rank Algorithm } + +\subsection{Theory [20 points]} + +\subsection{Other webgraphs [10 points]} + +\subsection{Connectivity matrix and subcliques [10 points]} + +\subsection{Connectivity matrix and disjoint subgraphs [10 points]} + +\subsection{PageRanks by solving a sparse linear system [50 points]} + + +\end{document} diff --git a/mp1/usi_inf.pdf b/mp1/usi_inf.pdf new file mode 100644 index 0000000..b89da51 Binary files /dev/null and b/mp1/usi_inf.pdf differ