ojAlgo v48
diff --git a/pom.xml b/pom.xml
index bbf59bd..fddeaa1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -94,7 +94,7 @@
   <properties>
     
     <!-- UNIQUE FOR THIS JAVA COMPONENT -->
-    <ojalgo.version>47.0.0</ojalgo.version> 
+    <ojalgo.version>48.0.0-SNAPSHOT</ojalgo.version> 
     <datasketches-memory.version>1.1.0-incubating</datasketches-memory.version>
     <!-- END:UNIQUE FOR THIS JAVA COMPONENT -->
     
diff --git a/src/main/java/org/apache/datasketches/vector/decomposition/MatrixOpsImplOjAlgo.java b/src/main/java/org/apache/datasketches/vector/decomposition/MatrixOpsImplOjAlgo.java
index 4c1f8d1..39fd0d8 100644
--- a/src/main/java/org/apache/datasketches/vector/decomposition/MatrixOpsImplOjAlgo.java
+++ b/src/main/java/org/apache/datasketches/vector/decomposition/MatrixOpsImplOjAlgo.java
@@ -25,7 +25,7 @@
 import org.ojalgo.matrix.decomposition.QR;
 import org.ojalgo.matrix.decomposition.SingularValue;
 import org.ojalgo.matrix.store.MatrixStore;
-import org.ojalgo.matrix.store.PrimitiveDenseStore;
+import org.ojalgo.matrix.store.Primitive64Store;
 import org.ojalgo.matrix.store.SparseStore;
 import org.ojalgo.random.Normal;
 
@@ -34,11 +34,11 @@
 
 class MatrixOpsImplOjAlgo extends MatrixOps {
   private double[] sv_;
-  private PrimitiveDenseStore Vt_;
+  private Primitive64Store Vt_;
 
   // work objects for SISVD
-  private PrimitiveDenseStore block_;
-  private PrimitiveDenseStore T_; // also used in SymmetricEVD
+  private Primitive64Store block_;
+  private Primitive64Store T_; // also used in SymmetricEVD
   private QR<Double> qr_;
 
   // work objects for Symmetric EVD
@@ -68,21 +68,21 @@
     }
 
     if (computeVectors && (Vt_ == null)) {
-      Vt_ = PrimitiveDenseStore.FACTORY.makeZero(n_, d_);
+      Vt_ = Primitive64Store.FACTORY.make(n_, d_);
       S_ = SparseStore.makePrimitive(sv_.length, sv_.length);
     }
 
     switch (algo_) {
       case FULL:
-        computeFullSVD((PrimitiveDenseStore) A.getRawObject(), computeVectors);
+        computeFullSVD((Primitive64Store) A.getRawObject(), computeVectors);
         return;
 
       case SISVD:
-        computeSISVD((PrimitiveDenseStore) A.getRawObject(), computeVectors);
+        computeSISVD((Primitive64Store) A.getRawObject(), computeVectors);
         return;
 
       case SYM:
-        computeSymmEigSVD((PrimitiveDenseStore) A.getRawObject(), computeVectors);
+        computeSymmEigSVD((Primitive64Store) A.getRawObject(), computeVectors);
         return;
 
       default:
@@ -131,7 +131,7 @@
     }
 
     // store the result back in A
-    S_.multiply(Vt_, (PrimitiveDenseStore) A.getRawObject());
+    S_.multiply(Vt_, (Primitive64Store) A.getRawObject());
 
     return svAdjustment;
   }
