From ea9fbb5e3f006182822f5f887528c566f841e81b Mon Sep 17 00:00:00 2001 From: Udo Date: Fri, 5 Sep 2025 16:49:20 +0200 Subject: [PATCH 1/7] bump JUnit version --- arpack/pom.xml | 2 +- blas/pom.xml | 2 +- lapack/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/arpack/pom.xml b/arpack/pom.xml index 50ef839..d3de301 100644 --- a/arpack/pom.xml +++ b/arpack/pom.xml @@ -42,7 +42,7 @@ information or have any questions. jar - 5.8.2 + 5.13.4 dev.ludovic.netlib.arpack diff --git a/blas/pom.xml b/blas/pom.xml index 0af504a..2dac2a7 100644 --- a/blas/pom.xml +++ b/blas/pom.xml @@ -42,7 +42,7 @@ information or have any questions. jar - 5.8.2 + 5.13.4 dev.ludovic.netlib.blas diff --git a/lapack/pom.xml b/lapack/pom.xml index be3019b..3b780eb 100644 --- a/lapack/pom.xml +++ b/lapack/pom.xml @@ -42,7 +42,7 @@ information or have any questions. jar - 5.8.2 + 5.13.4 dev.ludovic.netlib.lapack From 461f5b01f81d8cecb8190881ca671817b835c16e Mon Sep 17 00:00:00 2001 From: Udo Date: Fri, 5 Sep 2025 16:51:09 +0200 Subject: [PATCH 2/7] Refine logging Explicitly state what has been loaded, and show failures only upon a sufficient logging level, as they should not hamper correct operation --- .../netlib/arpack/InstanceBuilder.java | 11 ++++++-- .../ludovic/netlib/blas/InstanceBuilder.java | 26 ++++++++++++++----- .../netlib/lapack/InstanceBuilder.java | 13 +++++++--- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java b/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java index 0e69aa2..e95071e 100644 --- a/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java +++ b/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java @@ -38,7 +38,14 @@ final class InstanceBuilder { static { nativeArpack = initializeNative(); javaArpack = initializeJava(); - arpack = nativeArpack != null ? nativeArpack : javaArpack; + + if (nativeArpack == null) { + log.info("Using JavaARPACK"); + arpack = javaArpack; + } else { + log.info("Using native ARPACK"); + arpack = nativeArpack; + } } public static ARPACK arpack() { @@ -49,7 +56,7 @@ private static NativeARPACK initializeNative() { try { return JNIARPACK.getInstance(); } catch (Throwable t) { - log.warning("Failed to load implementation from:" + JNIARPACK.class.getName()); + log.fine("Failed to load implementation from:" + JNIARPACK.class.getName()); return null; } } diff --git a/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java b/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java index e5c1792..6e41869 100644 --- a/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java +++ b/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java @@ -38,7 +38,22 @@ final class InstanceBuilder { static { nativeBlas = initializeNative(); javaBlas = initializeJava(); - blas = nativeBlas != null ? nativeBlas : javaBlas; + + if (nativeBlas == null) { + if (javaBlas instanceof VectorBLAS) { + log.info("Using JavaBLAS, with features requiring at least Java 16 and the incubating Vector API"); + } else if (javaBlas instanceof Java11BLAS) { + log.info("Using JavaBLAS, with features requiring at least Java 11"); + } else if (javaBlas instanceof Java8BLAS) { + log.info("Using JavaBLAS, with features requiring at least Java 8"); + } else { + log.info("Using JavaBLAS"); + } + blas = javaBlas; + } else { + log.info("Using native BLAS"); + blas = nativeBlas; + } } public static BLAS blas() { @@ -49,7 +64,7 @@ private static NativeBLAS initializeNative() { try { return JNIBLAS.getInstance(); } catch (Throwable t) { - log.warning("Failed to load implementation from:" + JNIBLAS.class.getName()); + log.fine("Failed to load implementation from:" + JNIBLAS.class.getName()); return null; } } @@ -69,16 +84,15 @@ private static JavaBLAS initializeJava() { log.finest("trying to return java 16 instance"); return VectorBLAS.getInstance(); } catch (Throwable t) { - log.warning("Failed to load implementation from:" + VectorBLAS.class.getName()); + log.fine("Failed to load implementation from:" + VectorBLAS.class.getName()); } } if (major >= 11) { log.finest("return java 11 instance"); return Java11BLAS.getInstance(); - } else { - log.finest("return java 8 instance"); - return Java8BLAS.getInstance(); } + log.finest("return java 8 instance"); + return Java8BLAS.getInstance(); } public static JavaBLAS javaBlas() { diff --git a/lapack/src/main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java b/lapack/src/main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java index 83be7ea..e37774b 100644 --- a/lapack/src/main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java +++ b/lapack/src/main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java @@ -38,7 +38,14 @@ final class InstanceBuilder { static { nativeLapack = initializeNative(); javaLapack = initializeJava(); - lapack = nativeLapack != null ? nativeLapack : javaLapack; + + if (nativeLapack == null) { + log.info("Using JavaLAPACK"); + lapack = javaLapack; + } else { + log.info("Using native LAPACK"); + lapack = nativeLapack; + } } public static LAPACK lapack() { @@ -49,14 +56,14 @@ private static NativeLAPACK initializeNative() { try { return JNILAPACK.getInstance(); } catch (Throwable t) { - log.warning("Failed to load implementation from:" + JNILAPACK.class.getName()); + log.fine("Failed to load implementation from:" + JNILAPACK.class.getName()); return null; } } public static NativeLAPACK nativeLapack() { if (nativeLapack == null) { - throw new RuntimeException("Unable to load native implementation"); + throw new RuntimeException("Unable to load native LAPACK implementation"); } return nativeLapack; } From e22dc3ee35404042ec9fce42659a4b3dc6036d30 Mon Sep 17 00:00:00 2001 From: Udo Date: Fri, 5 Sep 2025 16:52:21 +0200 Subject: [PATCH 3/7] Use UncheckedIOException instead of RuntimeException for caught IOE --- .../src/main/java/dev/ludovic/netlib/arpack/JNIARPACK.java | 5 +++-- blas/src/main/java/dev/ludovic/netlib/blas/JNIBLAS.java | 5 +++-- .../src/main/java/dev/ludovic/netlib/lapack/JNILAPACK.java | 6 ++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/arpack/src/main/java/dev/ludovic/netlib/arpack/JNIARPACK.java b/arpack/src/main/java/dev/ludovic/netlib/arpack/JNIARPACK.java index dea23de..0abeb2b 100644 --- a/arpack/src/main/java/dev/ludovic/netlib/arpack/JNIARPACK.java +++ b/arpack/src/main/java/dev/ludovic/netlib/arpack/JNIARPACK.java @@ -25,8 +25,9 @@ package dev.ludovic.netlib.arpack; -import java.io.InputStream; import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; @@ -55,7 +56,7 @@ protected JNIARPACK() { StandardCopyOption.REPLACE_EXISTING); temp.toFile().deleteOnExit(); } catch (IOException e) { - throw new RuntimeException("Unable to load native implementation", e); + throw new UncheckedIOException("Unable to load native implementation", e); } System.load(temp.toString()); diff --git a/blas/src/main/java/dev/ludovic/netlib/blas/JNIBLAS.java b/blas/src/main/java/dev/ludovic/netlib/blas/JNIBLAS.java index 7cd5d71..b573dfc 100644 --- a/blas/src/main/java/dev/ludovic/netlib/blas/JNIBLAS.java +++ b/blas/src/main/java/dev/ludovic/netlib/blas/JNIBLAS.java @@ -25,8 +25,9 @@ package dev.ludovic.netlib.blas; -import java.io.InputStream; import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; @@ -55,7 +56,7 @@ protected JNIBLAS() { StandardCopyOption.REPLACE_EXISTING); temp.toFile().deleteOnExit(); } catch (IOException e) { - throw new RuntimeException("Unable to load native implementation", e); + throw new UncheckedIOException("Unable to load native implementation", e); } System.load(temp.toString()); diff --git a/lapack/src/main/java/dev/ludovic/netlib/lapack/JNILAPACK.java b/lapack/src/main/java/dev/ludovic/netlib/lapack/JNILAPACK.java index 04247eb..4e0fbc0 100644 --- a/lapack/src/main/java/dev/ludovic/netlib/lapack/JNILAPACK.java +++ b/lapack/src/main/java/dev/ludovic/netlib/lapack/JNILAPACK.java @@ -26,6 +26,7 @@ package dev.ludovic.netlib.lapack; import java.io.InputStream; +import java.io.UncheckedIOException; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -55,10 +56,11 @@ protected JNILAPACK() { StandardCopyOption.REPLACE_EXISTING); temp.toFile().deleteOnExit(); } catch (IOException e) { - throw new RuntimeException("Unable to load native implementation", e); + throw new UncheckedIOException("Unable to load native implementation", e); } - System.load(temp.toString());} + System.load(temp.toString()); + } public static NativeLAPACK getInstance() { return instance; From 0a205d12c7009dee5ff5f78790c62dcf0b1a0754 Mon Sep 17 00:00:00 2001 From: Udo Date: Fri, 5 Sep 2025 17:18:54 +0200 Subject: [PATCH 4/7] Add the throwable to the fine grained logging message Should help with #20 --- .../main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java | 2 +- .../main/java/dev/ludovic/netlib/blas/InstanceBuilder.java | 4 ++-- .../main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java b/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java index e95071e..7d2d3e1 100644 --- a/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java +++ b/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java @@ -56,7 +56,7 @@ private static NativeARPACK initializeNative() { try { return JNIARPACK.getInstance(); } catch (Throwable t) { - log.fine("Failed to load implementation from:" + JNIARPACK.class.getName()); + log.fine("Failed to load implementation from:" + JNIARPACK.class.getName(), t); return null; } } diff --git a/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java b/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java index 6e41869..46aa0e7 100644 --- a/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java +++ b/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java @@ -64,7 +64,7 @@ private static NativeBLAS initializeNative() { try { return JNIBLAS.getInstance(); } catch (Throwable t) { - log.fine("Failed to load implementation from:" + JNIBLAS.class.getName()); + log.fine("Failed to load implementation from:" + JNIBLAS.class.getName(), t); return null; } } @@ -84,7 +84,7 @@ private static JavaBLAS initializeJava() { log.finest("trying to return java 16 instance"); return VectorBLAS.getInstance(); } catch (Throwable t) { - log.fine("Failed to load implementation from:" + VectorBLAS.class.getName()); + log.fine("Failed to load implementation from:" + VectorBLAS.class.getName(), t); } } if (major >= 11) { diff --git a/lapack/src/main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java b/lapack/src/main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java index e37774b..6528bc1 100644 --- a/lapack/src/main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java +++ b/lapack/src/main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java @@ -56,7 +56,7 @@ private static NativeLAPACK initializeNative() { try { return JNILAPACK.getInstance(); } catch (Throwable t) { - log.fine("Failed to load implementation from:" + JNILAPACK.class.getName()); + log.fine("Failed to load implementation from:" + JNILAPACK.class.getName(), t); return null; } } From f27565535f3036c664d916577cccfe9d89ffa31b Mon Sep 17 00:00:00 2001 From: Udo Date: Fri, 5 Sep 2025 17:24:34 +0200 Subject: [PATCH 5/7] Fix logging for throwable info --- .../main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java | 3 ++- .../main/java/dev/ludovic/netlib/blas/InstanceBuilder.java | 5 +++-- .../main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java b/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java index 7d2d3e1..ee3ab96 100644 --- a/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java +++ b/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java @@ -25,6 +25,7 @@ package dev.ludovic.netlib.arpack; +import java.util.logging.Level; import java.util.logging.Logger; final class InstanceBuilder { @@ -56,7 +57,7 @@ private static NativeARPACK initializeNative() { try { return JNIARPACK.getInstance(); } catch (Throwable t) { - log.fine("Failed to load implementation from:" + JNIARPACK.class.getName(), t); + log.log(Level.FINE, "Failed to load implementation from:" + JNIARPACK.class.getName(), t); return null; } } diff --git a/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java b/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java index 46aa0e7..85bc598 100644 --- a/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java +++ b/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java @@ -25,6 +25,7 @@ package dev.ludovic.netlib.blas; +import java.util.logging.Level; import java.util.logging.Logger; final class InstanceBuilder { @@ -64,7 +65,7 @@ private static NativeBLAS initializeNative() { try { return JNIBLAS.getInstance(); } catch (Throwable t) { - log.fine("Failed to load implementation from:" + JNIBLAS.class.getName(), t); + log.log(Level.FINE, "Failed to load implementation from:" + JNIBLAS.class.getName(), t); return null; } } @@ -84,7 +85,7 @@ private static JavaBLAS initializeJava() { log.finest("trying to return java 16 instance"); return VectorBLAS.getInstance(); } catch (Throwable t) { - log.fine("Failed to load implementation from:" + VectorBLAS.class.getName(), t); + log.log(Level.FINE, "Failed to load implementation from:" + VectorBLAS.class.getName(), t); } } if (major >= 11) { diff --git a/lapack/src/main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java b/lapack/src/main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java index 6528bc1..782a83c 100644 --- a/lapack/src/main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java +++ b/lapack/src/main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java @@ -25,6 +25,7 @@ package dev.ludovic.netlib.lapack; +import java.util.logging.Level; import java.util.logging.Logger; final class InstanceBuilder { @@ -56,7 +57,7 @@ private static NativeLAPACK initializeNative() { try { return JNILAPACK.getInstance(); } catch (Throwable t) { - log.fine("Failed to load implementation from:" + JNILAPACK.class.getName(), t); + log.log(Level.FINE, "Failed to load implementation from:" + JNILAPACK.class.getName(), t); return null; } } From 54f4f1819807574ef20a54912f0d23bb3d9c15f3 Mon Sep 17 00:00:00 2001 From: Udo Date: Fri, 5 Sep 2025 17:38:53 +0200 Subject: [PATCH 6/7] Fix whitespace --- .../main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java | 2 +- blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java b/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java index ee3ab96..b316bdf 100644 --- a/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java +++ b/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java @@ -57,7 +57,7 @@ private static NativeARPACK initializeNative() { try { return JNIARPACK.getInstance(); } catch (Throwable t) { - log.log(Level.FINE, "Failed to load implementation from:" + JNIARPACK.class.getName(), t); + log.log(Level.FINE, "Failed to load implementation from:" + JNIARPACK.class.getName(), t); return null; } } diff --git a/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java b/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java index 85bc598..644e760 100644 --- a/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java +++ b/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java @@ -85,7 +85,7 @@ private static JavaBLAS initializeJava() { log.finest("trying to return java 16 instance"); return VectorBLAS.getInstance(); } catch (Throwable t) { - log.log(Level.FINE, "Failed to load implementation from:" + VectorBLAS.class.getName(), t); + log.log(Level.FINE, "Failed to load implementation from:" + VectorBLAS.class.getName(), t); } } if (major >= 11) { From d6d9955b981adea6f857ba9818de2fd30e71b710 Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Thu, 11 Sep 2025 12:16:12 +0000 Subject: [PATCH 7/7] Simplify dumping which blas/lapack/arpack we are using --- .../ludovic/netlib/arpack/InstanceBuilder.java | 9 ++------- .../ludovic/netlib/blas/InstanceBuilder.java | 17 ++--------------- .../ludovic/netlib/lapack/InstanceBuilder.java | 9 ++------- 3 files changed, 6 insertions(+), 29 deletions(-) diff --git a/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java b/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java index b316bdf..b591a4b 100644 --- a/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java +++ b/arpack/src/main/java/dev/ludovic/netlib/arpack/InstanceBuilder.java @@ -39,14 +39,9 @@ final class InstanceBuilder { static { nativeArpack = initializeNative(); javaArpack = initializeJava(); + arpack = nativeArpack != null ? nativeArpack : javaArpack; - if (nativeArpack == null) { - log.info("Using JavaARPACK"); - arpack = javaArpack; - } else { - log.info("Using native ARPACK"); - arpack = nativeArpack; - } + log.info("Using " + arpack.getClass().getName()); } public static ARPACK arpack() { diff --git a/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java b/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java index 644e760..236fd84 100644 --- a/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java +++ b/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java @@ -39,22 +39,9 @@ final class InstanceBuilder { static { nativeBlas = initializeNative(); javaBlas = initializeJava(); + blas = nativeBlas != null ? nativeBlas : javaBlas; - if (nativeBlas == null) { - if (javaBlas instanceof VectorBLAS) { - log.info("Using JavaBLAS, with features requiring at least Java 16 and the incubating Vector API"); - } else if (javaBlas instanceof Java11BLAS) { - log.info("Using JavaBLAS, with features requiring at least Java 11"); - } else if (javaBlas instanceof Java8BLAS) { - log.info("Using JavaBLAS, with features requiring at least Java 8"); - } else { - log.info("Using JavaBLAS"); - } - blas = javaBlas; - } else { - log.info("Using native BLAS"); - blas = nativeBlas; - } + log.info("Using " + blas.getClass().getName()); } public static BLAS blas() { diff --git a/lapack/src/main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java b/lapack/src/main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java index 782a83c..bb0c5ef 100644 --- a/lapack/src/main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java +++ b/lapack/src/main/java/dev/ludovic/netlib/lapack/InstanceBuilder.java @@ -39,14 +39,9 @@ final class InstanceBuilder { static { nativeLapack = initializeNative(); javaLapack = initializeJava(); + lapack = nativeLapack != null ? nativeLapack : javaLapack; - if (nativeLapack == null) { - log.info("Using JavaLAPACK"); - lapack = javaLapack; - } else { - log.info("Using native LAPACK"); - lapack = nativeLapack; - } + log.info("Using " + lapack.getClass().getName()); } public static LAPACK lapack() {