Slide 1

Slide 1 text

CODE AS DATA DENIS DEFREYNE / RUG-.B / 2018-07-05

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

$$$

Slide 4

Slide 4 text

Slide 5

Slide 5 text

$$$

Slide 6

Slide 6 text

def total_price 200 + volume * distance end

Slide 7

Slide 7 text

def total_price 200 + volume * distance end sum

Slide 8

Slide 8 text

def total_price 200 + volume * distance end sum product

Slide 9

Slide 9 text

def total_price 200 + volume * distance end sum product variable

Slide 10

Slide 10 text

def total_price 200 + volume * distance end sum product constant variable

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

class Sum def initialize(left, right) @left = left @right = right end end

Slide 13

Slide 13 text

class Sum def initialize(left, right) @left = left @right = right end end class Product def initialize(left, right) @left = left @right = right end end

Slide 14

Slide 14 text

class Sum def initialize(left, right) @left = left @right = right end end class Product def initialize(left, right) @left = left @right = right end end class Constant def initialize(value) @value = value end end

Slide 15

Slide 15 text

class Sum def initialize(left, right) @left = left @right = right end end class Product def initialize(left, right) @left = left @right = right end end class Constant def initialize(value) @value = value end end class Variable def initialize(name) @name = name end end

Slide 16

Slide 16 text

def price_formula Sum.new( Constant.new(200), Product.new( Variable.new(Fvolume), Variable.new(Fdistance), ) ) end

Slide 17

Slide 17 text

input = { volume: 20, distance: 200, } price_formula.evaluate(input)

Slide 18

Slide 18 text

class Variable def initialize(name) @name = name end def evaluate(input) input.fetch(@name) end end

Slide 19

Slide 19 text

class Constant def initialize(value) @value = value end def evaluate(_input) @value end end

Slide 20

Slide 20 text

class Sum def initialize(left, right) @left = left @right = right end def evaluate(input) @left.evaluate(input) + @right.evaluate(input) end end

Slide 21

Slide 21 text

class Product def initialize(left, right) @left = left @right = right end def evaluate(input) @left.evaluate(input) * @right.evaluate(input) end end

Slide 22

Slide 22 text

def price_formula Sum.new( Constant.new(200), Product.new( Variable.new(Fvolume), Variable.new(Fdistance), ), ) end 
 
 


Slide 23

Slide 23 text

def price_formula Sum.new( Constant.new(200), Product.new( Variable.new(Fvolume), Variable.new(Fdistance), ) ) end def price_formula Constant.new(200) + Variable.new(Fvolume) * Variable.new(Fdistance) end

Slide 24

Slide 24 text

class AbstractExpr def +(other) Sum.new(self, other) end def *(other) Product.new(self, other) end end

Slide 25

Slide 25 text

class Sum < AbstractExpr # … end class Product < AbstractExpr # … end class Constant < AbstractExpr # … end class Variable < AbstractExpr # … end

Slide 26

Slide 26 text

def price_formula Constant.new(200) + Variable.new(Fvolume) * Variable.new(Fdistance) end

Slide 27

Slide 27 text

THE POINT

Slide 28

Slide 28 text

Constant.new(200) + Variable.new(Fvolume) * Variable.new(Fdistance)
 
 
 
 
 
 
 


Slide 29

Slide 29 text

Constant.new(200) + Variable.new(Fvolume) * Variable.new(Fdistance)
 
 
 
 + UV> 4200 const UV> 200 * UV> 4000 var volume UV> 20 var distance UV> 200

Slide 30

Slide 30 text

class Node def initialize(name, value, children) @name = name @value = value @children = children end end

Slide 31

Slide 31 text

+ UV> 4200 const UV> 200 * UV> 4000 var volume UV> 20 var distance UV> 200

Slide 32

Slide 32 text

+ UV> 4200 const UV> 200 * UV> 4000 var volume UV> 20 var distance UV> 200 Node.new("+", 4200, [const_node, product_node])

Slide 33

Slide 33 text

