File: GB_spec_vxm.m

package info (click to toggle)
suitesparse-graphblas 7.4.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 67,112 kB
  • sloc: ansic: 1,072,243; cpp: 8,081; sh: 512; makefile: 503; asm: 369; python: 125; awk: 10
file content (65 lines) | stat: -rw-r--r-- 1,966 bytes parent folder | download | duplicates (3)
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
function w = GB_spec_vxm (w, mask, accum, semiring, u, A, descriptor)
%GB_SPEC_VXM a mimic of GrB_vxm
%
% Usage:
% w = GB_spec_vxm (w, mask, accum, semiring, u, A, descriptor)
%
% w, mask, and u are column vectors.  Computes w'=u'*A or w'=u'*A'

% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2022, All Rights Reserved.
% SPDX-License-Identifier: Apache-2.0

if (nargout > 1 || nargin ~= 7)
    error ('usage: w = GB_spec_vxm (w, mask, accum, semiring, u, A, descriptor)') ;
end

% In the C implementation of GraphBLAS itself, the column vectors u and w are
% not transposed since it is costly to transpose column vectors.  w=A*u or
% w=A'*u is computed instead, but with the multiply operator fmult(x,y) used as
% fmult(y,x) instead.  This also requires the descriptor to be revised for A.
%
% The transformation of the problem in the C implementation is the same as
% simply doing the transpose of u and w and leaving the descriptor unchanged.
% Then the inputs to the multiply operator are used as-is and not flipped.
% This simpler method is used in this mimic.

% make sure u is a column vector on input, then transpose it
if (isstruct (u))
    n = size (u.matrix, 2) ;
    u.matrix = u.matrix.' ;
    u.pattern = u.pattern' ;
else
    n = size (u, 2);
    u = u' ;
end
if (n ~= 1)
    error ('u must be a vector') ;
end

% make sure w is a column vector on input, then transpose it
if (isstruct (w))
    n = size (w.matrix, 2) ;
    w.matrix = w.matrix.' ;
    w.pattern = w.pattern' ;
else
    n = size (w, 2);
    w = w' ;
end
if (n ~= 1)
    error ('w must be a vector') ;
end

% mask is a column vector on input, so transpose it
mask = mask' ;

% GraphBLAS does not allow u to be transposed via the descriptor
if (isfield (descriptor, 'inp0'))
    descriptor = rmfield (descriptor, 'inp0') ;
end

w = GB_spec_mxm (w, mask, accum, semiring, u, A, descriptor) ;

% transpose w back into a column vector
w.matrix = w.matrix.' ;
w.pattern = w.pattern' ;