1 /*
2 
3 Copyright (C) 2008-2021 Michele Martone
4 
5 This file is part of librsb.
6 
7 librsb is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published
9 by the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11 
12 librsb is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
15 License for more details.
16 
17 You should have received a copy of the GNU Lesser General Public
18 License along with librsb; see the file COPYING.
19 If not, see <http://www.gnu.org/licenses/>.
20 
21 */
22 /* @cond INNERDOC */
23 /**
24  * @file
25  * @author Michele Martone
26  * @brief  Sparse BLAS interface internals
27  * */
28 #ifndef LIBSPBLAS_HANDLE_H_INCLUDED
29 #define LIBSPBLAS_HANDLE_H_INCLUDED
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif /* __cplusplus */
34 
35 #include "rsb.h"
36 #include "blas_sparse/blas_enum.h"
37 #include "rsb_libspblas.h"
38 #include "rsb_internals.h"
39 
40 #define RSB_BLAS_FIRST_HANDLE 1024
41 #define RSB_BLAS_LAST_HANDLE (RSB_MAX_VALUE_FOR_TYPE(blas_sparse_matrix)-1)
42 #define RSB_BLAS_MATRICES_MAX (RSB_BLAS_LAST_HANDLE-RSB_BLAS_FIRST_HANDLE+1)
43 #define RSB_BLAS_HANDLE_INVALID (RSB_BLAS_LAST_HANDLE+1)
44 #define RSB_BLAS_INT_MAX RSB_MAX_VALUE_FOR_TYPE(rsb_blas_int_t)
45 
46 #define RSB_BLAS_HANDLE_TO_RSB_ERROR(HANDLE) (HANDLE==(RSB_BLAS_HANDLE_INVALID)?RSB_ERR_GENERIC_ERROR:RSB_ERR_NO_ERROR)
47 
48 #define RSB_ERROR_TO_BLAS_ERROR(E) (((E)==RSB_ERR_NO_ERROR)?(RSB_BLAS_NO_ERROR):(RSB_BLAS_ERROR))
49 #define RSB_BLAS_ERROR_TO_RSB_ERROR(E) (((E)==RSB_BLAS_NO_ERROR)?(RSB_ERR_NO_ERROR):(RSB_ERR_GENERIC_ERROR))
50 #define RSB_BLAS_WANT_EXPERIMENTAL_TUNING RSB_WANT_OMP_RECURSIVE_KERNELS	/* FIXME: this is experimental */
51 
52 #define RSB_BLAS_UPLO_CHAR(UPLO) ((UPLO)==blas_lower_triangular?'L':'U')
53 #define RSB_BLAS_DIAG_CHAR(DIAG) ((DIAG)==blas_non_unit_diag?'E':'I')
54 #define RSB_BLAS_INVALID_VAL -1
55 
56 #define RSB_SPB_INTERFACE_PREAMBLE RSB_INTERFACE_PREAMBLE
57 #define RSB_SPB_INTERFACE_RETURN(EXP) { int istat = EXP; RSB_INTERFACE_ENDCMD RSB_DO_ERR_MANIFEST_INTERFACE(RSB_BLAS_ERROR_TO_RSB_ERROR(istat)) return istat; }
58 #define RSB_SPB_INTERFACE_RETURN_HDL(EXP) { int handle = EXP; RSB_INTERFACE_ENDCMD RSB_DO_ERR_MANIFEST_INTERFACE(RSB_BLAS_HANDLE_TO_RSB_ERROR(handle)) return handle; }
59 #define RSB_SPB_INTERFACE_RETURN_VOID() { RSB_INTERFACE_ENDCMD return; }
60 #define RSB_SPB_INTERFACE_RETURN_EXP(EXP) { RSB_INTERFACE_ENDCMD return (EXP); }
61 
62 /*typedef rsb_blas_sparse_matrix_handle_t blas_sparse_matrix;*/
63 
64 /*!
65  * \ingroup rsb_doc_sparse_blas
66  * \brief An internal, helper structure.
67  * \internal
68  */
69 struct rsb_blas_sparse_matrix_t
70 {
71 	struct rsb_mtx_t * mtxAp;
72 	struct rsb_coo_matrix_t coomatrix;
73 	rsb_nnz_idx_t nnzin;
74 	blas_sparse_matrix handle;
75 	/* rsb_blas_int_t prop ;*/
76 	int k, l, off;
77 	int*rbp,*cbp;
78 	enum blas_handle_type   type;
79 	enum blas_diag_type diag_type;
80 	enum blas_symmetry_type symmetry;
81 	enum blas_base_type base;
82 	enum blas_order_type order;
83 	enum blas_field_type fprecision;
84 	enum blas_field_type field;
85 	enum blas_sparsity_optimization_type sparsity_optimization_type;
86 	enum blas_rsb_ext_type dupstra;
87 	enum blas_rsb_ext_type fmt_hint;
88 #if RSB_BLAS_WANT_EXPERIMENTAL_TUNING
89 	rsb_thread_t opt_mvn_hint, opt_mvt_hint;
90 #endif
91 /*  	we should also deal with :
92 blas_order_type
93 blas_trans_type
94 blas_uplo_type
95 blas_diag_type
96 blas_side_type
97 blas_cmach_type
98 blas_norm_type
99 blas_sort_type
100 blas_conj_type
101 blas_jrot_type
102 blas_prec_type
103 blas_base_type
104 blas_symmetry_type
105 blas_field_type
106 blas_size_type
107 blas_handle_type
108 blas_sparsity_optimization_type
109  */
110 };
111 
112 
113 
114 rsb_err_t rsb__BLAS_is_type_supported(rsb_char_t c);
115 struct rsb_mtx_t * rsb__BLAS_inner_matrix_retrieve(blas_sparse_matrix handle);
116 blas_sparse_matrix rsb__BLAS_Xuscr_begin( rsb_blas_int_t m, rsb_blas_int_t n, rsb_type_t typecode);
117 blas_sparse_matrix rsb__BLAS_Xuscr_block_begin( rsb_blas_int_t Mb, rsb_blas_int_t Nb, rsb_blas_int_t k, rsb_blas_int_t l, rsb_type_t typecode);
118 blas_sparse_matrix rsb__BLAS_Xuscr_variable_block_begin( rsb_blas_int_t Mb, rsb_blas_int_t Nb, const rsb_blas_int_t *k, const rsb_blas_int_t *l, rsb_type_t typecode);
119 rsb_blas_int_t rsb__BLAS_Xuscr_insert_entry( blas_sparse_matrix A, const void * valp, rsb_blas_int_t i, rsb_blas_int_t j );
120 rsb_blas_int_t rsb__BLAS_Xuscr_insert_entries( blas_sparse_matrix A, rsb_blas_int_t nz, const void * val, const rsb_blas_int_t *indx, const rsb_blas_int_t *jndx );
121 rsb_blas_int_t rsb__BLAS_Xuscr_insert_col( blas_sparse_matrix A, rsb_blas_int_t j, rsb_blas_int_t nz, const void * val, const rsb_blas_int_t *indx );
122 rsb_blas_int_t rsb__BLAS_Xuscr_insert_row( blas_sparse_matrix A, rsb_blas_int_t i, rsb_blas_int_t nz, const void * val, const rsb_blas_int_t *jndx );
123 rsb_blas_int_t rsb__BLAS_Xuscr_insert_clique( blas_sparse_matrix A, const rsb_blas_int_t k, const rsb_blas_int_t l, const void * val, const rsb_blas_int_t row_stride, const rsb_blas_int_t col_stride, const rsb_blas_int_t *indx, const rsb_blas_int_t *jndx );
124 rsb_blas_int_t rsb__BLAS_Xuscr_insert_block( blas_sparse_matrix A, const void * val, rsb_blas_int_t row_stride, rsb_blas_int_t col_stride, rsb_blas_int_t i, rsb_blas_int_t j);
125 rsb_blas_int_t rsb__BLAS_Xuscr_end( blas_sparse_matrix A);
126 rsb_blas_int_t rsb__BLAS_Xuscr_end_flagged( blas_sparse_matrix A, const rsb_flags_t*flagsp);
127 
128 rsb_blas_int_t rsb__BLAS_usgp( blas_sparse_matrix A, rsb_blas_int_t pname );
129 rsb_blas_int_t rsb__BLAS_ussp( blas_sparse_matrix A, rsb_blas_int_t pname );
130 rsb_blas_int_t rsb__BLAS_Xusds( blas_sparse_matrix A );
131 rsb_trans_t rsb__blas_trans_to_rsb_trans(enum blas_trans_type trans);
132 rsb_trans_t rsb__do_psblas_trans_to_rsb_trans(const char trans);
133 rsb_order_t rsb_blas_order_to_rsb_order(enum blas_order_type order);
134 blas_sparse_matrix rsb__BLAS_new_matrix_begin(rsb_coo_idx_t m, rsb_coo_idx_t k, rsb_nnz_idx_t nnzest, rsb_type_t typecode, rsb_coo_idx_t br, rsb_coo_idx_t bc, const rsb_coo_idx_t*rbp, const rsb_coo_idx_t*cbp);
135 rsb_err_t rsb__BLAS_handles_free(void);
136 
137 int rsb__BLAS_Xusrows_scale(blas_sparse_matrix A,const void * d,enum blas_trans_type trans);
138 int rsb__BLAS_Xusget_diag(blas_sparse_matrix A,void * d);
139 int rsb__BLAS_Xusget_rows_sparse(blas_sparse_matrix A,void *  VA, rsb_blas_int_t * IA, rsb_blas_int_t * JA, rsb_blas_int_t * nnz, rsb_blas_int_t fr, rsb_blas_int_t lr);
140 int rsb__BLAS_Xusget_matrix_nnz(blas_sparse_matrix A, rsb_blas_int_t * nnz);
141 int rsb__BLAS_Xusget_infinity_norm(blas_sparse_matrix A, void * in, enum blas_trans_type trans);
142 int rsb__BLAS_Xusget_rows_sums(blas_sparse_matrix A, void * rs, enum blas_trans_type trans);
143 int rsb__BLAS_Xusset_elements(blas_sparse_matrix A,const rsb_blas_int_t * ia, const rsb_blas_int_t *ja, const void *  va, rsb_blas_int_t nnz);
144 int rsb__BLAS_Xusset_element(blas_sparse_matrix A,rsb_blas_int_t i, rsb_blas_int_t j, const void * v);
145 int rsb__BLAS_Xusget_element(blas_sparse_matrix A,rsb_blas_int_t i, rsb_blas_int_t j, void * v);
146 int rsb__BLAS_Xusmv(enum blas_trans_type transA, const void * alphap, blas_sparse_matrix A, const void * Xp, rsb_blas_int_t incX, const void * betap, void * Yp, rsb_blas_int_t incY);
147 int rsb__BLAS_Xusmm(enum blas_trans_type transA, const void * alphap, blas_sparse_matrix A, const void * b, rsb_blas_int_t ldb, const void * betap, void * c, rsb_blas_int_t ldc, rsb_blas_int_t nrhs, enum blas_order_type order);
148 int rsb__BLAS_Xussv(enum blas_trans_type transT, void * alpha, blas_sparse_matrix T, void * x, rsb_blas_int_t incx);
149 void blas_usgp_f_( blas_sparse_matrix*A, rsb_blas_int_t * pname, rsb_blas_int_t * istat );
150 void blas_ussp_f_( blas_sparse_matrix*A, rsb_blas_int_t * pname, rsb_blas_int_t * istat );
151 /* blas_sparse_matrix rsb_load_spblas_matrix_file_as_matrix_market(const rsb_char_t * filename, rsb_type_t typecode ); now in rsb_libspblas.h */
152 rsb_blas_int_t rsb__BLAS_Xusget_rows_nnz( blas_sparse_matrix A, rsb_blas_int_t fr, rsb_blas_int_t lr, rsb_blas_int_t * nnzp);
153 blas_sparse_matrix rsb__BLAS_handle_free(blas_sparse_matrix handle);
154 
155 #define RSB_BLAS_STDOUT_MATRIX_SUMMARY(A)						\
156 	{										\
157 		struct rsb_mtx_t *RSB_DUMMY_ID=rsb__BLAS_inner_matrix_retrieve(A);	\
158 		if(RSB_DUMMY_ID)RSB_STDOUT_MATRIX_SUMMARY(RSB_DUMMY_ID );		\
159 		/*else            RSB_STDOUT_MATRIX_SUMMARY(RSB_DUMMY_MTX);*/		\
160 	}
161 
162 #ifdef __cplusplus
163 }
164 #endif  /* __cplusplus */
165 
166 #endif /* LIBSPBLAS_HANDLE_H_INCLUDED */
167 /* @endcond */
168