@@ -139,8 +139,8 @@
   @Override
   Matrix applyAdjustment(final Matrix A, final double svAdjustment) {
     // copy A before decomposing
-    final PrimitiveDenseStore result
-            = PrimitiveDenseStore.FACTORY.copy((PrimitiveDenseStore) A.getRawObject());
+    final Primitive64Store result
+            = Primitive64Store.FACTORY.copy((Primitive64Store) A.getRawObject());
     svd(Matrix.wrap(result), true);
 
     for (int i = 0; i < (k_ - 1); ++i) {
@@ -159,12 +159,12 @@
 
   private void computeFullSVD(final MatrixStore<Double> A, final boolean computeVectors) {
     if (svd_ == null) {
-      svd_ = SingularValue.make(A);
+      svd_ = SingularValue.PRIMITIVE.make(A);
     }
 
     if (computeVectors) {
       svd_.decompose(A);
-      svd_.getQ2().transpose().supplyTo(Vt_);
+      svd_.getV().transpose().supplyTo(Vt_);
     } else {
       svd_.computeValuesOnly(A);
     }
@@ -175,9 +175,9 @@
     // want to iterate on smaller dimension of A (n x d)
     // currently, error in constructor if d < n, so n is always the smaller dimension
     if (block_ == null) {
-      block_ = PrimitiveDenseStore.FACTORY.makeFilled(d_, k_, new Normal(0.0, 1.0));
+      block_ = Primitive64Store.FACTORY.makeFilled(d_, k_, new Normal(0.0, 1.0));
       qr_ = QR.PRIMITIVE.make(block_);
-      T_ = PrimitiveDenseStore.FACTORY.makeZero(n_, k_);
+      T_ = Primitive64Store.FACTORY.make(n_, k_);
     } else {
       block_.fillAll(new Normal(0.0, 1.0));
     }
@@ -196,7 +196,7 @@
 
     // Rayleigh-Ritz postprocessing
 
-    final SingularValue<Double> svd = SingularValue.make(T_);
+    final SingularValue<Double> svd = SingularValue.PRIMITIVE.make(T_);
     svd.compute(block_.premultiply(A));
 
     svd.getSingularValues(sv_);
@@ -204,7 +204,7 @@
     if (computeVectors) {
       // V = block * Q2^T so V^T = Q2 * block^T
       // and ojAlgo figures out that it only needs to fill the first k_ rows of Vt_
-      svd.getQ2().multiply(block_.transpose()).supplyTo(Vt_);
+      svd.getV().multiply(block_.transpose()).supplyTo(Vt_);
     }
   }
 
diff --git a/src/main/java/org/apache/datasketches/vector/matrix/Matrix.java b/src/main/java/org/apache/datasketches/vector/matrix/Matrix.java
index 284eee6..384a425 100644
--- a/src/main/java/org/apache/datasketches/vector/matrix/Matrix.java
+++ b/src/main/java/org/apache/datasketches/vector/matrix/Matrix.java
@@ -21,7 +21,7 @@
 
 import static org.apache.datasketches.vector.matrix.MatrixPreambleUtil.LS;
 
-import org.ojalgo.matrix.store.PrimitiveDenseStore;
+import org.ojalgo.matrix.store.Primitive64Store;
 
 import org.apache.datasketches.memory.Memory;
 import org.apache.datasketches.vector.MatrixFamily;
@@ -62,8 +62,8 @@
   public static Matrix wrap(final Object mtx) {
     if (mtx == null) {
       return null;
-    } else if (mtx instanceof PrimitiveDenseStore) {
-      return MatrixImplOjAlgo.wrap((PrimitiveDenseStore) mtx);
+    } else if (mtx instanceof Primitive64Store) {
+      return MatrixImplOjAlgo.wrap((Primitive64Store) mtx);
     }
     else {
       throw new IllegalArgumentException("wrap() does not currently support "
diff --git a/src/main/java/org/apache/datasketches/vector/matrix/MatrixImplOjAlgo.java b/src/main/java/org/apache/datasketches/vector/matrix/MatrixImplOjAlgo.java
index 590ddcb..22708a0 100644
--- a/src/main/java/org/apache/datasketches/vector/matrix/MatrixImplOjAlgo.java
+++ b/src/main/java/org/apache/datasketches/vector/matrix/MatrixImplOjAlgo.java
@@ -29,25 +29,25 @@
 import static org.apache.datasketches.vector.matrix.MatrixPreambleUtil.extractPreLongs;
 import static org.apache.datasketches.vector.matrix.MatrixPreambleUtil.extractSerVer;
 
-import org.ojalgo.matrix.store.PrimitiveDenseStore;
+import org.ojalgo.matrix.store.Primitive64Store;
 
 import org.apache.datasketches.memory.Memory;
 import org.apache.datasketches.memory.WritableMemory;
 import org.apache.datasketches.vector.MatrixFamily;
 
 /**
- * Implements the OJ-Algo Matrix operations.
+ * Implements the ojAlgo Matrix operations.
  */
 public final class MatrixImplOjAlgo extends Matrix {
-  private PrimitiveDenseStore mtx_;
+  private Primitive64Store mtx_;
 
   private MatrixImplOjAlgo(final int numRows, final int numCols) {
-    mtx_ = PrimitiveDenseStore.FACTORY.makeZero(numRows, numCols);
+    mtx_ = Primitive64Store.FACTORY.make(numRows, numCols);
     numRows_ = numRows;
     numCols_ = numCols;
   }
 
-  private MatrixImplOjAlgo(final PrimitiveDenseStore mtx) {
+  private MatrixImplOjAlgo(final Primitive64Store mtx) {
     mtx_ = mtx;
     numRows_ = (int) mtx.countRows();
     numCols_ = (int) mtx.countColumns();
@@ -100,7 +100,7 @@
     return matrix;
   }
 
-  static Matrix wrap(final PrimitiveDenseStore mtx) {
+  static Matrix wrap(final Primitive64Store mtx) {
     return new MatrixImplOjAlgo(mtx);
   }
 
diff --git a/src/test/java/org/apache/datasketches/vector/matrix/MatrixImplOjAlgoTest.java b/src/test/java/org/apache/datasketches/vector/matrix/MatrixImplOjAlgoTest.java
index ab76ea5..f46d5f5 100644
--- a/src/test/java/org/apache/datasketches/vector/matrix/MatrixImplOjAlgoTest.java
+++ b/src/test/java/org/apache/datasketches/vector/matrix/MatrixImplOjAlgoTest.java
@@ -22,7 +22,7 @@
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.fail;
 
-import org.ojalgo.matrix.store.PrimitiveDenseStore;
+import org.ojalgo.matrix.store.Primitive64Store;
 import org.testng.annotations.Test;
 
 import org.apache.datasketches.memory.Memory;
@@ -39,7 +39,7 @@
     assertEquals(m.getNumRows(), nRows);
     assertEquals(m.getNumColumns(), nCols);
 
-    final PrimitiveDenseStore pds = (PrimitiveDenseStore) m.getRawObject();
+    final Primitive64Store pds = (Primitive64Store) m.getRawObject();
     assertEquals(pds.countRows(), nRows);
     assertEquals(pds.countColumns(), nCols);
 
@@ -215,7 +215,7 @@
    * starting with 1.0.
    * @param nRows number of rows
    * @param nCols number of columns
-   * @return PrimitiveDenseStore, suitable for direct use or wrapping
+   * @return Primitive64Store, suitable for direct use or wrapping
    */
   private static Matrix generateIncreasingEye(final int nRows, final int nCols) {
     final Matrix m = MatrixImplOjAlgo.newInstance(nRows, nCols);