Я пытаюсь реализовать кодирование 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
. Как это должно выглядеть?