Class: Bparity::Synthesis::MetamorphicDetector

Inherits:
Object
  • Object
show all
Defined in:
lib/bparity/synthesis.rb

Instance Method Summary collapse

Instance Method Details

#detect(callable, samples) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/bparity/synthesis.rb', line 39

def detect(callable, samples)
  return [] if samples.empty?

  relations = []
  relations << "idempotent" if holds? do
    samples.all? do |sample|
      callable.call(callable.call(sample)) == callable.call(sample)
    end
  end
  relations << "permutation_invariant" if samples.all?(Array) && holds? do
    samples.all? { |sample| callable.call(sample.reverse) == callable.call(sample) }
  end
  if samples.all?(Numeric)
    relations << "additive" if holds? do
      samples.product(samples).all? do |left, right|
        callable.call(left + right) == callable.call(left) + callable.call(right)
      end
    end
    relations << "monotonic" if holds? do
      samples.sort.each_cons(2).all? do |left, right|
        callable.call(left) <= callable.call(right)
      end
    end
  end
  relations
end