Skip to content

Commit a864bc4

Browse files
authored
Implement UnsafeAddMul for SemisimpleElement (#55)
* Implement UnsafeAddMul for SemisimpleElement * Add tests * Fix format * Update ci.yml
1 parent 1fa65c8 commit a864bc4

File tree

3 files changed

+71
-21
lines changed

3 files changed

+71
-21
lines changed

.github/workflows/ci.yml

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,17 @@ on:
44
branches: [master]
55
pull_request:
66
types: [opened, synchronize, reopened]
7+
# needed to allow julia-actions/cache to delete old caches that it has created
8+
permissions:
9+
actions: write
10+
contents: read
711
jobs:
812
test:
913
name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }}
1014
runs-on: ${{ matrix.os }}
1115
strategy:
1216
fail-fast: false
1317
matrix:
14-
# Since MultivariatePolynomials doesn't have binary dependencies,
15-
# only test on a subset of possible platforms.
1618
include:
1719
- version: '1'
1820
os: ubuntu-latest
@@ -27,21 +29,12 @@ jobs:
2729
os: ubuntu-latest
2830
arch: x64
2931
steps:
30-
- uses: actions/checkout@v3
31-
- uses: julia-actions/setup-julia@v1
32+
- uses: actions/checkout@v4
33+
- uses: julia-actions/setup-julia@v2
3234
with:
3335
version: ${{ matrix.version }}
3436
arch: ${{ matrix.arch }}
35-
- uses: actions/cache@v1
36-
env:
37-
cache-name: cache-artifacts
38-
with:
39-
path: ~/.julia/artifacts
40-
key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }}
41-
restore-keys: |
42-
${{ runner.os }}-test-${{ env.cache-name }}-
43-
${{ runner.os }}-test-
44-
${{ runner.os }}-
37+
- uses: julia-actions/cache@v2
4538
- name: dev
4639
shell: julia --project=@. {0}
4740
run: |
@@ -54,6 +47,7 @@ jobs:
5447
with:
5548
depwarn: error
5649
- uses: julia-actions/julia-processcoverage@v1
57-
- uses: codecov/codecov-action@v3
50+
- uses: codecov/codecov-action@v4
5851
with:
5952
file: lcov.info
53+
token: ${{ secrets.CODECOV_TOKEN }}

src/fixed.jl

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ function Base.show(io::IO, b::FixedBasis)
2121
return
2222
end
2323

24+
# TODO refactor with `SA.MappedBasis`
25+
# https://github.com/JuliaAlgebra/StarAlgebras.jl/pull/76
26+
2427
"""
2528
struct SemisimpleBasis{T,I,B<:SA.ExplicitBasis{T,I}} <: SA.ExplicitBasis{T,I}
2629
bases::Vector{B}
@@ -35,6 +38,18 @@ end
3538

3639
Base.length(b::SemisimpleBasis) = length(first(b.bases))
3740

41+
function _iterate(b::SemisimpleBasis, elem_state)
42+
if isnothing(elem_state)
43+
return
44+
end
45+
elem, state = elem_state
46+
return b[elem], state
47+
end
48+
Base.iterate(b::SemisimpleBasis) = _iterate(b, iterate(keys(first(b.bases))))
49+
function Base.iterate(b::SemisimpleBasis, st)
50+
return _iterate(b, iterate(keys(first(b.bases)), st))
51+
end
52+
3853
"""
3954
struct SemisimpleElement{P}
4055
polynomials::Vector{P}
@@ -47,6 +62,25 @@ struct SemisimpleElement{P}
4762
end
4863
SA.star(p::SemisimpleElement) = SemisimpleElement(SA.star.(p.elements))
4964

65+
function Base.:(==)(a::SemisimpleElement, b::SemisimpleElement)
66+
return length(a.elements) == length(b.elements) &&
67+
all(zip(a.elements, b.elements)) do (a, b)
68+
return a == b
69+
end
70+
end
71+
72+
function MA.operate!(
73+
op::SA.UnsafeAddMul,
74+
res,
75+
A::SemisimpleElement,
76+
B::SemisimpleElement,
77+
α,
78+
)
79+
for (a, b) in zip(A.elements, B.elements)
80+
MA.operate!(op, res, a, b, α)
81+
end
82+
end
83+
5084
function Base.getindex(b::SemisimpleBasis, i::Integer)
5185
return SemisimpleElement(getindex.(b.bases, i))
5286
end

test/fixed.jl

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,41 @@ using DynamicPolynomials
99
x_term = MB.term_element(1, MB.Polynomial{MB.Monomial}(x))
1010
y_term = MB.term_element(1, MB.Polynomial{MB.Monomial}(y))
1111
p1 = x_term + im * y_term
12-
p2 = x_term - im * y_term
12+
q1 = x_term - im * y_term
13+
p2 = im * x_term - 2y_term
14+
q2 = -im * x_term - 2y_term
1315
fixed = MB.FixedBasis([p1, p2])
1416
@test length(fixed) == 2
1517
@test fixed[1] p1
1618
@test fixed[2] p2
1719
@test sprint(show, fixed) == "FixedBasis([$p1, $p2])"
1820

19-
semi = MB.SemisimpleBasis([MB.FixedBasis([p1]), MB.FixedBasis([p2])])
20-
@test length(semi) == 1
21+
semi =
22+
MB.SemisimpleBasis([MB.FixedBasis([p1, p2]), MB.FixedBasis([q1, q2])])
23+
@test length(semi) == 2
2124
@test sprint(show, semi) ==
22-
"Semisimple basis with 2 simple sub-bases:\n FixedBasis([$p1])\n FixedBasis([$p2])"
25+
"Semisimple basis with 2 simple sub-bases:\n FixedBasis([$p1, $p2])\n FixedBasis([$q1, $q2])"
2326
mult = semi[1]
24-
@test all(mult.elements .≈ [p1, p2])
27+
@test all(mult.elements .≈ [p1, q1])
2528
smult = SA.star(mult)
26-
@test all(smult.elements .≈ [p2, p1])
29+
@test all(smult.elements .≈ [q1, p1])
30+
31+
elem, state = iterate(semi)
32+
@test elem == semi[1]
33+
elem, state = iterate(semi, state)
34+
@test elem == semi[2]
35+
@test isnothing(iterate(semi, state))
36+
37+
res = zero(Complex{Int}, MB.algebra(MB.FullBasis{Monomial,typeof(x * y)}()))
38+
MA.operate!(SA.UnsafeAddMul(*), res, semi[1], semi[2], true)
39+
MA.operate!(SA.canonical, res)
40+
@test res == p1 * p2 + q1 * q2
41+
MA.operate!(SA.UnsafeAddMul(*), res, semi[1], semi[2], false)
42+
@test res == p1 * p2 + q1 * q2
43+
MA.operate!(SA.UnsafeAddMul(*), res, semi[2], semi[1], -1)
44+
MA.operate!(SA.canonical, res)
45+
@test iszero(res)
46+
MA.operate!(SA.UnsafeAddMul(*), res, semi[2], semi[2], -1)
47+
MA.operate!(SA.canonical, res)
48+
@test res == -p2^2 - q2^2
2749
end

0 commit comments

Comments
 (0)