@@ -1213,26 +1213,57 @@ cdef class sumMultiplyOperator(LinearOperator):
1213
1213
cdef:
1214
1214
INDEX_t i
1215
1215
LinearOperator op
1216
+ int ret
1216
1217
op = self .ops[0 ]
1217
- op.matvec(x, y)
1218
+ ret = op.matvec(x, y)
1218
1219
scaleScalar(y, self .coeffs[0 ])
1219
1220
for i in range (1 , self .coeffs.shape[0 ]):
1220
1221
op = self .ops[i]
1221
- op.matvec(x, self .z)
1222
+ ret = min (ret, op.matvec(x, self .z) )
1222
1223
assign3(y, y, 1.0 , self .z, self .coeffs[i])
1223
- return 0
1224
+ return ret
1224
1225
1225
1226
cdef INDEX_t matvec_no_overwrite(self ,
1226
1227
REAL_t[::1 ] x,
1227
1228
REAL_t[::1 ] y) except - 1 :
1229
+ cdef:
1230
+ INDEX_t i
1231
+ LinearOperator op = 0
1232
+ int ret = 0
1233
+ for i in range (self .coeffs.shape[0 ]):
1234
+ op = self .ops[i]
1235
+ ret = min (op.matvec(x, self .z), ret)
1236
+ assign3(y, y, 1.0 , self .z, self .coeffs[i])
1237
+ return ret
1238
+
1239
+ cdef INDEX_t matvecTrans(self ,
1240
+ REAL_t[::1 ] x,
1241
+ REAL_t[::1 ] y) except - 1 :
1228
1242
cdef:
1229
1243
INDEX_t i
1230
1244
LinearOperator op
1245
+ int ret
1246
+ op = self .ops[0 ]
1247
+ ret = op.matvecTrans(x, y)
1248
+ scaleScalar(y, self .coeffs[0 ])
1249
+ for i in range (1 , self .coeffs.shape[0 ]):
1250
+ op = self .ops[i]
1251
+ ret = min (ret, op.matvecTrans(x, self .z))
1252
+ assign3(y, y, 1.0 , self .z, self .coeffs[i])
1253
+ return ret
1254
+
1255
+ cdef INDEX_t matvecTrans_no_overwrite(self ,
1256
+ REAL_t[::1 ] x,
1257
+ REAL_t[::1 ] y) except - 1 :
1258
+ cdef:
1259
+ INDEX_t i
1260
+ LinearOperator op
1261
+ int ret = 0
1231
1262
for i in range (self .coeffs.shape[0 ]):
1232
1263
op = self .ops[i]
1233
- op.matvec (x, self .z)
1264
+ ret = min (ret, op.matvecTrans (x, self .z) )
1234
1265
assign3(y, y, 1.0 , self .z, self .coeffs[i])
1235
- return 0
1266
+ return ret
1236
1267
1237
1268
def toarray (self ):
1238
1269
return sum ([c* op.toarray() for c, op in zip (self .coeffs, self .ops)])
@@ -1436,8 +1467,34 @@ cdef class multiIntervalInterpolationOperator(LinearOperator):
1436
1467
interpolationOperator op
1437
1468
assert self .selected != - 1
1438
1469
op = self .ops[self .selected]
1439
- op.matvec(x, y)
1440
- return 0
1470
+ return op.matvec(x, y)
1471
+
1472
+ cdef INDEX_t matvec_no_overwrite(self ,
1473
+ REAL_t[::1 ] x,
1474
+ REAL_t[::1 ] y) except - 1 :
1475
+ cdef:
1476
+ interpolationOperator op
1477
+ assert self .selected != - 1
1478
+ op = self .ops[self .selected]
1479
+ return op.matvec_no_overwrite(x, y)
1480
+
1481
+ cdef INDEX_t matvecTrans(self ,
1482
+ REAL_t[::1 ] x,
1483
+ REAL_t[::1 ] y) except - 1 :
1484
+ cdef:
1485
+ interpolationOperator op
1486
+ assert self .selected != - 1
1487
+ op = self .ops[self .selected]
1488
+ return op.matvecTrans(x, y)
1489
+
1490
+ cdef INDEX_t matvecTrans_no_overwrite(self ,
1491
+ REAL_t[::1 ] x,
1492
+ REAL_t[::1 ] y) except - 1 :
1493
+ cdef:
1494
+ interpolationOperator op
1495
+ assert self .selected != - 1
1496
+ op = self .ops[self .selected]
1497
+ return op.matvecTrans_no_overwrite(x, y)
1441
1498
1442
1499
def toarray (self ):
1443
1500
assert self .selected != - 1
@@ -1521,8 +1578,25 @@ cdef class delayedConstructionOperator(LinearOperator):
1521
1578
REAL_t[::1 ] x,
1522
1579
REAL_t[::1 ] y) except - 1 :
1523
1580
self .assure_constructed()
1524
- self .A.matvec(x, y)
1525
- return 0
1581
+ return self .A.matvec(x, y)
1582
+
1583
+ cdef INDEX_t matvec_no_overwrite(self ,
1584
+ REAL_t[::1 ] x,
1585
+ REAL_t[::1 ] y) except - 1 :
1586
+ self .assure_constructed()
1587
+ return self .A.matvec_no_overwrite(x, y)
1588
+
1589
+ cdef INDEX_t matvecTrans(self ,
1590
+ REAL_t[::1 ] x,
1591
+ REAL_t[::1 ] y) except - 1 :
1592
+ self .assure_constructed()
1593
+ return self .A.matvecTrans(x, y)
1594
+
1595
+ cdef INDEX_t matvecTrans_no_overwrite(self ,
1596
+ REAL_t[::1 ] x,
1597
+ REAL_t[::1 ] y) except - 1 :
1598
+ self .assure_constructed()
1599
+ return self .A.matvecTrans_no_overwrite(x, y)
1526
1600
1527
1601
def toarray (self ):
1528
1602
self .assure_constructed()
0 commit comments