1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

""" 

Low-level BLAS functions (:mod:`scipy.linalg.blas`) 

=================================================== 

 

This module contains low-level functions from the BLAS library. 

 

.. versionadded:: 0.12.0 

 

.. note:: 

 

The common ``overwrite_<>`` option in many routines, allows the 

input arrays to be overwritten to avoid extra memory allocation. 

However this requires the array to satisfy two conditions 

which are memory order and the data type to match exactly the 

order and the type expected by the routine. 

 

As an example, if you pass a double precision float array to any 

``S....`` routine which expects single precision arguments, f2py 

will create an intermediate array to match the argument types and 

overwriting will be performed on that intermediate array. 

 

Similarly, if a C-contiguous array is passed, f2py will pass a 

FORTRAN-contiguous array internally. Please make sure that these 

details are satisfied. More information can be found in the f2py 

documentation. 

 

.. warning:: 

 

These functions do little to no error checking. 

It is possible to cause crashes by mis-using them, 

so prefer using the higher-level routines in `scipy.linalg`. 

 

Finding functions 

----------------- 

 

.. autosummary:: 

:toctree: generated/ 

 

get_blas_funcs 

find_best_blas_type 

 

BLAS Level 1 functions 

---------------------- 

 

.. autosummary:: 

:toctree: generated/ 

 

caxpy 

ccopy 

cdotc 

cdotu 

crotg 

cscal 

csrot 

csscal 

cswap 

dasum 

daxpy 

dcopy 

ddot 

dnrm2 

drot 

drotg 

drotm 

drotmg 

dscal 

dswap 

dzasum 

dznrm2 

icamax 

idamax 

isamax 

izamax 

sasum 

saxpy 

scasum 

scnrm2 

scopy 

sdot 

snrm2 

srot 

srotg 

srotm 

srotmg 

sscal 

sswap 

zaxpy 

zcopy 

zdotc 

zdotu 

zdrot 

zdscal 

zrotg 

zscal 

zswap 

 

BLAS Level 2 functions 

---------------------- 

 

.. autosummary:: 

:toctree: generated/ 

 

sgbmv 

sgemv 

sger 

ssbmv 

sspr 

sspr2 

ssymv 

ssyr 

ssyr2 

stbmv 

stpsv 

strmv 

strsv 

dgbmv 

dgemv 

dger 

dsbmv 

dspr 

dspr2 

dsymv 

dsyr 

dsyr2 

dtbmv 

dtpsv 

dtrmv 

dtrsv 

cgbmv 

cgemv 

cgerc 

cgeru 

chbmv 

chemv 

cher 

cher2 

chpmv 

chpr 

chpr2 

ctbmv 

ctbsv 

ctpmv 

ctpsv 

ctrmv 

ctrsv 

csyr 

zgbmv 

zgemv 

zgerc 

zgeru 

zhbmv 

zhemv 

zher 

zher2 

zhpmv 

zhpr 

zhpr2 

ztbmv 

ztbsv 

ztpmv 

ztrmv 

ztrsv 

zsyr 

 

BLAS Level 3 functions 

---------------------- 

 

.. autosummary:: 

:toctree: generated/ 

 

sgemm 

ssymm 

ssyr2k 

ssyrk 

strmm 

strsm 

dgemm 

dsymm 

dsyr2k 

dsyrk 

dtrmm 

dtrsm 

cgemm 

chemm 

cher2k 

cherk 

csymm 

csyr2k 

csyrk 

ctrmm 

ctrsm 

zgemm 

zhemm 

zher2k 

zherk 

zsymm 

zsyr2k 

zsyrk 

ztrmm 

ztrsm 

 

""" 

# 

# Author: Pearu Peterson, March 2002 

# refactoring by Fabian Pedregosa, March 2010 

# 

 

from __future__ import division, print_function, absolute_import 

 

__all__ = ['get_blas_funcs', 'find_best_blas_type'] 

 

import numpy as _np 

 

from scipy.linalg import _fblas 

try: 

from scipy.linalg import _cblas 

except ImportError: 

_cblas = None 

 

# Expose all functions (only fblas --- cblas is an implementation detail) 

empty_module = None 

from scipy.linalg._fblas import * 

del empty_module 

 

# 'd' will be default for 'i',.. 

_type_conv = {'f': 's', 'd': 'd', 'F': 'c', 'D': 'z', 'G': 'z'} 

 

# some convenience alias for complex functions 

_blas_alias = {'cnrm2': 'scnrm2', 'znrm2': 'dznrm2', 

'cdot': 'cdotc', 'zdot': 'zdotc', 

'cger': 'cgerc', 'zger': 'zgerc', 

'sdotc': 'sdot', 'sdotu': 'sdot', 

'ddotc': 'ddot', 'ddotu': 'ddot'} 

 

 

def find_best_blas_type(arrays=(), dtype=None): 

