classCompletionCosts
final class CompletionCosts
Computes minimum expansion costs separately for empty and non-empty output.
Methods§
public function __construct(Grammar $grammar, private Closure(string): bool $nonOutput)Computes the least fixed point once for a grammar and its declared non-output markers.
Parameters
$grammar | Grammar | |
$nonOutput | Closure(string): bool | Identifies declared non-output parser markers |
Test cases 5
CompletionCostsTest::testAffordableRetainsExactlyTheAlternativesThatCanFinishWithinBudgetcoversCompletionCostsTest::testCompletionAllowsAnEmptyProductionWhenItsSiblingEmitsOutputcoversCompletionCostsTest::testHasTerminalOutputDistinguishesEmittedTerminalsFromMarkersAndPendingRulescoversCompletionCostsTest::testRuleFindsFiniteCompletionsThroughNullableRecursioncoversCompletionCostsTest::testSequenceCountsMarkersAsEmptyAndReservesAllSiblingscovers
Calls 4
- function-call
array_fill_keysline 37 - function-call
array_keysline 37 - method-call CompletionCosts::sequence() line 42
- static-call CompletionCosts::add() line 44
public function rule(string $name, bool $nonEmpty): intReturns the minimum total expansions from a rule.
Parameters
$name | string | |
$nonEmpty | bool |
Returns
intTest cases 1
Calls 1
- function-call
minline 61
public function sequence(list<Symbol> $symbols): array{int, int}Costs all children and pending siblings together, preserving nullability.
Parameters
$symbols | list<Symbol> |
Returns
array{int, int}Test cases 5
CompletionCostsTest::testAffordableRetainsExactlyTheAlternativesThatCanFinishWithinBudgetcoversCompletionCostsTest::testCompletionAllowsAnEmptyProductionWhenItsSiblingEmitsOutputcoversCompletionCostsTest::testHasTerminalOutputDistinguishesEmittedTerminalsFromMarkersAndPendingRulescoversCompletionCostsTest::testRuleFindsFiniteCompletionsThroughNullableRecursioncoversCompletionCostsTest::testSequenceCountsMarkersAsEmptyAndReservesAllSiblingscovers and calls
Called from 8
- method-call SqlFaker\Generation\Derivation\Completion\CompletionWitness::complete() packages/sql-faker/src/Generation/Derivation/Completion/CompletionWitness.php:59
- method-call SqlFaker\Generation\Derivation\Completion\CompletionWitness::choices() packages/sql-faker/src/Generation/Derivation/Completion/CompletionWitness.php:102
- method-call SqlFaker\Generation\Derivation\CompletionCosts::__construct() packages/sql-faker/src/Generation/Derivation/CompletionCosts.php:42
- method-call SqlFaker\Generation\Derivation\CompletionCosts::completion() packages/sql-faker/src/Generation/Derivation/CompletionCosts.php:96
- method-call SqlFaker\Generation\Derivation\CompletionCosts::affordable() packages/sql-faker/src/Generation/Derivation/CompletionCosts.php:109
- method-call SqlFaker\Generation\Derivation\CompletionCosts::affordable() packages/sql-faker/src/Generation/Derivation/CompletionCosts.php:112
- method-call SqlFaker\Generation\Derivation\CompletionCosts::hasTerminalOutput() packages/sql-faker/src/Generation/Derivation/CompletionCosts.php:141
- method-call SqlFaker\Generation\Derivation\CompletionReduction::reduce() packages/sql-faker/src/Generation/Derivation/CompletionReduction.php:40
Calls 1
- static-call CompletionCosts::combine() line 84
public function completion(Production $production, list<Symbol> $remainder, bool $nonEmpty): intCosts the remainder while retaining the final non-empty requirement.
Parameters
$production | Production | |
$remainder | list<Symbol> | |
$nonEmpty | bool |
Returns
intTest cases 1
Called from 3
- method-call SqlFaker\Generation\Derivation\CompletionFrontier::offer() packages/sql-faker/src/Generation/Derivation/CompletionFrontier.php:59
- method-call SqlFaker\Generation\Derivation\ConstrainedCompletion::search() packages/sql-faker/src/Generation/Derivation/ConstrainedCompletion.php:86
- method-call SqlFaker\Generation\Derivation\ConstrainedCompletion::search() packages/sql-faker/src/Generation/Derivation/ConstrainedCompletion.php:95
Calls 3
- static-call CompletionCosts::combine() line 96
- method-call CompletionCosts::sequence() line 96
- function-call
minline 97
public function affordable(
list<Production> $alternatives,
list<Symbol> $remainder,
bool $nonEmpty,
int $budget,
): list<Production>Applies the candidate policy shared by token generation and planning.
Parameters
$alternatives | list<Production> | |
$remainder | list<Symbol> | |
$nonEmpty | bool | |
$budget | int |
Returns
list<Production>Test cases 1
Called from 1
Calls 3
- method-call CompletionCosts::sequence() line 109
- static-call CompletionCosts::combine() line 112
- function-call
minline 113
public static function combine(array{int, int} $left, array{int, int} $right): array{int, int}Combines independent prefix and suffix costs, including their empty-output alternatives.
Parameters
$left | array{int, int} | |
$right | array{int, int} |
Returns
array{int, int}Test cases 12
CompletionCostsTest::testAffordableRetainsExactlyTheAlternativesThatCanFinishWithinBudgetcoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletionscallsCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#cheaper nonempty leftcoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#empty paircoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#empty plus outputcoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#nullable paircoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#saturatingcoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#unreachablecoversCompletionCostsTest::testCompletionAllowsAnEmptyProductionWhenItsSiblingEmitsOutputcoversCompletionCostsTest::testHasTerminalOutputDistinguishesEmittedTerminalsFromMarkersAndPendingRulescoversCompletionCostsTest::testRuleFindsFiniteCompletionsThroughNullableRecursioncoversCompletionCostsTest::testSequenceCountsMarkersAsEmptyAndReservesAllSiblingscovers
Called from 4
- static-call SqlFaker\Generation\Derivation\Completion\CompletionWitness::complete() packages/sql-faker/src/Generation/Derivation/Completion/CompletionWitness.php:63
- static-call SqlFaker\Generation\Derivation\CompletionCosts::sequence() packages/sql-faker/src/Generation/Derivation/CompletionCosts.php:84
- static-call SqlFaker\Generation\Derivation\CompletionCosts::completion() packages/sql-faker/src/Generation/Derivation/CompletionCosts.php:96
- static-call SqlFaker\Generation\Derivation\CompletionCosts::affordable() packages/sql-faker/src/Generation/Derivation/CompletionCosts.php:112
Calls 2
- static-call CompletionCosts::add() line 128
- function-call
minline 128
public function hasTerminalOutput(list<Symbol> $symbols): boolStops once the already-derived prefix contains an emitting terminal; pending rules are not output.
Parameters
$symbols | list<Symbol> |
Returns
boolTest cases 1
Called from 5
- method-call SqlFaker\Generation\Derivation\Completion\CompletionWitness::complete() packages/sql-faker/src/Generation/Derivation/Completion/CompletionWitness.php:42
- method-call SqlFaker\Generation\Derivation\CompletionFrontier::offer() packages/sql-faker/src/Generation/Derivation/CompletionFrontier.php:57
- method-call SqlFaker\Generation\Derivation\ConstrainedCompletion::complete() packages/sql-faker/src/Generation/Derivation/ConstrainedCompletion.php:64
- method-call SqlFaker\Generation\Derivation\Derivation::completable() packages/sql-faker/src/Generation/Derivation/Derivation.php:244
- method-call SqlFaker\Generation\Derivation\Derivation::affordableCompletion() packages/sql-faker/src/Generation/Derivation/Derivation.php:268
Calls 1
- method-call CompletionCosts::sequence() line 141
public static function add(int $left, int $right): intAdds finite costs without overflowing the unreachable sentinel.
Parameters
$left | int | |
$right | int |
Returns
intTest cases 12
CompletionCostsTest::testAddSaturatesUnreachableCostsWithoutIntegerOverflowcovers and callsCompletionCostsTest::testAffordableRetainsExactlyTheAlternativesThatCanFinishWithinBudgetcoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#cheaper nonempty leftcoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#empty paircoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#empty plus outputcoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#nullable paircoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#saturatingcoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#unreachablecoversCompletionCostsTest::testCompletionAllowsAnEmptyProductionWhenItsSiblingEmitsOutputcoversCompletionCostsTest::testHasTerminalOutputDistinguishesEmittedTerminalsFromMarkersAndPendingRulescoversCompletionCostsTest::testRuleFindsFiniteCompletionsThroughNullableRecursioncoversCompletionCostsTest::testSequenceCountsMarkersAsEmptyAndReservesAllSiblingscovers
Called from 7
- static-call SqlFaker\Generation\Derivation\CompletionCosts::__construct() packages/sql-faker/src/Generation/Derivation/CompletionCosts.php:44
- static-call SqlFaker\Generation\Derivation\CompletionCosts::combine() packages/sql-faker/src/Generation/Derivation/CompletionCosts.php:128
- static-call SqlFaker\Generation\Derivation\CompletionCosts::combine() packages/sql-faker/src/Generation/Derivation/CompletionCosts.php:129
- static-call SqlFaker\Generation\Derivation\CompletionCosts::combine() packages/sql-faker/src/Generation/Derivation/CompletionCosts.php:130
- static-call SqlFaker\Generation\Derivation\CompletionReduction::reduce() packages/sql-faker/src/Generation/Derivation/CompletionReduction.php:42
- static-call SqlFaker\Generation\Derivation\CompletionReduction::reduce() packages/sql-faker/src/Generation/Derivation/CompletionReduction.php:46
- static-call SqlFaker\Generation\Derivation\ConstrainedCompletion::search() packages/sql-faker/src/Generation/Derivation/ConstrainedCompletion.php:96
Private surface 3§
Implementation details, listed for orientation only.
private array<string, array{int, int}> $costsprivate array<string, array{int, int}> $terminalCosts = []private Closure(string): bool $nonOutputTest cases 64§
Test cases that cover or call this symbol, from the coverage report and from the analyzed test sources.
Dedicated tests 13
CompletionCostsTest::testAddSaturatesUnreachableCostsWithoutIntegerOverflowcovers and callsCompletionCostsTest::testAffordableRetainsExactlyTheAlternativesThatCanFinishWithinBudgetcovers and callsCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletionscallsCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#cheaper nonempty leftcoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#empty paircoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#empty plus outputcoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#nullable paircoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#saturatingcoversCompletionCostsTest::testCombinePreservesEmptyAndNonEmptyCompletions#unreachablecoversCompletionCostsTest::testCompletionAllowsAnEmptyProductionWhenItsSiblingEmitsOutputcovers and callsCompletionCostsTest::testHasTerminalOutputDistinguishesEmittedTerminalsFromMarkersAndPendingRulescovers and callsCompletionCostsTest::testRuleFindsFiniteCompletionsThroughNullableRecursioncovers and callsCompletionCostsTest::testSequenceCountsMarkersAsEmptyAndReservesAllSiblingscovers and calls
Other tests reaching this symbol 51
BisonDirectiveReaderTestcallsBisonScannerTestcallsByteChoicesTestcallsBytePlanCompilerTestcallsPlanBuilderTestcallsCoverageSnapshotStoreTestcallsGrammarCoverageInventoryTestcallsGrammarCoverageTestcallsSnapshotValidationTestcallsCompletionWitnessTest::testChoicesCachesBothOutputPossibilitiesUnderEachDistinctPatterncallsCompletionWitnessTest::testCompleteBoundsTheOptionalProbeWithoutClaimingImpossibilitycallsCompletionWitnessTest::testCompleteWalksOccurrencePatternsAndPreservesPendingOutputcallsCompletionWitnessTest::testCompleteYieldsToTheSolverWhenAGreedyPathNeedsAnotherChoicecallsCompletionWitnessTest::testRememberCachesOnlyTheSuccessfulSuffixAndPreservesExactMinimumIndependencecallsCompletionFrontierTest::testOfferPrunesOverBudgetAndEquivalentMoreExpensiveStatescallsCompletionFrontierTest::testOfferRemembersAlreadyEmittedOutputBeforeErasingTerminalscallsCompletionFrontierTest::testTakeOrdersAffordableCompletionsByEstimatedCostcallsCompletionMemoTestcallsCompletionReductionTest::testReduceKeepsBothIndependentOutputPossibilitiesAndTheirExactCostscallsConstrainedCompletionTest::testCompleteCachesNormalizedPendingFormsWithoutLosingAlreadyEmittedOutputcallsConstrainedCompletionTest::testMinimumCountsOnlyTheUnconsumedPatternSuffixcallsConstrainedCompletionTest::testMinimumIncludesDescendantsSiblingsAndRecursiveOccurrenceConstraintscallsConstrainedCompletionTest::testSearchRetainsAFirstWitnessAsFeasibilityInsteadOfAMinimumProofcallsConstrainedCompletionTest::testWithinRejectsARequiredOutputThatIndependentEmptySubtreesCannotSupplycallsConstrainedCompletionTest::testWitnessCachesOnlyTheChosenSuffixAndKeepsMinimumQueriesIndependentcallsConstraintDependenciesTestcallsDerivationNodeTestcallsDerivationTestcallsDerivationTraceTestcallsTokenGeneratorTestcallsGenerationExceptionTestcallsLexemeSequenceTestcallsCandidateResolverTestcallsProductionPatternTestcallsSqlGeneratorTestcallsTerminalSequenceTestcallsGrammarTestcallsGenerationContextTestcallsMySqlQuotingTestcallsStatementTypeTestcallsMySqlProviderTestcallsGenerationContextTestcallsPgLookaheadTestcallsPgQuotingTestcallsStatementTypeTestcallsPostgreSqlProviderTestcallsSqlGeneratorFactoryTestcallsGenerationContextTestcallsSqliteQuotingTestcallsStatementTypeTestcallsSqliteProviderTestcalls
Relations§
Instantiated in 3
- new SqlFaker\Generation\Choice\PlanBuilder::__construct() packages/sql-faker/src/Generation/Choice/PlanBuilder.php:37
- new SqlFaker\Generation\Derivation\Derivation::__construct() packages/sql-faker/src/Generation/Derivation/Derivation.php:49
- new SqlFaker\Generation\Derivation\TokenGenerator::__construct() packages/sql-faker/src/Generation/Derivation/TokenGenerator.php:30
Static calls 4
- static-call SqlFaker\Generation\Derivation\Completion\CompletionWitness::complete() packages/sql-faker/src/Generation/Derivation/Completion/CompletionWitness.php:63
- static-call SqlFaker\Generation\Derivation\CompletionReduction::reduce() packages/sql-faker/src/Generation/Derivation/CompletionReduction.php:42
- static-call SqlFaker\Generation\Derivation\CompletionReduction::reduce() packages/sql-faker/src/Generation/Derivation/CompletionReduction.php:46
- static-call SqlFaker\Generation\Derivation\ConstrainedCompletion::search() packages/sql-faker/src/Generation/Derivation/ConstrainedCompletion.php:96
Method calls 12
- method-call SqlFaker\Generation\Derivation\Completion\CompletionWitness::complete() packages/sql-faker/src/Generation/Derivation/Completion/CompletionWitness.php:42
- method-call SqlFaker\Generation\Derivation\Completion\CompletionWitness::complete() packages/sql-faker/src/Generation/Derivation/Completion/CompletionWitness.php:59
- method-call SqlFaker\Generation\Derivation\Completion\CompletionWitness::choices() packages/sql-faker/src/Generation/Derivation/Completion/CompletionWitness.php:102
- method-call SqlFaker\Generation\Derivation\CompletionFrontier::offer() packages/sql-faker/src/Generation/Derivation/CompletionFrontier.php:57
- method-call SqlFaker\Generation\Derivation\CompletionFrontier::offer() packages/sql-faker/src/Generation/Derivation/CompletionFrontier.php:59
- method-call SqlFaker\Generation\Derivation\CompletionReduction::reduce() packages/sql-faker/src/Generation/Derivation/CompletionReduction.php:40
- method-call SqlFaker\Generation\Derivation\ConstrainedCompletion::complete() packages/sql-faker/src/Generation/Derivation/ConstrainedCompletion.php:64
- method-call SqlFaker\Generation\Derivation\ConstrainedCompletion::search() packages/sql-faker/src/Generation/Derivation/ConstrainedCompletion.php:86
- method-call SqlFaker\Generation\Derivation\ConstrainedCompletion::search() packages/sql-faker/src/Generation/Derivation/ConstrainedCompletion.php:95
- method-call SqlFaker\Generation\Derivation\Derivation::completable() packages/sql-faker/src/Generation/Derivation/Derivation.php:244
- method-call SqlFaker\Generation\Derivation\Derivation::affordableCompletion() packages/sql-faker/src/Generation/Derivation/Derivation.php:268
- method-call SqlFaker\Generation\Derivation\Derivation::affordableCompletion() packages/sql-faker/src/Generation/Derivation/Derivation.php:269
Type declarations 8
- type SqlFaker\Generation\Choice\PlanBuilder packages/sql-faker/src/Generation/Choice/PlanBuilder.php:25
- type SqlFaker\Generation\Derivation\Completion\CompletionWitness packages/sql-faker/src/Generation/Derivation/Completion/CompletionWitness.php:28
- type SqlFaker\Generation\Derivation\CompletionFrontier packages/sql-faker/src/Generation/Derivation/CompletionFrontier.php:30
- type SqlFaker\Generation\Derivation\CompletionReduction packages/sql-faker/src/Generation/Derivation/CompletionReduction.php:17
- type SqlFaker\Generation\Derivation\ConstrainedCompletion packages/sql-faker/src/Generation/Derivation/ConstrainedCompletion.php:26
- type SqlFaker\Generation\Derivation\Derivation packages/sql-faker/src/Generation/Derivation/Derivation.php:28
- type SqlFaker\Generation\Derivation\Derivation packages/sql-faker/src/Generation/Derivation/Derivation.php:46
- type SqlFaker\Generation\Derivation\TokenGenerator packages/sql-faker/src/Generation/Derivation/TokenGenerator.php:21