Class: Ibex::Samples

Inherits:
Object
  • Object
show all
Defined in:
lib/ibex/samples.rb

Overview

Generates bounded terminal sentences from Grammar IR.

Constant Summary collapse

DEFAULT_MAX_EXPANSIONS =

: Integer

100_000

Instance Method Summary collapse

Constructor Details

#initialize(grammar, seed: 0, max_tokens: 32, max_depth: 16, max_expansions: DEFAULT_MAX_EXPANSIONS) ⇒ Samples

Returns a new instance of Samples.

Raises:

  • (ArgumentError)


11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/ibex/samples.rb', line 11

def initialize(grammar, seed: 0, max_tokens: 32, max_depth: 16, max_expansions: DEFAULT_MAX_EXPANSIONS)
  raise ArgumentError, "max_tokens must be positive" unless max_tokens.positive?
  raise ArgumentError, "max_depth must be positive" unless max_depth.positive?
  raise ArgumentError, "max_expansions must be positive" unless max_expansions.positive?

  @grammar = grammar
  @random = Random.new(seed)
  @max_tokens = max_tokens
  @max_depth = max_depth
  @max_expansions = max_expansions
  @productions = grammar.productions.group_by(&:lhs)
  @minimum_costs = compute_minimum_costs
  @minimum_heights = compute_minimum_heights
end

Instance Method Details

#generate(count: 1) ⇒ Object

Raises:

  • (ArgumentError)


27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/ibex/samples.rb', line 27

def generate(count: 1)
  raise ArgumentError, "count must be positive" unless count.positive?

  start = @grammar.symbol(@grammar.start) || raise(Ibex::Error, "(samples):1:1: missing start symbol")
  minimum = @minimum_costs.fetch(start.id, nil)
  raise Ibex::Error, "(samples):1:1: start symbol #{@grammar.start} derives no terminal sentence" unless minimum

  if minimum > @max_tokens
    raise Ibex::Error, "(samples):1:1: minimum sentence needs #{minimum} tokens; limit is #{@max_tokens}"
  end
  if count > @max_expansions
    raise Ibex::Error, "(samples):1:1: count #{count} exceeds expansion limit #{@max_expansions}"
  end

  remaining_expansions = @max_expansions
  Array.new(count) do
    sample, remaining_expansions = expand(start, remaining_expansions)
    sample
  end
end