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) ⇒ Samples
constructor
A new instance of Samples.
Constructor Details
#initialize(grammar, seed: 0, max_tokens: 32, max_depth: 16, max_expansions: DEFAULT_MAX_EXPANSIONS) ⇒ Samples
Returns a new instance of Samples.
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
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 = (start, remaining_expansions) sample end end |