Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 5 additions & 9 deletions .github/workflows/bench.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ on:
push:
tags-ignore:
- "**"
pull_request:
branches:
- "**"
pull_request:

name: Benchmarks

Expand All @@ -16,16 +16,12 @@ jobs:
runs-on: self-hosted
steps:
- name: Checkout sources
uses: actions/checkout@v2
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Install stable toolchain
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
uses: dtolnay/rust-toolchain@stable

- name: Cargo Bench
run: |
Expand All @@ -37,7 +33,7 @@ jobs:
- name: Zip benchmark results
run: zip -r criterion.zip target/criterion/*

- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v6
with:
name: criterion.zip
name: criterion
path: criterion.zip
7 changes: 5 additions & 2 deletions .github/workflows/coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
container: mwatelescope/marlu:latest
steps:
- name: Checkout sources
uses: actions/checkout@v2
uses: actions/checkout@v6
with:
fetch-depth: 0

Expand All @@ -21,7 +21,10 @@ jobs:
# this uses the result of the previous run to generate a text summary
/opt/cargo/bin/cargo llvm-cov --no-run

- name: Install codecov dependencies
run: apt-get update && apt-get install -y bash curl gpg git

- name: Upload reports to codecov.io
uses: codecov/codecov-action@v2
uses: codecov/codecov-action@v6
with:
token: ${{ secrets.CODECOV_TOKEN }}
8 changes: 2 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,12 @@ jobs:

steps:
- name: Checkout sources
uses: actions/checkout@v2
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Install stable toolchain
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
uses: dtolnay/rust-toolchain@stable

- name: Install Dependencies
run: |
Expand Down
10 changes: 3 additions & 7 deletions .github/workflows/run-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on:
push:
tags-ignore:
- "**"
pull_request:
pull_request:
branches:
- "**"

Expand All @@ -23,16 +23,12 @@ jobs:
os: [ubuntu-latest, macos-latest]
steps:
- name: Checkout sources
uses: actions/checkout@v2
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Install stable toolchain
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
uses: dtolnay/rust-toolchain@stable

- name: Install Dependencies
run: |
Expand Down
44 changes: 22 additions & 22 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
[package]
name = "marlu"
version = "0.16.1"
version = "0.17.0"
authors = [
"Christopher H. Jordan <christopherjordan87@gmail.com>",
"Dev Null <dev.null@curtin.edu.au>",
"Greg Sleap <greg.sleap@curtin.edu.au>",
]
edition = "2021"
rust-version = "1.65"
rust-version = "1.85"
license = "MPL-2.0"
readme = "README.md"
description = "Convenience Rust code that handles coordinate transformations, Jones matrices, I/O. for the Murchison Widefield Array (MWA) radio telescope. Previously known as mwa_rust_core"
Expand All @@ -15,6 +16,7 @@ homepage = "https://github.com/MWATelescope/marlu"
keywords = ["radioastronomy", "mwa", "astronomy", "aoflagger", "cotter"]
categories = ["science"]
exclude = ["tests/*", ".vscode/*", ".github/*", ".talismanrc"]
resolver = "3"

[features]
default = ["mwalib", "ms"]
Expand All @@ -41,48 +43,55 @@ all-static = ["cfitsio-static"]
[dependencies]
cfg-if = "1.0.0"
erfa = "0.2.1"
hifitime = "3.6.0"
itertools = "0.10.0"
hifitime = "<4"
itertools = "0.14"
lazy_static = "~1.5"
log = "0.4.14"
ndarray = { version = "0.16.0", features = ["rayon"] }
ndarray = { version = "0.16.1", features = ["rayon"] }
num-complex = "0.4.1"
num-traits = "0.2.0"
rayon = "1.5.0"
tar = "0.4.15"
thiserror = "1.0.0"
thiserror = "2.0"

# "cfitsio" feature
fitsio = { version = "0.21.6", optional = true }
fitsio-sys = { version = "~0.5", optional = true }

# "mwalib" feature
mwalib = { version = "1.8.7", optional = true }
mwalib = { version = "2.0", optional = true }
#mwalib = { git = "https://github.com/MWATelescope/mwalib", branch = "bf_metafits_changes_vcs_read_size", optional = true }

# "ms" feature
flate2 = { version = "1.0.13", optional = true }
rubbl_casatables = { version = "0.8.0", optional = true }
rubbl_casatables = { version = "0.9.0", optional = true }

# "approx" feature
approx = { version = "0.5.0", features = ["num-complex"], optional = true }

# "serde" feature
serde = { version = "1.0.100", features = ["derive"], optional = true }

# Transitive dependencies- newer versions require MSRV>=1.86
icu_properties = "=2.1.2"
icu_locale_core = "=2.1.1"
icu_provider = "=2.1.1"
icu_normalizer = "=2.1.1"

[dev-dependencies]
approx = { version = "0.5.0", features = ["num-complex"] }
criterion = "~0.4.0"
criterion = "~0.7.0"
csv = "1.1.0"
glob = "0.3.0"
lexical = "6.0.0"
ndarray = { version = "0.16.0", features = ["approx"] }
lexical = "7.0.0"
ndarray = { version = "0.16.1", features = ["approx"] }
regex = "1.5.0"
serde_json = "1.0.0"
serial_test = "0.9.0"
serial_test = "3.4.0"
tempfile = "3.3.0"

[build-dependencies]
built = { version = "=0.7.3", default-features = false, features = [
built = { version = "0.8", default-features = false, features = [
"chrono",
"git2",
"semver",
Expand All @@ -95,12 +104,3 @@ harness = false
[[bench]]
name = "bench_io"
harness = false

[patch.crates-io]
# TODO: get rid of this once MSRV >= 1.67, built@0.7.3+git2 => icu_normalizer@1.5.0 => rustc 1.65.0
# built = { git = "https://github.com/lukaslueg/built", tag = "0.7.3" }
url = { git = "https://github.com/servo/rust-url", tag = "v2.5.2" }
textwrap = { git = "https://github.com/mgeisler/textwrap", tag = "0.16.1" }
flate2 = { git = "https://github.com/rust-lang/flate2-rs", tag = "1.0.35" }
# TODO: get rid of this once MSRV >= 1.70
ciborium = { git = "https://github.com/enarx/ciborium", tag = "v0.2.1" } # ciborium-ll v > 0.2.1 needs half ^2.2, half v > 2.3.x msrv is 1.70
6 changes: 6 additions & 0 deletions RELEASES.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
<!-- markdownlint-disable=MD025 -->

# Version 0.17.0 (2026-05-15)

- Bumped MSRV to 1.85
- Updated mwalib to 2.0 rubbl_casatables 0.9.0 thiserror 2.0
- Updated CI to use most recent action versions

# Version 0.16.1 (2025-04-11)

- Fixed decode_uvfits_baseline bug (#36)
Expand Down
2 changes: 1 addition & 1 deletion benches/bench_misc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

//! Misc Benchmarks

use criterion::*;
use hifitime::{Duration, Epoch};
use std::hint::black_box;

use marlu::{
c64,
Expand Down
2 changes: 1 addition & 1 deletion src/io/ms.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5239,7 +5239,7 @@ mod tests {
}
}

/// as above, but with two consecutive calls to write_vis_mwalib
/// as above, but with two consecutive calls to `write_vis_mwalib`
#[cfg(feature = "mwalib")]
#[test]
#[serial]
Expand Down
96 changes: 48 additions & 48 deletions src/io/uvfits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1203,8 +1203,8 @@ mod tests {
FitsFile,
};
use mwalib::{
_get_fits_col, _get_required_fits_key, _open_fits, _open_hdu, fits_open, fits_open_hdu,
get_fits_col, get_required_fits_key, CorrelatorContext,
_get_fits_col, _get_required_fits_key, fits_open, fits_open_hdu, get_fits_col,
get_required_fits_key, CorrelatorContext,
};
use ndarray::Array3;
use tempfile::NamedTempFile;
Expand Down Expand Up @@ -2834,56 +2834,56 @@ mod tests {
#[test]
fn test_encode_uvfits_baseline_256t() {
// test hand calculated edge cases
assert_eq!(encode_uvfits_baseline(1,1), 257);
assert_eq!(encode_uvfits_baseline(1,2), 258);
assert_eq!(encode_uvfits_baseline(1,255), 511);
assert_eq!(encode_uvfits_baseline(1,256), 67840);
assert_eq!(encode_uvfits_baseline(127,127), 32639);
assert_eq!(encode_uvfits_baseline(127,255), 32767);
assert_eq!(encode_uvfits_baseline(127,256), 325888);
assert_eq!(encode_uvfits_baseline(128,128), 32896);
assert_eq!(encode_uvfits_baseline(128,255), 33023);
assert_eq!(encode_uvfits_baseline(128,256), 327936);
assert_eq!(encode_uvfits_baseline(254,254), 65278);
assert_eq!(encode_uvfits_baseline(254,255), 65279);
assert_eq!(encode_uvfits_baseline(254,256), 585984);
assert_eq!(encode_uvfits_baseline(255,255), 65535);
assert_eq!(encode_uvfits_baseline(255,256), 588032);
assert_eq!(encode_uvfits_baseline(256,256), 590080);
assert_eq!(encode_uvfits_baseline(1, 1), 257);
assert_eq!(encode_uvfits_baseline(1, 2), 258);
assert_eq!(encode_uvfits_baseline(1, 255), 511);
assert_eq!(encode_uvfits_baseline(1, 256), 67840);
assert_eq!(encode_uvfits_baseline(127, 127), 32639);
assert_eq!(encode_uvfits_baseline(127, 255), 32767);
assert_eq!(encode_uvfits_baseline(127, 256), 325888);
assert_eq!(encode_uvfits_baseline(128, 128), 32896);
assert_eq!(encode_uvfits_baseline(128, 255), 33023);
assert_eq!(encode_uvfits_baseline(128, 256), 327936);
assert_eq!(encode_uvfits_baseline(254, 254), 65278);
assert_eq!(encode_uvfits_baseline(254, 255), 65279);
assert_eq!(encode_uvfits_baseline(254, 256), 585984);
assert_eq!(encode_uvfits_baseline(255, 255), 65535);
assert_eq!(encode_uvfits_baseline(255, 256), 588032);
assert_eq!(encode_uvfits_baseline(256, 256), 590080);
}

#[test]
fn test_decode_uvfits_baseline_256t() {
// Test hand calculated edge cases
assert_eq!(decode_uvfits_baseline(257), (1,1));
assert_eq!(decode_uvfits_baseline(258), (1,2));
assert_eq!(decode_uvfits_baseline(511), (1,255));
assert_eq!(decode_uvfits_baseline(67840), (1,256));
assert_eq!(decode_uvfits_baseline(32639), (127,127));
assert_eq!(decode_uvfits_baseline(32767), (127,255));
assert_eq!(decode_uvfits_baseline(325888), (127,256));
assert_eq!(decode_uvfits_baseline(32896), (128,128));
assert_eq!(decode_uvfits_baseline(33023), (128,255));
assert_eq!(decode_uvfits_baseline(327936), (128,256));
assert_eq!(decode_uvfits_baseline(65278), (254,254));
assert_eq!(decode_uvfits_baseline(65279), (254,255));
assert_eq!(decode_uvfits_baseline(585984), (254,256));
assert_eq!(decode_uvfits_baseline(65535), (255,255));
assert_eq!(decode_uvfits_baseline(588032), (255,256));
assert_eq!(decode_uvfits_baseline(590080), (256,256));
assert_eq!(decode_uvfits_baseline(257), (1, 1));
assert_eq!(decode_uvfits_baseline(258), (1, 2));
assert_eq!(decode_uvfits_baseline(511), (1, 255));
assert_eq!(decode_uvfits_baseline(67840), (1, 256));
assert_eq!(decode_uvfits_baseline(32639), (127, 127));
assert_eq!(decode_uvfits_baseline(32767), (127, 255));
assert_eq!(decode_uvfits_baseline(325888), (127, 256));
assert_eq!(decode_uvfits_baseline(32896), (128, 128));
assert_eq!(decode_uvfits_baseline(33023), (128, 255));
assert_eq!(decode_uvfits_baseline(327936), (128, 256));
assert_eq!(decode_uvfits_baseline(65278), (254, 254));
assert_eq!(decode_uvfits_baseline(65279), (254, 255));
assert_eq!(decode_uvfits_baseline(585984), (254, 256));
assert_eq!(decode_uvfits_baseline(65535), (255, 255));
assert_eq!(decode_uvfits_baseline(588032), (255, 256));
assert_eq!(decode_uvfits_baseline(590080), (256, 256));
}
}

#[test]
fn test_encode_decode_uvfits_all_baselines_128t() {
// Test all baselines can be encoded then decoded correctly
// Test all baselines can be encoded then decoded correctly
// MWAX 128T
let n_ants: usize= 128;
let n_ants: usize = 128;

for ant1 in 1..=n_ants {
for ant2 in ant1..=n_ants {
let bl = encode_uvfits_baseline(ant1, ant2);
let (a1,a2) = decode_uvfits_baseline(bl);
let (a1, a2) = decode_uvfits_baseline(bl);
assert_eq!(a1, ant1);
assert_eq!(a2, ant2);
}
Expand All @@ -2894,12 +2894,12 @@ fn test_encode_decode_uvfits_all_baselines_128t() {
fn test_encode_decode_uvfits_all_baselines_256t() {
// Test all baselines can be encoded then decoded correctly
// MWAX 256T
let n_ants: usize= 256;
let n_ants: usize = 256;

for ant1 in 1..=n_ants {
for ant2 in ant1..=n_ants {
let bl = encode_uvfits_baseline(ant1, ant2);
let (a1,a2) = decode_uvfits_baseline(bl);
let (a1, a2) = decode_uvfits_baseline(bl);
assert_eq!(a1, ant1);
assert_eq!(a2, ant2);
}
Expand All @@ -2910,12 +2910,12 @@ fn test_encode_decode_uvfits_all_baselines_256t() {
fn test_encode_decode_uvfits_all_baselines_264t() {
// Test all baselines can be encoded then decoded correctly
// MWAX 256T + 1 more receiver
let n_ants: usize= 264;
let n_ants: usize = 264;

for ant1 in 1..=n_ants {
for ant2 in ant1..=n_ants {
let bl = encode_uvfits_baseline(ant1, ant2);
let (a1,a2) = decode_uvfits_baseline(bl);
let (a1, a2) = decode_uvfits_baseline(bl);
assert_eq!(a1, ant1);
assert_eq!(a2, ant2);
}
Expand All @@ -2926,14 +2926,14 @@ fn test_encode_decode_uvfits_all_baselines_264t() {
fn test_encode_decode_uvfits_all_baselines_512t() {
// Test all baselines can be encoded then decoded correctly
// MWAX 512T (Phase 4(!))
let n_ants: usize= 512;
let n_ants: usize = 512;

for ant1 in 1..=n_ants {
for ant2 in ant1..=n_ants {
let bl = encode_uvfits_baseline(ant1, ant2);
let (a1,a2) = decode_uvfits_baseline(bl);
let (a1, a2) = decode_uvfits_baseline(bl);
assert_eq!(a1, ant1);
assert_eq!(a2, ant2);
}
}
}
}
Loading
Loading