-- -*- mode: eiffel -*-
-- $Id: matrix.se,v 1.3 2001/05/23 18:28:58 doug Exp $
-- http://www.bagley.org/~doug/shootout/
-- from Steve Thompson

-- <LOC-OFF>
indexing
   description: "This class performs the matrix multiplication test" 
   author : Steve Thompson
   email  : "Steve_Thompson@prodigy.net"
   date   : February 18, 2001
   compile: "compile -clean -boost -no_split -O3 main.e -o main"
   run    : "main 300"
-- <LOC-ON>
   
class MATRIX
   
creation make
   
feature -- Creation
   
   make is
      local
     index, count: INTEGER
     m1, m2: like matrix
      do
     from
        if argument_count < 1 then 
           count := 1
        else 
           count := argument(1).to_integer
        end
        index := 0
        m1 := new_matrix(30, 30) 
        m2 := new_matrix(30, 30) 
        !!matrix.make(0, 29, 0, 29)
     until
        index = count
     loop
        mmult(30, 30, m1, m2)
        index := index + 1
     end -- from
     print(matrix.item(0, 0).to_string + " " + matrix.item(2, 3).to_string + " " +
           matrix.item(3, 2).to_string + " " + matrix.item(4, 4).to_string + "%N")
      end -- make
   
feature -- Queries
   
   matrix: ARRAY2[INTEGER]
   
   new_matrix(rows, columns: INTEGER): like matrix is
     -- Create and populate a new matrix.
      local
     i, j, count: INTEGER
      do
     !!Result.make(0, rows - 1, 0, columns - 1)
     from 
        count := 1
        i := 0
     until i = rows loop
        from j := 0 until j = columns loop
           Result.put(count, i, j)
           count := count + 1
           j := j + 1
        end 
        i := i + 1
     end
      end -- new_matrix
   
feature -- Commands
   
   zero_matrix(rows, columns: INTEGER; a_matrix: like matrix) is
     -- Clear a matrix
      do
     matrix.make(0, rows - 1, 0, columns - 1)
      end -- zero_matrix
   
   mmult(rows, columns: INTEGER; first, second: like matrix) is
     -- Multiply two matrices.
      local
     i, j, k, val: INTEGER
      do
     zero_matrix(rows, columns, matrix)
     from i := 0 until i = rows loop
        from j := 0 until j = columns loop
           val := 0
           from k := 0 until k = columns loop
          val := val + first.item(i, k) * second.item(k, j)
          k := k + 1
           end
           matrix.put(val, i, j)
           j := j + 1
        end
        i := i + 1
     end -- from
      end -- mmult
   
end