/ tests / tests / execution / generic_matrix_mult.adl
generic_matrix_mult.adl
 1  /*
 2  seed = 123456789
 3  min_height = 16
 4  
 5  [case]
 6  program = "test.alpha"
 7  function = "main_1"
 8  input = []
 9  [case]
10  program = "test.alpha"
11  function = "main_2"
12  input = []
13  */
14  
15  program test.alpha {
16      const M_: u32 = 2u32; // Rows in A
17      const K_: u32 = 3u32; // Columns in A / Rows in B
18      const N_: u32 = 2u32; // Columns in B
19  
20      struct Matrix::[M: u32, N: u32] {
21          data: [[i32; N]; M]
22      }
23  
24      transition main_1() -> Matrix::[M_, N_] {
25          // Matrix A: 2x3
26          let A = Matrix::[M_, K_] {
27              data: [
28                  [1i32, 2i32, 3i32],
29                  [4i32, 5i32, 6i32]
30              ]
31          };
32  
33          // Matrix B: 3x2
34          let B = Matrix::[K_, N_] {
35              data: [
36                  [7i32, 8i32],
37                  [9i32, 10i32],
38                  [11i32, 12i32]
39              ]
40          };
41  
42          // Compute matrix product: C = A * B
43          let C = matmul::[M_, K_, N_](A, B);
44  
45          return C;
46      }
47  
48      transition main_2() -> bool {
49          let A = Matrix::[K_, K_] {
50              data: [
51                  [1i32, 2i32, 3i32],
52                  [2i32, 4i32, 5i32],
53                  [3i32, 5i32, 6i32]
54              ]
55          };
56  
57          return is_symmetric::[3](A);
58      }
59  
60      // Multiplies two matrices wrapped in the `Matrix` struct
61      inline matmul::[M: u32, K: u32, N: u32](
62          A: Matrix::[M, K],
63          B: Matrix::[K, N]
64      ) -> Matrix::[M, N] {
65          let C_data: [[i32; N]; M] = [[0i32; N]; M];
66  
67          for i in 0u32..M {
68              for j in 0u32..N {
69                  let sum = 0i32;
70                  for k in 0u32..K {
71                      sum += A.data[i][k] * B.data[k][j];
72                  }
73                  C_data[i][j] = sum;
74              }
75          }
76  
77          return Matrix::[M, N] { data: C_data };
78      }
79  
80      // Checks if a square matrix is symmetric
81      inline is_symmetric::[N: u32](A: Matrix::[N, N]) -> bool {
82          for i in 0u32..N-1 {
83              for j in (i + 1u32)..N { // Only check upper triangle
84                  if A.data[i][j] != A.data[j][i] {
85                      return false;
86                  }
87              }
88          }
89          return true;
90      }
91  
92      @noupgrade
93      async constructor() {}
94  }