Class: Ibex::Samples
- Inherits:
-
Object
- Object
- Ibex::Samples
- 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
- #generate(count: 1) ⇒ Object
-
#initialize(grammar, seed: 0, max_tokens: 32, max_depth: 16, max_expansions: DEFAULT_MAX_EXPANSIONS, strategy: :random, path_length: 1) ⇒ Samples
constructor
A new instance of Samples.
Constructor Details
#initialize(grammar, seed: 0, max_tokens: 32, max_depth: 16, max_expansions: DEFAULT_MAX_EXPANSIONS, strategy: :random, path_length: 1) ⇒ Samples
Returns a new instance of Samples.
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/ibex/samples.rb', line 11 def initialize(grammar, seed: 0, max_tokens: 32, max_depth: 16, max_expansions: DEFAULT_MAX_EXPANSIONS, strategy: :random, path_length: 1) 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? normalized_strategy = strategy.to_sym unless %i[random coverage].include?(normalized_strategy) raise ArgumentError, "strategy must be :random or :coverage" end raise ArgumentError, "path_length must be 1 or 2" unless [1, 2].include?(path_length) @grammar = grammar @random = Random.new(seed) @max_tokens = max_tokens @max_depth = max_depth @max_expansions = max_expansions @strategy = normalized_strategy @path_length = path_length @path_coverage = Hash.new(0) #: Hash[Array[Integer], Integer] @productions = grammar.productions.group_by(&:lhs) @minimum_costs = compute_minimum_costs @minimum_heights = compute_minimum_heights end |
Instance Method Details
#generate(count: 1) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/ibex/samples.rb', line 37 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 = (start, remaining_expansions) sample end end |