@@ -26,66 +26,66 @@ template <typename T, typename... Tys>
2626extern T __enzyme_todense (Tys...) noexcept ;
2727
2828// / Sparse storage for Enzyme
29- template <typename T >
29+ template <typename ScalarT >
3030struct Triple
3131{
32- size_t row;
33- size_t col;
34- T val;
32+ size_t row;
33+ size_t col;
34+ ScalarT val;
3535 Triple (Triple&&) = default ;
3636
37- Triple (size_t row, size_t col, T val)
37+ Triple (size_t row, size_t col, ScalarT val)
3838 : row(row),
3939 col (col),
4040 val(val)
4141 {
4242 }
4343};
4444
45- __attribute__ ((enzyme_sparse_accumulate)) static void inner_storeflt(int64_t row, int64_t col, float val, std::vector<Triple<float >>& triplets)
45+ [[maybe_unused]] __attribute__((enzyme_sparse_accumulate)) static void inner_storeflt (size_t row, size_t col, float val, std::vector<Triple<float >>& triplets)
4646{
4747 triplets.emplace_back (row, col, val);
4848}
4949
50- __attribute__ ((enzyme_sparse_accumulate)) static void inner_storedbl(int64_t row, int64_t col, double val, std::vector<Triple<double >>& triplets)
50+ [[maybe_unused]] __attribute__((enzyme_sparse_accumulate)) static void inner_storedbl (size_t row, size_t col, double val, std::vector<Triple<double >>& triplets)
5151{
5252 triplets.emplace_back (row, col, val);
5353}
5454
55- template <typename T >
56- __attribute__ ((always_inline)) static void sparse_store(T val, int64_t idx, size_t i, std::vector<Triple<T >>& triplets)
55+ template <typename ScalarT >
56+ __attribute__ ((always_inline)) static void sparse_store(ScalarT val, size_t idx, size_t i, std::vector<Triple<ScalarT >>& triplets)
5757{
5858 if (val == 0.0 )
5959 return ;
60- idx /= sizeof (T );
61- if constexpr (sizeof (T ) == 4 )
60+ idx /= sizeof (ScalarT );
61+ if constexpr (sizeof (ScalarT ) == 4 )
6262 inner_storeflt (idx, i, val, triplets);
6363 else
6464 inner_storedbl (idx, i, val, triplets);
6565}
6666
67- template <typename T >
68- __attribute__ ((always_inline)) static T sparse_load(int64_t idx , size_t i , std::vector<Triple<T >>& triplets )
67+ template <typename ScalarT >
68+ __attribute__ ((always_inline)) static ScalarT sparse_load(size_t , size_t , std::vector<Triple<ScalarT >>&)
6969{
7070 return 0.0 ;
7171}
7272
73- template <typename T >
74- __attribute__ ((always_inline)) static void ident_store(T, int64_t idx , size_t i )
73+ template <typename ScalarT >
74+ __attribute__ ((always_inline)) static void ident_store(ScalarT, size_t , size_t )
7575{
7676 assert (0 && " should never load" );
7777}
7878
79- template <typename T >
80- __attribute__ ((always_inline)) static T ident_load(int64_t idx, size_t i)
79+ template <typename ScalarT >
80+ __attribute__ ((always_inline)) static ScalarT ident_load(size_t idx, size_t i)
8181{
82- idx /= sizeof (T );
83- return (T ) (idx == i);
82+ idx /= sizeof (ScalarT );
83+ return (ScalarT ) (idx == i);
8484}
8585
8686// / Vector-valued function to differentiate
87- template <typename T >
88- __attribute__ ((always_inline)) static void f(size_t N, T * input, T * output)
87+ template <typename ScalarT >
88+ __attribute__ ((always_inline)) static void f(size_t N, ScalarT * input, ScalarT * output)
8989{
9090 for (size_t idx = 0 ; idx < N; ++idx)
9191 {
@@ -98,15 +98,15 @@ __attribute__((always_inline)) static void f(size_t N, T* input, T* output)
9898}
9999
100100// / Reference Jacobian
101- template <typename T >
102- void jac_f_ref (std::vector<T > x, std::vector<T > y, SparseMatrix& jac)
101+ template <typename ScalarT >
102+ void jac_f_ref (std::vector<ScalarT > x, std::vector<ScalarT > y, SparseMatrix& jac)
103103{
104- std::vector<size_t > ctemp{};
105- std::vector<size_t > rtemp{};
106- std::vector<T> valtemp{};
107- for (int idy = 0 ; idy < y.size (); ++idy)
104+ std::vector<size_t > ctemp{};
105+ std::vector<size_t > rtemp{};
106+ std::vector<ScalarT> valtemp{};
107+ for (size_t idy = 0 ; idy < y.size (); ++idy)
108108 {
109- for (int idx = 0 ; idx < x.size (); ++idx)
109+ for (size_t idx = 0 ; idx < x.size (); ++idx)
110110 {
111111 if (idy <= idx)
112112 {
@@ -120,29 +120,29 @@ void jac_f_ref(std::vector<T> x, std::vector<T> y, SparseMatrix& jac)
120120}
121121
122122// / Function that computes the Jacobian via automatic differentiation
123- template <typename T >
124- __attribute__ ((noinline)) void jac_f(size_t N, T * input, SparseMatrix& jac)
123+ template <typename ScalarT >
124+ __attribute__ ((noinline)) void jac_f(size_t N, ScalarT * input, SparseMatrix& jac)
125125{
126- std::vector<Triple<T >> triplets;
126+ std::vector<Triple<ScalarT >> triplets;
127127 for (size_t i = 0 ; i < N; i++)
128128 {
129- T * output = __enzyme_todense<T *>((void *) ident_load<T >, (void *) ident_store<T >, i);
130- T * d_output = __enzyme_todense<T *>((void *) sparse_load<T >, (void *) sparse_store<T >, i, &triplets);
129+ ScalarT * output = __enzyme_todense<ScalarT *>((void *) ident_load<ScalarT >, (void *) ident_store<ScalarT >, i);
130+ ScalarT * d_output = __enzyme_todense<ScalarT *>((void *) sparse_load<ScalarT >, (void *) sparse_store<ScalarT >, i, &triplets);
131131
132- __enzyme_fwddiff<void >((void *) f<T >,
132+ __enzyme_fwddiff<void >((void *) f<ScalarT >,
133133 enzyme_const,
134134 N,
135135 enzyme_dup,
136136 input,
137137 output,
138138 enzyme_dupnoneed,
139- (T *) 0x1 ,
139+ (ScalarT *) 0x1 ,
140140 d_output);
141141 }
142142
143- std::vector<size_t > ctemp{};
144- std::vector<size_t > rtemp{};
145- std::vector<T> valtemp{};
143+ std::vector<size_t > ctemp{};
144+ std::vector<size_t > rtemp{};
145+ std::vector<ScalarT> valtemp{};
146146 for (auto & tup : triplets)
147147 {
148148 rtemp.push_back (tup.row );
@@ -159,7 +159,7 @@ void check(SparseMatrix matrix_1, SparseMatrix matrix_2, int& fail)
159159 const auto [rcord_1, ccord_1, vals_1] = entries_1;
160160 std::tuple<std::vector<size_t >&, std::vector<size_t >&, std::vector<double >&> entries_2 = matrix_2.getEntries ();
161161 const auto [rcord_2, ccord_2, vals_2] = entries_2;
162- for (int ind = 0 ; ind < vals_1.size (); ++ind)
162+ for (size_t ind = 0 ; ind < vals_1.size (); ++ind)
163163 {
164164 if (rcord_1[ind] != rcord_2[ind])
165165 fail++;
@@ -181,7 +181,7 @@ int main()
181181
182182 // / Input initialization
183183 double val = 0.0 ;
184- for (int i = 0 ; i < N; ++i)
184+ for (size_t i = 0 ; i < N; ++i)
185185 {
186186 x[i] = val;
187187 val += 1.0 ;
0 commit comments