class Reflekt::Experiment

Public Instance Methods

randomize(args, input_rule_sets) click to toggle source

Create random values for each argument from control reflections.

@param args [Dynamic] The arguments to mirror random values for. @param input_rule_sets [Array] Aggregated rule sets for each argument.

@return [Dynamic] Random arguments.

# File lib/experiment.rb, line 84
def randomize(args, input_rule_sets)
  random_args = []

  args.each_with_index do |arg, arg_num|
    # Get a random rule in the rule set.
    rules = input_rule_sets[arg_num].rules
    agg_rule = rules[rules.keys.sample]

    # Create a random value that follows that rule.
    random_args << agg_rule.random()
  end

  return random_args
end
reflect(*args) click to toggle source

Reflect on a method.

Create a shadow action. @param *args [Dynamic] The method's arguments.

# File lib/experiment.rb, line 33
def reflect(*args)
  # Get aggregated rule sets.
  input_rule_sets = @aggregator.get_input_rule_sets(@klass, @method)
  output_rule_set = @aggregator.get_output_rule_set(@klass, @method)

  # Fail when no trained rule sets.
  if input_rule_sets.nil?
    @status = :fail
  end

  # When arguments exist.
  unless args.size == 0
    # Create random arguments from aggregated rule sets.
    unless input_rule_sets.nil?
      args = randomize(args, input_rule_sets)
    end

    # Create metadata for each argument.
    # TODO: Create metadata for other inputs such as instance variables.
    🔥"> Create meta for #{@method}(): #{args}", :info, :meta, @klass
    @inputs = MetaBuilder.create_many(args)
  end

  # Action method with random arguments.
  begin
    # Run reflection.
    output = @clone.send(@method, *args)
    @output = MetaBuilder.create(output)

    # Validate output against aggregated control rule sets.
    unless output_rule_set.nil?
      unless @aggregator.test_output(output, output_rule_set)
        @status = :fail
      end
    end

  # When a system error occurs.
  rescue StandardError => message
    @status = :fail
    @message = message
  end
end