Slide 1

Slide 1 text

Magic in Fitnext — “engine, start”

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

? ? ? ? ? Where is the magic?

Slide 4

Slide 4 text

Ingredient Rules User’s program and diagnosis Food constraints

Slide 5

Slide 5 text

Food Constraints

Slide 6

Slide 6 text

• “detox = yes” • “cycle_index is odd” • “moment is breakfast” • “day_index included_in 1,3” Raw materials

Slide 7

Slide 7 text

Steps 1. Manufacture (mapping, translate) 2. Dynamic evaluation

Slide 8

Slide 8 text

Manufacture # # operator = (matcher.nil? || matcher.eql?('=') || ['odd', 'even'].include? (matcher)) ? '==' : matcher key = case attr when 'detox': 'has_detox_readiness' when 'objective': 'objective_id' when 'cycle_index' ['odd', 'even'].include?(matcher) ? 'cycle_parity' : 'cycle_number' else attr end val = ['odd', 'even'].include?(matcher) ? "\'#{matcher}'" : value

Slide 9

Slide 9 text

# "#{key} #{operator} #{val}" "has_detox_readiness == true" # "cycle_parity == 'odd'"

Slide 10

Slide 10 text

The object object = attr.eql?('sport_sessions_per_week') ? diagnosis : diagnosis.program # # program.rb def cycle_number user.program_histories.count + 1 end def cycle_parity (cycle_number % 2) == 0 ? 'even' : 'odd' end

Slide 11

Slide 11 text

Dynamic evaluation object.send(:eval, "#{key} #{operator} #{val}") — Code is data, data is code It is important for one to think of code as data to understand what eval is all about. The idea is that the code itself can be manifested as a primitive data type which the language can then make sense of. program.has_detox_readiness == true program.cycle_parity == 'odd' Kernel.eval()

Slide 12

Slide 12 text

eval() can be evil eval(“program.has_detox_readiness == User.delete_all”) Check and validate the user input!

Slide 13

Slide 13 text

constraint 1 constraint 2 constraint 3 constraint 4

Slide 14

Slide 14 text

Ingredient rules

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

# Diagnosis.rb include InferenceEngine::Inputs diagnosis.respond_to(“season_january”) == true

Slide 18

Slide 18 text

module InferenceEngine module Rule def evaluate(input_object) @evaluation_result = false if input_object.respond_to?(self.attribute_name) @evaluation_result = (input_object.send(self.attribute_name) == (self.value == 1)) else false end end end end # ingredient.rb include InferenceEngine::Inference # ingredient_rule.rb include InferenceEngine::Rule

Slide 19

Slide 19 text

module InferenceEngine module Inference def infere!(input_object) @excluded = false @priority_level = 0 @evaluated_rules = [] rules.each do |rule| @evaluated_rules << rule if rule.evaluate(input_object) case rule.human_rule_type when :exclude @excluded = true return when :prioritize @priority_level += 1 when :penalize @priority_level -= 1 end end end end

Slide 20

Slide 20 text

constraint 3

Slide 21

Slide 21 text

Thanks!