Линейная алгебра Breeze с пользовательским типом данных

Я пытаюсь реализовать кодирование Humming с помощью пакета линейной алгебры Breeze (https://github.com/scalanlp/breeze) и мой собственный тип данных, представляющий поле GF2. До сих пор мне удалось успешно реализовать свой GF2:

package humming

trait GF2 {
  def + (that: GF2): GF2
  def * (that: GF2): GF2

  def / (that: GF2) = that match {
    case Zero => throw new IllegalArgumentException("Div by 0")
    case _ => this
  }
}

object Zero extends GF2 {
  override def toString = "Zero"
  def + (that: GF2) = that
  def * (that: GF2) = this
}

object One extends GF2 {
  override def toString = "One"
  def + (that: GF2) = that match { case One => Zero ; case _ => this }
  def * (that: GF2) = that match { case One => this ; case _ => that }
}

и необходимые классы типов для создания матрицы значений GF2:

import breeze.linalg._
import breeze.numerics._
import breeze.storage._
import scala.reflect._
import breeze.math._
import humming._

implicit object GF2DefaultArrayValue extends DefaultArrayValue[GF2] {
  override def value = Zero
}

implicit object GF2Semiring extends Semiring[GF2] {
  def defaultArrayValue = GF2DefaultArrayValue
  def manifest = classTag[GF2]
  def zero = Zero
  def one = One

  def ==(a: GF2, b: GF2) = a == b
  def !=(a: GF2, b: GF2) = a != b
  def +(a: GF2, b: GF2) = a + b
  def *(a: GF2, b: GF2) = a * b
}

val a = DenseMatrix.eye[GF2](5)

Но когда я пытаюсь добавить матрицу к себе, я получаю следующую ошибку:

a + a  
// could not find implicit value for parameter op:  
// breeze.linalg.operators.BinaryOp[breeze.linalg.DenseMatrix[humming.GF2],  
// breeze.linalg.DenseMatrix[humming.GF2],breeze.linalg.operators.OpAdd,That]

На данный момент я застрял, потому что я не совсем понимаю, какой класс типа я должен реализовать сейчас. Просмотр breeze.linalg.operators мало чем помог. Итак, вопрос в том, что мне нужно сделать, чтобы соединить мой GF2 с Breeze таким образом, чтобы все матричные/векторные операции могли поддерживаться?

==============
Проблема выше решена в версии 0.6
Однако я все еще не могу умножить матрицу на вектор или на значение:

val a = DenseMatrix.eye[GF2](5)
val b = DenseVector.ones[GF2](5)
a + a // OK

a * b  
// Could not find an implicit implementation for this UFunc with arguments  
// breeze.linalg.DenseMatrix[humming.GF2], breeze.linalg.DenseVector[humming.GF2]

a + One  
// Could not find an implicit implementation for this UFunc with arguments  
// breeze.linalg.DenseMatrix[humming.GF2], humming.One.type

Я полагаю, я должен предоставить реализацию UFunc. Как это должно выглядеть?


person src091    schedule 15.02.2014    source источник


Ответы (1)


Это работает в последнем снимке Breeze. Я выпущу 0.6 в эти выходные.

scala> val a = DenseMatrix.eye[GF2](5)
a: breeze.linalg.DenseMatrix[X.GF2] =
One   Zero  Zero  Zero  Zero
Zero  One   Zero  Zero  Zero
Zero  Zero  One   Zero  Zero
Zero  Zero  Zero  One   Zero
Zero  Zero  Zero  Zero  One

scala> a + a
res0: breeze.linalg.DenseMatrix[X.GF2] =
Zero  Zero  Zero  Zero  Zero
Zero  Zero  Zero  Zero  Zero
Zero  Zero  Zero  Zero  Zero
Zero  Zero  Zero  Zero  Zero
Zero  Zero  Zero  Zero  Zero
person dlwh    schedule 15.02.2014
comment
Спасибо! Возможно, вы также могли бы помочь с моей последующей проблемой (умножение матрицы на вектор)? - person src091; 16.02.2014