"""Find best-matching BLAS/LAPACK type. 

 

Arrays are used to determine the optimal prefix of BLAS routines. 

 

Parameters 

---------- 

arrays : sequence of ndarrays, optional 

Arrays can be given to determine optimal prefix of BLAS 

routines. If not given, double-precision routines will be 

used, otherwise the most generic type in arrays will be used. 

dtype : str or dtype, optional 

Data-type specifier. Not used if `arrays` is non-empty. 

 

Returns 

------- 

prefix : str 

BLAS/LAPACK prefix character. 

dtype : dtype 

Inferred Numpy data type. 

prefer_fortran : bool 

Whether to prefer Fortran order routines over C order. 

 

Examples 

-------- 

>>> import scipy.linalg.blas as bla 

>>> a = np.random.rand(10,15) 

>>> b = np.asfortranarray(a) # Change the memory layout order 

>>> bla.find_best_blas_type((a,)) 

('d', dtype('float64'), False) 

>>> bla.find_best_blas_type((a*1j,)) 

('z', dtype('complex128'), False) 

>>> bla.find_best_blas_type((b,)) 

('d', dtype('float64'), True) 

 

""" 

dtype = _np.dtype(dtype) 

prefer_fortran = False 

 

if arrays: 

# use the most generic type in arrays 

dtypes = [ar.dtype for ar in arrays] 

dtype = _np.find_common_type(dtypes, ()) 

try: 

index = dtypes.index(dtype) 

except ValueError: 

index = 0 

if arrays[index].flags['FORTRAN']: 

# prefer Fortran for leading array with column major order 

prefer_fortran = True 

 

prefix = _type_conv.get(dtype.char, 'd') 

if dtype.char == 'G': 

# complex256 -> complex128 (i.e., C long double -> C double) 

dtype = _np.dtype('D') 

elif dtype.char not in 'fdFD': 

dtype = _np.dtype('d') 

 

return prefix, dtype, prefer_fortran 

 

 

def _get_funcs(names, arrays, dtype, 

lib_name, fmodule, cmodule, 

fmodule_name, cmodule_name, alias): 

""" 

Return available BLAS/LAPACK functions. 

 

Used also in lapack.py. See get_blas_funcs for docstring. 

""" 

 

funcs = [] 

unpack = False 

dtype = _np.dtype(dtype) 

module1 = (cmodule, cmodule_name) 

module2 = (fmodule, fmodule_name) 

 

if isinstance(names, str): 

names = (names,) 

unpack = True 

 

prefix, dtype, prefer_fortran = find_best_blas_type(arrays, dtype) 

 

if prefer_fortran: 

module1, module2 = module2, module1 

 

for i, name in enumerate(names): 

func_name = prefix + name 

func_name = alias.get(func_name, func_name) 

func = getattr(module1[0], func_name, None) 

module_name = module1[1] 

if func is None: 

func = getattr(module2[0], func_name, None) 

module_name = module2[1] 

if func is None: 

raise ValueError( 

'%s function %s could not be found' % (lib_name, func_name)) 

func.module_name, func.typecode = module_name, prefix 

func.dtype = dtype 

func.prefix = prefix # Backward compatibility 

funcs.append(func) 

 

if unpack: 

return funcs[0] 

else: 

return funcs 

 

 

def get_blas_funcs(names, arrays=(), dtype=None): 

"""Return available BLAS function objects from names. 

 

Arrays are used to determine the optimal prefix of BLAS routines. 

 

Parameters 

---------- 

names : str or sequence of str 

Name(s) of BLAS functions without type prefix. 

 

arrays : sequence of ndarrays, optional 

Arrays can be given to determine optimal prefix of BLAS 

routines. If not given, double-precision routines will be 

used, otherwise the most generic type in arrays will be used. 

 

dtype : str or dtype, optional 

Data-type specifier. Not used if `arrays` is non-empty. 

 

 

Returns 

------- 

funcs : list 

List containing the found function(s). 

 

 

Notes 

----- 

This routine automatically chooses between Fortran/C 

interfaces. Fortran code is used whenever possible for arrays with 

column major order. In all other cases, C code is preferred. 

 

In BLAS, the naming convention is that all functions start with a 

type prefix, which depends on the type of the principal 

matrix. These can be one of {'s', 'd', 'c', 'z'} for the numpy 

types {float32, float64, complex64, complex128} respectively. 

The code and the dtype are stored in attributes `typecode` and `dtype` 

of the returned functions. 

 

Examples 

-------- 

>>> import scipy.linalg as LA 

>>> a = np.random.rand(3,2) 

>>> x_gemv = LA.get_blas_funcs('gemv', (a,)) 

>>> x_gemv.typecode 

'd' 

>>> x_gemv = LA.get_blas_funcs('gemv',(a*1j,)) 

>>> x_gemv.typecode 

'z' 

 

""" 

return _get_funcs(names, arrays, dtype, 

"BLAS", _fblas, _cblas, "fblas", "cblas", 

_blas_alias)