You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by ar...@apache.org on 2021/03/23 03:00:27 UTC

[incubator-nlpcraft] 06/08: WIP.

This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit 975431411d2c9c52534f7991f350d675aaf1bd2f
Author: Aaron Radzinski <ar...@apache.org>
AuthorDate: Mon Mar 22 19:49:01 2021 -0700

    WIP.
---
 .../org/apache/nlpcraft/examples/alarm/intents.idl |  1 +
 .../nlpcraft/examples/weather/WeatherModel.java    | 11 +++--
 .../apache/nlpcraft/model/intent/NCIdlTerm.scala   |  2 +-
 .../model/intent/compiler/NCIdlCompiler.scala      |  6 +--
 .../model/intent/compiler/NCIdlCompilerBase.scala  | 50 ++++++++--------------
 .../model/intent/solver/NCIntentSolverEngine.scala | 10 +++--
 6 files changed, 37 insertions(+), 43 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/intents.idl b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/intents.idl
index cb28dc4..391b9de 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/intents.idl
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/intents.idl
@@ -19,6 +19,7 @@
 fragment=buzz term~{id() == 'x:alarm'}
 fragment=when
     term(nums)~{
+        // Demonstrating term variable.
         @type = meta_token('nlpcraft:num:unittype')
         @iseq = meta_token('nlpcraft:num:isequalcondition')
 
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
index 34b2065..c3e22f1 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
@@ -122,21 +122,24 @@ public class WeatherModel extends NCModelFileAdapter {
     @NCIntent(
         "intent=req " +
         "term~{id() == 'wt:phen'}* " + // Zero or more weather phenomenon.
-        "term(ind)~{has(groups(), 'indicator')}* " + // Optional indicator words (zero or more).
+        "term(ind)~{" +
+            "@isIndicator = has(groups(), 'indicator') " + // Just to demo term variable usage.
+            "@isIndicator" +
+        "}* " + // Optional indicator words (zero or more).
         "term(city)~{id() == 'nlpcraft:city'}? " + // Optional city.
         "term(date)~{id() == 'nlpcraft:date'}?" // Optional date (overrides indicator words).
     )
-    // NOTE: each samples group will reset conversation STM.
+    // NOTE: each samples group will reset conversation STM during auto-testing.
     @NCIntentSample({
         "Current forecast?",
         "Chance of rain in Berlin now?"
     })
-    // NOTE: each samples group will reset conversation STM.
+    // NOTE: each samples group will reset conversation STM during auto-testing.
     @NCIntentSample({
         "Moscow forecast?",
         "Chicago history"
     })
-    // NOTE: each samples group will reset conversation STM.
+    // NOTE: each samples group will reset conversation STM during auto-testing.
     @NCIntentSample({
         "What's the local weather forecast?",
         "What's the weather in Moscow?",
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala
index cdc8494..e3aa3b4 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala
@@ -34,7 +34,7 @@ import org.apache.nlpcraft.common._
 case class NCIdlTerm(
     idl: String,
     id: Option[String],
-    decls: List[NCIdlFunction],
+    decls: Map[String, NCIdlFunction],
     pred: NCIdlFunction,
     min: Int,
     max: Int,
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
index c3613ee..d27133c 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala
@@ -134,9 +134,7 @@ object NCIdlCompiler extends LazyLogging {
             if (!vars.contains(varName))
                 throw newSyntaxError(s"Unknown variable: @$varName")(ctx)
 
-            val instr: SI = (tok: NCToken, stack: S, idlCtx: NCIdlContext) ⇒
-                 stack.push(() ⇒
-                     idlCtx.vars(varName)(tok, idlCtx))
+            val instr: SI = (tok: NCToken, stack: S, idlCtx: NCIdlContext) ⇒ stack.push(() ⇒ idlCtx.vars(varName)(tok, idlCtx))
 
             expr += instr
         }
@@ -320,7 +318,7 @@ object NCIdlCompiler extends LazyLogging {
             terms += NCIdlTerm(
                 ctx.getText,
                 Option(termId),
-                vars.values.toList,
+                vars.toMap,
                 pred,
                 min,
                 max,
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala
index 826d6a2..538871b 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala
@@ -285,27 +285,21 @@ trait NCIdlCompilerBase {
                 val Z(v1, n1) = x1()
                 val Z(v2, n2) = x2()
 
-                val f =
-                    if (isInt(v1) && isInt(v2)) asInt(v1) * asInt(v2)
-                    else if (isInt(v1) && isReal(v2)) asInt(v1) * asReal(v2)
-                    else if (isReal(v1) && isInt(v2)) asReal(v1) * asInt(v2)
-                    else if (isReal(v1) && isReal(v2)) asReal(v1) * asReal(v2)
-                    else
-                        throw rtBinaryOpError("*", v1, v2)
-
-                Z(f, n1 + n2)
+                if (isInt(v1) && isInt(v2)) Z(asInt(v1) * asInt(v2), n1 + n2)
+                else if (isInt(v1) && isReal(v2)) Z(asInt(v1) * asReal(v2), n1 + n2)
+                else if (isReal(v1) && isInt(v2)) Z(asReal(v1) * asInt(v2), n1 + n2)
+                else if (isReal(v1) && isReal(v2)) Z(asReal(v1) * asReal(v2), n1 + n2)
+                else
+                    throw rtBinaryOpError("*", v1, v2)
             })
         else if (mod != null)
             stack.push(() ⇒ {
                 val Z(v1, n1) = x1()
                 val Z(v2, n2) = x2()
 
-                val f =
-                    if (isInt(v1) && isInt(v2)) asInt(v1) % asInt(v2)
-                    else
-                        throw rtBinaryOpError("%", v1, v2)
-
-                Z(f, n1 + n2)
+                if (isInt(v1) && isInt(v2)) Z(asInt(v1) % asInt(v2), n1 + n2)
+                else
+                    throw rtBinaryOpError("%", v1, v2)
             })
         else {
             assert(div != null)
@@ -314,15 +308,12 @@ trait NCIdlCompilerBase {
                 val Z(v1, n1) = x1()
                 val Z(v2, n2) = x2()
 
-                val f =
-                    if (isInt(v1) && isInt(v2)) asInt(v1) / asInt(v2)
-                    else if (isInt(v1) && isReal(v2)) asInt(v1) / asReal(v2)
-                    else if (isReal(v1) && isInt(v2)) asReal(v1) / asInt(v2)
-                    else if (isReal(v1) && isReal(v2)) asReal(v1) / asReal(v2)
-                    else
-                        throw rtBinaryOpError("/", v1, v2)
-
-                Z(f, n1 + n2)
+                if (isInt(v1) && isInt(v2)) Z(asInt(v1) / asInt(v2), n1 + n2)
+                else if (isInt(v1) && isReal(v2)) Z(asInt(v1) / asReal(v2), n1 + n2)
+                else if (isReal(v1) && isInt(v2)) Z(asReal(v1) / asInt(v2), n1 + n2)
+                else if (isReal(v1) && isReal(v2)) Z(asReal(v1) / asReal(v2), n1 + n2)
+                else
+                    throw rtBinaryOpError("/", v1, v2)
             })
         }
     }
@@ -454,13 +445,10 @@ trait NCIdlCompilerBase {
             stack.push(() ⇒ {
                 val Z(v, n) = x()
 
-                val z =
-                    if (isReal(v)) -asReal(v)
-                    else if (isInt(v)) -asInt(v)
-                    else
-                        throw rtUnaryOpError("-", v)
-
-                Z(z, n)
+                if (isReal(v)) Z(-asReal(v), n)
+                else if (isInt(v)) Z(-asInt(v), n)
+                else
+                    throw rtUnaryOpError("-", v)
             })
         else {
             assert(not != null)
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
index b7675ca..b9d0de5 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
@@ -488,16 +488,19 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
             var abort = false
             val ordered = intent.ordered
             var lastTermMatch: TermMatch = null
-            
+
+            // Conversation metadata (shared across all terms).
             val x = ctx.getConversation.getMetadata
             val convMeta = if (x.isEmpty) Map.empty[String, Object] else x.asScala.toMap[String, Object]
 
             // Check terms.
             for (term ← intent.terms if !abort) {
+                // Fresh context for each term.
                 val termCtx = NCIdlContext(
                     intentMeta = intent.meta,
                     convMeta = convMeta,
-                    req = ctx.getRequest
+                    req = ctx.getRequest,
+                    vars = mutable.HashMap.empty[String, NCIdlFunction] ++ term.decls
                 )
 
                 solveTerm(
@@ -604,7 +607,7 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
         ctx: NCIdlContext,
         senToks: Seq[UsedToken],
         convToks: Seq[UsedToken]
-    ): Option[TermMatch] =
+    ): Option[TermMatch] = {
         solvePredicate(term.pred, ctx, term.min, term.max, senToks, convToks) match {
             case Some((usedToks, predWeight)) ⇒ Some(
                 TermMatch(
@@ -636,6 +639,7 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
             // Term not found at all.
             case None ⇒ None
         }
+    }
 
     /**
      * Solves term's predicate.