program pagerank
  ! Il programma calcola il pagerank data una matrice di link
  ! la matrice sara` contenuta nel file matrice.ful che e`
  ! un file di testo con il seguente formato:
  ! - la prima riga e` un numero e indica la dimensione della matrice
  ! - le succesive righe contengono gli elementi della matrice separati
  !   da spazi
  implicit none

  integer :: ios,n,k,maxiter=100
  real(8),allocatable,dimension(:) :: v,w
  real(8),allocatable,dimension(:,:) :: matrice
  character(11) :: filename="matrice.ful"

  open(unit=1,iostat=ios,file=filename,status="old",action="read")
  if (ios/=0) then
     write(*,'(a)') "Non riesco ad aprire il file " ,filename
     stop
  endif

  ! Legge la dimensione della matrice e gli elementi
  read(1,*) n
  allocate(matrice(n,n))
  do k=1,n
     read(1,*) matrice(k,1:n)
  end do
  
  ! Visualizza la matrice
  mostramatrice: do k=1,n
     write(*,*) matrice(k,1:n)
  end do mostramatrice

  ! Calcola la matrice stocastica
  allocate(v(n)) ! v conterra` la somma per riga
  v=sum(matrice,dim=2)

  rendestoc: do k=1,n
     matrice(k,1:n)=matrice(k,1:n)/v(k)
  end do rendestoc

  ! Metodo delle potenze
  allocate(w(n))
  v=1./n
  potenze: do k=1,maxiter
     w=matmul(v,matrice)
     w=w/sum(w)
     if (sum(abs(v-w))<1.d-8) exit
     v=w
  end do potenze

  write(*,*) "Il pagerank e` "
  write(*,*) v
end program pagerank
