Lindo Systems

! Compute the Google Page rank of a set of 
  connected pages;
! Keywords: Google, Page rank, World wide web;
SETS:
  Page: x, deg;
  PXP( Page, Page);
ENDSETS
DATA:
  alpha = .95; ! 1-alpha = seed value for the page rank,
                e.g., every page has a rank of at least 1-alpha;
 ! The pages;
  Page = 1..10;
 ! The page i points to page j pairs;
   PXP= 1,10
        2,6
        3,10
        4,5
        5,3
        6,1
        6,3
        6,4
        7,2
        8,2
        9,7
       10,9;
 ENDDATA
 
 SUBMODEL pagerank:
 ! Solve for the page rank. Page j has a high page rank if
   page i points to j, page i has a high page rank, and 
   page i does not point to lots of pages;
   @FOR( Page(j):
      x(j) = (1-alpha) + alpha* @SUM(PXP(i,j)| i #NE# j: x(i)/deg(i));
       );
 ENDSUBMODEL
 
 CALC:
  ! Compute the outdegree, i.e., pages pointed to, of each page;
  @FOR( Page(i): deg(i) = 0);
  @FOR( PXP(i,j)| i #NE# j:
     deg(i) = deg(i) + 1;
      );
   @SOLVE( pagerank);
 ! Optionally scale so ranks sum to a specified target, e.g. 1;
   CURSUM = @SUM( Page(i): x(i));
   @FOR( Page(i):
      x(i) = x(i)/CURSUM
       );
 ENDCALC