uncomplicate / neanderthal

Fast Clojure Matrix Library
http://neanderthal.uncomplicate.org
Eclipse Public License 1.0
1.06k stars 56 forks source link

In-place mm! is not supported for GE matrices. Use QR #106

Closed zendevil closed 3 years ago

zendevil commented 3 years ago

I'm test multiplying two matrices like so:

(mm! (ge fac 2 1) (ge fac 1 2) (ge fac 2 2))

Following the tests in the source code:

(with-release [c (ge factory 2 2 [1 2 3 4])]
           (identical? (mm! 2.0 (ge factory 2 3 [1 2 3 4 5 6]) (ge factory 3 2 [1 2 3 4 5 6]) 3.0 c) c))

But I'm getting the following error:

1. Unhandled clojure.lang.ExceptionInfo
   Dragan says: In-place mm! is not supported for GE matrices. Use QR
   factorization.
   {:b
    {:offset 0,
     :layout :column,
     :dim 4,
     :n 2,
     :m 2,
     :entry-type double,
     :region
     {:region-type :full,
      :m 2,
      :n 2,
      :kl 1,
      :ku 1,
      :surface 4,
      :uplo :lower,
      :diag :non-unit},
     :matrix-type :ge,
     :class uncomplicate.neanderthal.internal.host.buffer_block.RealGEMatrix,
     :storage
     {:storage-type :full, :sd 2, :ld 2, :fd 2, :gapless true, :capacity 4},
     :device :cpu,
     :engine "uncomplicate.neanderthal.internal.host.mkl.DoubleGEEngine@5356090c",
     :master true,
     :stride 2},
    :a
    {:offset 0,
     :layout :column,
     :dim 2,
     :n 2,
     :m 1,
     :entry-type double,
     :region
     {:region-type :full,
      :m 1,
      :n 2,
      :kl 0,
      :ku 1,
      :surface 2,
      :uplo :lower,
      :diag :non-unit},
     :matrix-type :ge,
     :class uncomplicate.neanderthal.internal.host.buffer_block.RealGEMatrix,
     :storage
     {:storage-type :full, :sd 1, :ld 1, :fd 2, :gapless true, :capacity 2},
     :device :cpu,
     :engine "uncomplicate.neanderthal.internal.host.mkl.DoubleGEEngine@5356090c",
     :master true,
     :stride 1}}
                 utils.clj:  107  uncomplicate.commons.utils/dragan-says-ex
                 utils.clj:  105  uncomplicate.commons.utils/dragan-says-ex
                   mkl.clj: 1027  uncomplicate.neanderthal.internal.host.mkl.DoubleGEEngine/mm
                  core.clj: 1432  uncomplicate.neanderthal.core/mm!
                  core.clj: 1391  uncomplicate.neanderthal.core/mm!
                      REPL:   60  clotorch.flight.flight/eval79515
                      REPL:   60  clotorch.flight.flight/eval79515
             Compiler.java: 7177  clojure.lang.Compiler/eval
             Compiler.java: 7132  clojure.lang.Compiler/eval
                  core.clj: 3214  clojure.core/eval
                  core.clj: 3210  clojure.core/eval
                  main.clj:  437  clojure.main/repl/read-eval-print/fn
                  main.clj:  437  clojure.main/repl/read-eval-print
                  main.clj:  458  clojure.main/repl/fn
                  main.clj:  458  clojure.main/repl
                  main.clj:  368  clojure.main/repl
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  665  clojure.core/apply
                  core.clj:  660  clojure.core/apply
                regrow.clj:   18  refactor-nrepl.ns.slam.hound.regrow/wrap-clojure-repl/fn
               RestFn.java: 1523  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   79  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:   55  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:  142  nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
                  AFn.java:   22  clojure.lang.AFn/run
               session.clj:  171  nrepl.middleware.session/session-exec/main-loop/fn
               session.clj:  170  nrepl.middleware.session/session-exec/main-loop
                  AFn.java:   22  clojure.lang.AFn/run
               Thread.java:  748  java.lang.Thread/run

How to fix this error?

blueberry commented 3 years ago

Please look at the source of that test, compare it to your example, and you'll see that it's not similar.