MCPcopy
hub / github.com/google/mangle / eval

Method eval

engine/seminaivebottomup.go:494–624  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

492}
493
494func (e *engine) eval() error {
495 predicateAllowList := *e.options.predicateAllowList
496 // First round.
497 for _, clause := range e.programInfo.Rules {
498 if !predicateAllowList(clause.Head.Predicate) {
499 continue
500 }
501 if clause.Transform != nil && !clause.Transform.IsLetTransform() {
502 // clauses with do-transforms assume a single subgoal as body.
503 continue
504 }
505 derivedFacts, err := e.oneStepEvalClause(clause)
506 if err != nil {
507 return err
508 }
509 for _, tf := range derivedFacts {
510 // Add to temporal store if interval is present
511 if tf.Interval != nil && e.temporalStore != nil {
512 if _, err := e.temporalStore.Add(tf.Atom, *tf.Interval); err != nil {
513 return err
514 }
515 if e.temporalDeltaStore != nil {
516 if _, err := e.temporalDeltaStore.Add(tf.Atom, *tf.Interval); err != nil {
517 return err
518 }
519 }
520 } else {
521 // Add to delta store (for incremental evaluation)
522 e.deltaStore.Add(tf.Atom)
523 }
524 }
525 }
526 if e.deltaStore.EstimateFactCount() > 0 || (e.temporalDeltaStore != nil && e.temporalDeltaStore.EstimateFactCount() > 0) {
527 // Incremental rounds.
528 deltaRules := makeDeltaRules(e.programInfo.Decls, e.predToRules)
529 if err := e.mergeDelta(); err != nil {
530 return err
531 }
532 for {
533 newDeltaStore := factstore.NewMultiIndexedArrayInMemoryStore()
534 var newTemporalDeltaStore factstore.TemporalFactStore
535 if e.temporalStore != nil {
536 newTemporalDeltaStore = factstore.NewTemporalStore()
537 }
538 var incrementalFactAdded bool
539 for _, predDeltaRule := range deltaRules {
540 for _, deltaRule := range predDeltaRule {
541 if !predicateAllowList(deltaRule.Head.Predicate) {
542 continue
543 }
544 derivedFacts, err := e.oneStepEvalClause(deltaRule)
545 if err != nil {
546 return err
547 }
548 for _, tf := range derivedFacts {
549 if tf.Interval != nil && e.temporalStore != nil {
550 added, err := e.temporalStore.Add(tf.Atom, *tf.Interval)
551 if err != nil {

Callers 1

evalStrataMethod · 0.95

Calls 15

oneStepEvalClauseMethod · 0.95
mergeDeltaMethod · 0.95
AddMethod · 0.95
AddMethod · 0.95
EstimateFactCountMethod · 0.95
ExtendMethod · 0.95
NewTemporalStoreFunction · 0.92
EvalAtomFunction · 0.92
makeDeltaRulesFunction · 0.85
EvalTransformFunction · 0.85
IsLetTransformMethod · 0.80

Tested by

no test coverage detected