+ UV> 4200 const UV> 200 * UV> 4000 var volume UV> 20 var distance UV> 200 Node.new("+", 4200, [const_node, product_node]) Node.new("var volume", 20, [])

Slide 34

Slide 34 text

class Variable < AbstractExpr def initialize(name) @name = name end def evaluate(input) Node.new( "var #{@name}", input.fetch(@name), [], ) end end

Slide 35

Slide 35 text

class Constant def initialize(value) @value = value end def evaluate(_input) Node.new( 'const', @value, [], ) end end

Slide 36

Slide 36 text

class Sum def initialize(left, right) @left = left @right = right end def evaluate(input) left_node = @left.evaluate(input) right_node = @right.evaluate(input) Node.new( '+', left_node.value + right_node.value, [left_node, right_node], ) end end

Slide 37

Slide 37 text

class Product def initialize(left, right) @left = left @right = right end def evaluate(input) left_node = @left.evaluate(input) right_node = @right.evaluate(input) Node.new( '*', left_node.value * right_node.value, [left_node, right_node], ) end end

Slide 38

Slide 38 text

class Node def to_s "#{@name} UV> #{@value}\n" + @children.map { |c| indent(c.to_s) }.join('') end private def indent(s) s.lines.map { |l| ' ' + l }.join('') end end

Slide 39

Slide 39 text

puts price_formula.evaluate(input)
 
 
 
 
 


Slide 40

Slide 40 text

puts price_formula.evaluate(input) + ./> 4200 const ./> 200 * ./> 4000 var volume ./> 20 var distance ./> 200

Slide 41

Slide 41 text

puts price_formula.evaluate(input).value
 


Slide 42

Slide 42 text

puts price_formula.evaluate(input).value
 
 4200

Slide 43

Slide 43 text

+ UV> 4200 const UV> 200 * UV> 4000 var volume UV> 20 var distance UV> 200

Slide 44

Slide 44 text

+ (= 4200) const (= 200) * (= 4000) var distance (= 200) var volume (= 20)

Slide 45

Slide 45 text

IDEA: translate to SQL

Slide 46

Slide 46 text

IDEA: compile with LLVM

Slide 47

Slide 47 text

What about input?

Slide 48

Slide 48 text

BACKEND

Slide 49

Slide 49 text

BACKEND formula

Slide 50

Slide 50 text

BACKEND PARSE + SERIALIZE formula

Slide 51

Slide 51 text

PARSING:
 parse("200 + volume * distance") 
 
 
 
 
 
 
 
 
 


Slide 52

Slide 52 text

PARSING:
 parse("200 + volume * distance") D> Sum.new( Constant.new(200), Product.new( Variable.new(Kvolume), Variable.new(Kdistance), ) )
 
 
 


Slide 53

Slide 53 text

SERIALIZING: formula = Sum.new( Constant.new(200), Product.new( Variable.new(Fvolume), Variable.new(Fdistance), ) ) serialize(formula) 


Slide 54

Slide 54 text

SERIALIZING: formula = Sum.new( Constant.new(200), Product.new( Variable.new(Fvolume), Variable.new(Fdistance), ) ) serialize(formula) D> ["sum", ["constant", 200], ["product", ["var", "volume"], ["var", "distance"]]

Slide 55

Slide 55 text

BACKEND PARSE + SERIALIZE formula

Slide 56

Slide 56 text

BACKEND PARSE + SERIALIZE DESERIALIZE + UNPARSE formula

Slide 57

Slide 57 text

formula

Slide 58

Slide 58 text

formula A (stable) formula B (testing)

Slide 59

Slide 59 text

formula A (old) formula B (stable)

Slide 60

Slide 60 text

Is this over-engineering?

Slide 61

Slide 61 text

TAKE-AWAYS

Slide 62

Slide 62 text

* It’s much easier to reason about data
 than to reason about code. 
 


Slide 63

Slide 63 text

* It’s much easier to reason about data
 than to reason about code. * Try novel approaches; they can
 reveal new opportunities.

Slide 64

Slide 64 text

No content