finding...

Aug. 21st, 2017 04:40 pm
juan_gandhi: (Default)
finding a bug in scala.util.Random - priceless
juan_gandhi: (Default)
Вычисляю, скажем, норму вектора; а там такой TraversableOnce, и он такой, перед тем как начать суммировать, проверяет, уж не пустая ли коллекция; а народная проверка на пустоту, как это принято на джавных языках, состоит в том, чтобы посчитать длину и удостовериться, что оная больше нуля. Ну казалось бы, нахер тебе длина. Ну и т.д. 

Да даже если просто hasNext() чекать, и то, инстанциируется итератор, а для этого нужно фильтровать базар, например, ну и т.д.

Это я вбрасываю реализма. Написал, например, Foldable на джаве, чтобы "ускорить процесс". В три раза, например, на длинных векторах.

Короче, сильные типы важны, но под покровом типов надо как-то хотя бы от боксинга избавиться.
juan_gandhi: (Default)
def matrix(h: VectorSpace, w: VectorSpace, values: Double*): Matrix[w.type, h.type] = {
val m = Matrix(w, h)
for {
i <- 0 until h.dim
j <- 0 until w.dim
} m(i, j) = values(i*w.dim+j)

m
}
The method is in a test, generates matrix from values.



juan_gandhi: (Default)
There seems to be no way to use path-dependent types in a recursive context. Even we pass a type as a type argument, as soon as you introduce a constraint, kaboom, your constraint is used literally. 
juan_gandhi: (Default)
  type voidness = {}
  val nothing: voidness = new {}
juan_gandhi: (Default)
Ну да, я пишу на скале. Но мечтал впендюрить в тип вектора его размер (размерность, по-нашему). Ну скала, не идрис же. Типы-то независимые.

Ан нет, это скала! Впендюрил. Всандалил класс VectorSpace (is it better if I call it LinearSpace? who fucking cares...); и в нем уже вектор. Проверять совместимость при сложении не надо, ну и все такое. К матрице присобачил два свойства - домен (одно пространство) и кодомен (другое пространство). И все заебись! Беру row - оно уже нужного типа и нужной длины, по дефолту, блин! Типы стали зависимы.

А если я так напишу class NormedLinearSpace extends VectorSpace with Norm (норма - у меня уже есть такой класс).

Классно же, а. Кстати, и вопросы перформенса легче решаются. Что-то у меня тайпклассы не пошли в этот раз.

juan_gandhi: (Default)
  private def diagonalize[T](f: Int => T): PartialFunction[(Int, Int), T] =
      { case (i, j) if i == j => f(i) }
juan_gandhi: (Default)
  def Unit(size: Int) = new Matrix.OnFunction(size, size, (i, j) => if (i == j) 1.0 else 0.0)
juan_gandhi: (Default)
Джавасприпт, Хаскель и Скала, и, говорят, OCaml, из-за своей компактности, канают в качестве скриптовых языков.

Питон в этом смысле тоже ничо, но там, во-первых, споткнуться можно много где, во-вторых, на уровне компиляции нам ничего не скажут. Это уже на продакшене ебанется. То-то квора, которая на питоне, деплоится по сто раз в час (а тесты потом гоняют, и кодревью тоже). 
juan_gandhi: (Default)
...for running linear algebra stuff on gpu?

github.com/deeplearning4j/nd4j - for Java
github.com/deeplearning4j/nd4s - for Scala

Judging by the title, got a feeling that yes.
juan_gandhi: (Default)
        val counts = ((0 until 3 map (_ -> 0) toMap) /: (0 until something.length.toInt)) {
          case (c, i) => {
            val k = something.at8(i).toInt
            val v = c(k) + 1
            c + (k -> v)
          }
        }


Just counting. It's a piece of a test, so...
juan_gandhi: (Default)
einführen language.ukrainian

об'єкт  Прикладення
{

  визначити головне(аргументи: массив стрічок): Пусте =
     надрукувати "Привіт, світ" 

} 
src
juan_gandhi: (Default)
завелся новый член, Хуй Ли.

Мне нравится. 
juan_gandhi: (Default)
Turned out all the delays were caused by two things:
- reading the files in parallel, as opposed to sequential (don't ask, will investigate)
- parallel output to stdout, instead of linearising the output. That was obviously my mistake, have to group the data, not mix them.

Now it's still 3 times faster than FP version. Got a suspicion that in JVM method dispatch is much heavier than plain if/else. It should be. But it's the staple of FP, never use booleans or ifs, but dispatch by the type. So, well... have to investigate.
juan_gandhi: (Default)
    // Set name from main class if not given
    name = Option(name).orElse(Option(mainClass)).orNull
    if (name == null && primaryResource != null) {
      name = Utils.stripDirectory(primaryResource)
    }


Just a chunk of their funny shitty code.

FYI, var name: String = null

I'd rewrite all that crap, but it's not only code, I'm afraid. It's the whole Spark world that needs a doctor.
juan_gandhi: (VP)
case class a(i:Int)
{
  override def canEqual(a: Any) = a.isInstanceOf[a]

  override def equals(o:Any) = AnyRef.equals(o)

  override def hashCode = AnyRef.hashCode
}

val aa = new a(1)
aa == aa //false
juan_gandhi: (VP)
You know the difference in Scala between val f: A=>B and def f(a:A): B?

I do.

The first one is a point in BA; the second one is an arrow from A to B. Yes, there's an adjunction, so there's a 1-1 correspondence, thanks to Yoneda lemma; it's basically a special case of currying.

Profile

juan_gandhi: (Default)
juan_gandhi

August 2017

S M T W T F S
   1 23 4 5
6 7 8 9 10 11 12
13 14 15 16 1718 19
20 21 2223242526
2728293031  

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 23rd, 2017 06:23 am
Powered by Dreamwidth Studios