Skip to content

Commit c663605

Browse files
author
Kasper Peeters
committed
Fix Ex slicing error.
1 parent 3628efa commit c663605

File tree

2 files changed

+43
-7
lines changed

2 files changed

+43
-7
lines changed

core/pythoncdb/py_ex.cc

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -383,22 +383,21 @@ namespace cadabra {
383383
Ex result;
384384

385385
pybind11::size_t start, stop, step, length;
386-
slice.compute(ex->size(), &start, &stop, &step, &length);
386+
// std::cerr << "SLICE object has " << ex->number_of_children(ex->begin()) << " elements" << std::endl;
387+
slice.compute(ex->number_of_children(ex->begin()), &start, &stop, &step, &length);
388+
// std::cerr << "SLICE: " << start << ", " << stop << ", " << step << ", " << length << std::endl;
387389
if (length == 0)
388390
return result;
389391

390392
// Set head
391393
auto it = result.set_head(*ex->begin());
392394

393395
// Iterate over fully-closed range.
394-
for (; start != stop; start += step) {
395-
Ex::iterator toadd(ex->begin());
396+
for (; start < stop; start += step) {
397+
Ex::sibling_iterator toadd=ex->begin(ex->begin());
396398
std::advance(toadd, start);
397-
result.append_child(it, toadd);
399+
result.append_child(it, Ex::iterator(toadd));
398400
}
399-
Ex::iterator toadd(ex->begin());
400-
std::advance(toadd, start);
401-
result.append_child(it, toadd);
402401
return result;
403402
}
404403

tests/programming.cdb

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,3 +370,40 @@ def test17():
370370

371371
test17()
372372

373+
374+
# {i,j,k,l}::Indices(cartesian, values={x,y,z}).
375+
# {\mu,\nu,\rho,\sigma}::Indices(polar, values={r,\theta,\phi}).
376+
# ex:= x^{i} x^{i} + p_{\mu} p^{\mu};
377+
# for node in ex:
378+
# prop = Indices.get(node)
379+
# if prop is not None:
380+
# print(node)
381+
# print(node.name, prop.values)
382+
#
383+
# ind = Indices.get($i$);
384+
385+
def test18():
386+
ex:= A + B + C + D + E;
387+
s1 = ex[0:2]
388+
tst:= A + B - @(s1);
389+
assert(tst==0)
390+
print("Test 18a passed")
391+
s2 = ex[0:-2:2]
392+
tst:= A + C - @(s2);
393+
assert(tst==0)
394+
print("Test 18b passed")
395+
ex:= A + B + C + D + E + F;
396+
s3 = ex[0:-2:2]
397+
tst:= A + C - @(s3);
398+
print("Test 18c passed")
399+
ex:= A + B + C + D + E + F;
400+
s4 = ex[1:-2:2]
401+
tst:= B + D - @(s4);
402+
print("Test 18d passed")
403+
ex:= A + B + C + D + E;
404+
s5 = ex[2:3]
405+
tst:= C - @(s5);
406+
assert(tst==0)
407+
print("Test 18e passed")
408+
409+
test18()

0 commit comments

Comments
 (0)