Debugging help needed as I do not understand the output

135 views
Skip to first unread message

Hashmir Hushmir

unread,
Mar 24, 2022, 7:23:16 AM3/24/22
to OptaPlanner development
Hi,

can someone please help me to get better at debugging? 

I have created a domain and want to solve one simple problem, where it only needs to compare one fact of two entities in my model

public class TestExecutionTableConstraintProvider implements ConstraintProvider {

    @Override
    public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
        return new Constraint[]{
                matchingTomSet(constraintFactory)
        };
    }

    public Constraint matchingTomSet(ConstraintFactory constraintFactory) {
        return constraintFactory
                // Select TestExecutions with TomSet status hash equaling the Test expected status hash
                .forEach(TestExecution.class)
                .filter(testExecution -> testExecution.getTest().getExpectedStatusHash().equals(testExecution.getTomSet().getSetStatusHash()))
                .reward("Test TomSet Match", HardSoftScore.ONE_HARD);
    }

}

but I do not understand the trace output and therefore do not understand how to fix the problem that the solver does not find any solution. Since I am new to OptaPlanner it might be I am doing something really wrong here as well.

My expectation is that the solver would reward every combination of Test and TomSet, which have the same hash. Am I doing something wrong here?

C:\Development\Java\windows-jdk-11.0.12+7_rscs-4_debug\bin\java.exe "-javaagent:C:\Users\bla\AppData\Local\JetBrains\IntelliJ IDEA Community Edition 2021.1.1\lib\idea_rt.jar=57821:C:\Users\bla\AppData\Local\JetBrains\IntelliJ IDEA Community Edition 2021.1.1\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\bla\Documents\testautomation\target\test-classes;C:\Users\bla\Documents\testautomation\target\classes;C:\Users\bla\.m2\repository\org\optaplanner\optaplanner-core\8.17.0.Final\optaplanner-core-8.17.0.Final.jar;C:\Users\bla\.m2\repository\org\kie\kie-api\8.17.0.Beta\kie-api-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\kie\kie-internal\8.17.0.Beta\kie-internal-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\drools\drools-canonical-model\8.17.0.Beta\drools-canonical-model-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\drools\drools-model-compiler\8.17.0.Beta\drools-model-compiler-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\kie\kie-util-maven-support\8.17.0.Beta\kie-util-maven-support-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\drools\drools-wiring-api\8.17.0.Beta\drools-wiring-api-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\kie\kie-memory-compiler\8.17.0.Beta\kie-memory-compiler-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\drools\drools-compiler\8.17.0.Beta\drools-compiler-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\drools\drools-drl-ast\8.17.0.Beta\drools-drl-ast-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\drools\drools-ecj\8.17.0.Beta\drools-ecj-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\antlr\antlr-runtime\3.5.2\antlr-runtime-3.5.2.jar;C:\Users\bla\.m2\repository\com\github\javaparser\javaparser-core\3.23.1\javaparser-core-3.23.1.jar;C:\Users\bla\.m2\repository\org\drools\drools-mvel-parser\8.17.0.Beta\drools-mvel-parser-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\drools\drools-mvel-compiler\8.17.0.Beta\drools-mvel-compiler-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\drools\drools-core\8.17.0.Beta\drools-core-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\kie\kie-util-xml\8.17.0.Beta\kie-util-xml-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\drools\drools-wiring-static\8.17.0.Beta\drools-wiring-static-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;C:\Users\bla\.m2\repository\org\drools\drools-tms\8.17.0.Beta\drools-tms-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\drools\drools-kiesession\8.17.0.Beta\drools-kiesession-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\drools\drools-wiring-dynamic\8.17.0.Beta\drools-wiring-dynamic-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\drools\drools-alphanetwork-compiler\8.17.0.Beta\drools-alphanetwork-compiler-8.17.0.Beta.jar;C:\Users\bla\.m2\repository\org\apache\commons\commons-math3\3.6.1\commons-math3-3.6.1.jar;C:\Users\bla\.m2\repository\org\slf4j\slf4j-api\1.7.33\slf4j-api-1.7.33.jar;C:\Users\bla\.m2\repository\io\micrometer\micrometer-core\1.8.2\micrometer-core-1.8.2.jar;C:\Users\bla\.m2\repository\org\hdrhistogram\HdrHistogram\2.1.12\HdrHistogram-2.1.12.jar;C:\Users\bla\.m2\repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;C:\Users\bla\.m2\repository\jakarta\xml\bind\jakarta.xml.bind-api\2.3.3\jakarta.xml.bind-api-2.3.3.jar;C:\Users\bla\.m2\repository\jakarta\activation\jakarta.activation-api\1.2.2\jakarta.activation-api-1.2.2.jar;C:\Users\bla\.m2\repository\org\glassfish\jaxb\jaxb-runtime\2.3.3-b02\jaxb-runtime-2.3.3-b02.jar;C:\Users\bla\.m2\repository\org\glassfish\jaxb\txw2\2.3.3-b02\txw2-2.3.3-b02.jar;C:\Users\bla\.m2\repository\com\sun\istack\istack-commons-runtime\3.0.10\istack-commons-runtime-3.0.10.jar;C:\Users\bla\.m2\repository\com\sun\activation\jakarta.activation\1.2.1\jakarta.activation-1.2.1.jar;C:\Users\bla\.m2\repository\ch\qos\logback\logback-classic\1.2.9\logback-classic-1.2.9.jar;C:\Users\bla\.m2\repository\ch\qos\logback\logback-core\1.2.9\logback-core-1.2.9.jar;C:\Users\bla\.m2\repository\org\optaplanner\optaplanner-test\8.17.0.Final\optaplanner-test-8.17.0.Final.jar;C:\Users\bla\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.8.2\junit-jupiter-api-5.8.2.jar;C:\Users\bla\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\bla\.m2\repository\org\junit\platform\junit-platform-commons\1.8.2\junit-platform-commons-1.8.2.jar;C:\Users\bla\.m2\repository\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;C:\Users\bla\.m2\repository\org\assertj\assertj-core\3.22.0\assertj-core-3.22.0.jar;C:\Users\bla\.m2\repository\io\testerra\driver-ui-desktop\1.12\driver-ui-desktop-1.12.jar;C:\Users\bla\.m2\repository\io\testerra\driver-ui\1.12\driver-ui-1.12.jar;C:\Users\bla\.m2\repository\io\testerra\image-processing\1.12\image-processing-1.12.jar;C:\Users\bla\.m2\repository\org\seleniumhq\selenium\selenium-java\3.141.59\selenium-java-3.141.59.jar;C:\Users\bla\.m2\repository\org\seleniumhq\selenium\selenium-api\3.141.59\selenium-api-3.141.59.jar;C:\Users\bla\.m2\repository\org\seleniumhq\selenium\selenium-chrome-driver\3.141.59\selenium-chrome-driver-3.141.59.jar;C:\Users\bla\.m2\repository\org\seleniumhq\selenium\selenium-edge-driver\3.141.59\selenium-edge-driver-3.141.59.jar;C:\Users\bla\.m2\repository\org\seleniumhq\selenium\selenium-firefox-driver\3.141.59\selenium-firefox-driver-3.141.59.jar;C:\Users\bla\.m2\repository\org\seleniumhq\selenium\selenium-ie-driver\3.141.59\selenium-ie-driver-3.141.59.jar;C:\Users\bla\.m2\repository\org\seleniumhq\selenium\selenium-opera-driver\3.141.59\selenium-opera-driver-3.141.59.jar;C:\Users\bla\.m2\repository\org\seleniumhq\selenium\selenium-remote-driver\3.141.59\selenium-remote-driver-3.141.59.jar;C:\Users\bla\.m2\repository\org\seleniumhq\selenium\selenium-safari-driver\3.141.59\selenium-safari-driver-3.141.59.jar;C:\Users\bla\.m2\repository\org\seleniumhq\selenium\selenium-support\3.141.59\selenium-support-3.141.59.jar;C:\Users\bla\.m2\repository\net\bytebuddy\byte-buddy\1.8.15\byte-buddy-1.8.15.jar;C:\Users\bla\.m2\repository\org\apache\commons\commons-exec\1.3\commons-exec-1.3.jar;C:\Users\bla\.m2\repository\com\squareup\okhttp3\okhttp\3.11.0\okhttp-3.11.0.jar;C:\Users\bla\.m2\repository\com\squareup\okio\okio\1.14.0\okio-1.14.0.jar;C:\Users\bla\.m2\repository\org\bytedeco\javacpp-presets\opencv\2.4.9-0.9\opencv-2.4.9-0.9-windows-x86.jar;C:\Users\bla\.m2\repository\org\bytedeco\javacpp\0.9\javacpp-0.9.jar;C:\Users\bla\.m2\repository\org\bytedeco\javacpp-presets\opencv\2.4.9-0.9\opencv-2.4.9-0.9-windows-x86_64.jar;C:\Users\bla\.m2\repository\org\bytedeco\javacpp-presets\opencv\2.4.9-0.9\opencv-2.4.9-0.9-linux-x86.jar;C:\Users\bla\.m2\repository\org\bytedeco\javacpp-presets\opencv\2.4.9-0.9\opencv-2.4.9-0.9-linux-x86_64.jar;C:\Users\bla\.m2\repository\nu\pattern\opencv\2.4.9-7\opencv-2.4.9-7.jar;C:\Users\bla\.m2\repository\org\sikuli\sikuli-api\1.2.0\sikuli-api-1.2.0.jar;C:\Users\bla\.m2\repository\org\sikuli\sikuli-core\1.2.2\sikuli-core-1.2.2.jar;C:\Users\bla\.m2\repository\org\bytedeco\javacpp-presets\opencv\2.4.9-0.9\opencv-2.4.9-0.9.jar;C:\Users\bla\.m2\repository\org\piccolo2d\piccolo2d-extras\1.3.1\piccolo2d-extras-1.3.1.jar;C:\Users\bla\.m2\repository\org\piccolo2d\piccolo2d-core\1.3.1\piccolo2d-core-1.3.1.jar;C:\Users\bla\.m2\repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;C:\Users\bla\.m2\repository\org\reflections\reflections\0.9.12\reflections-0.9.12.jar;C:\Users\bla\.m2\repository\org\javassist\javassist\3.26.0-GA\javassist-3.26.0-GA.jar;C:\Users\bla\.m2\repository\com\github\ua-parser\uap-java\1.4.3\uap-java-1.4.3.jar;C:\Users\bla\.m2\repository\org\yaml\snakeyaml\1.20\snakeyaml-1.20.jar;C:\Users\bla\.m2\repository\org\apache\commons\commons-collections4\4.1\commons-collections4-4.1.jar;C:\Users\bla\.m2\repository\net\anthavio\phanbedder-2.1.1\1.0.0\phanbedder-2.1.1-1.0.0.jar;C:\Users\bla\.m2\repository\com\codeborne\phantomjsdriver\1.4.4\phantomjsdriver-1.4.4.jar;C:\Users\bla\.m2\repository\com\google\code\gson\gson\2.8.6\gson-2.8.6.jar;C:\Users\bla\.m2\repository\io\testerra\report-ng\1.12\report-ng-1.12.jar;C:\Users\bla\.m2\repository\io\testerra\core\1.12\core-1.12.jar;C:\Users\bla\.m2\repository\io\testerra\core-interop\1.12\core-interop-1.12.jar;C:\Users\bla\.m2\repository\org\testng\testng\7.4.0\testng-7.4.0.jar;C:\Users\bla\.m2\repository\com\beust\jcommander\1.78\jcommander-1.78.jar;C:\Users\bla\.m2\repository\org\webjars\jquery\3.5.1\jquery-3.5.1.jar;C:\Users\bla\.m2\repository\org\mongodb\bson\3.7.0\bson-3.7.0.jar;C:\Users\bla\.m2\repository\org\jsoup\jsoup\1.7.2\jsoup-1.7.2.jar;C:\Users\bla\.m2\repository\org\jdom\jdom2\2.0.6\jdom2-2.0.6.jar;C:\Users\bla\.m2\repository\javax\xml\bind\jaxb-api\2.3.0\jaxb-api-2.3.0.jar;C:\Users\bla\.m2\repository\com\sun\xml\bind\jaxb-core\2.3.0\jaxb-core-2.3.0.jar;C:\Users\bla\.m2\repository\com\sun\xml\bind\jaxb-impl\2.3.0\jaxb-impl-2.3.0.jar;C:\Users\bla\.m2\repository\javax\activation\activation\1.1\activation-1.1.jar;C:\Users\bla\.m2\repository\org\apache\poi\poi-ooxml\3.17\poi-ooxml-3.17.jar;C:\Users\bla\.m2\repository\org\apache\poi\poi\3.17\poi-3.17.jar;C:\Users\bla\.m2\repository\org\apache\poi\poi-ooxml-schemas\3.17\poi-ooxml-schemas-3.17.jar;C:\Users\bla\.m2\repository\org\apache\xmlbeans\xmlbeans\2.6.0\xmlbeans-2.6.0.jar;C:\Users\bla\.m2\repository\stax\stax-api\1.0.1\stax-api-1.0.1.jar;C:\Users\bla\.m2\repository\com\github\virtuald\curvesapi\1.04\curvesapi-1.04.jar;C:\Users\bla\.m2\repository\com\opencsv\opencsv\3.9\opencsv-3.9.jar;C:\Users\bla\.m2\repository\commons-beanutils\commons-beanutils\1.9.3\commons-beanutils-1.9.3.jar;C:\Users\bla\.m2\repository\io\testerra\report-model\1.12\report-model-1.12.jar;C:\Users\bla\.m2\repository\com\google\protobuf\protobuf-java\3.14.0\protobuf-java-3.14.0.jar;C:\Users\bla\.m2\repository\com\hierynomus\smbj\0.11.3\smbj-0.11.3.jar;C:\Users\bla\.m2\repository\net\engio\mbassador\1.3.0\mbassador-1.3.0.jar;C:\Users\bla\.m2\repository\com\hierynomus\asn-one\0.5.0\asn-one-0.5.0.jar;C:\Users\bla\.m2\repository\com\rohdeschwarz\shared\automation\JUST-A-SNAPSHOT\automation-JUST-A-SNAPSHOT.jar;C:\Users\bla\.m2\repository\com\osiris4\core\JUST-A-SNAPSHOT\core-JUST-A-SNAPSHOT.jar;C:\Users\bla\.m2\repository\org\imgscalr\imgscalr-lib\4.2\imgscalr-lib-4.2.jar;C:\Users\bla\.m2\repository\org\bouncycastle\bcmail-jdk15on\1.59\bcmail-jdk15on-1.59.jar;C:\Users\bla\.m2\repository\org\bouncycastle\bcprov-jdk15on\1.59\bcprov-jdk15on-1.59.jar;C:\Users\bla\.m2\repository\org\bouncycastle\bcpkix-jdk15on\1.59\bcpkix-jdk15on-1.59.jar;C:\Users\bla\.m2\repository\org\apache\commons\commons-compress\1.6\commons-compress-1.6.jar;C:\Users\bla\.m2\repository\commons-fileupload\commons-fileupload\1.3\commons-fileupload-1.3.jar;C:\Users\bla\.m2\repository\commons-io\commons-io\2.4\commons-io-2.4.jar;C:\Users\bla\.m2\repository\org\apache\xmlgraphics\fop\1.0\fop-1.0.jar;C:\Users\bla\.m2\repository\org\apache\xmlgraphics\xmlgraphics-commons\1.4\xmlgraphics-commons-1.4.jar;C:\Users\bla\.m2\repository\org\apache\httpcomponents\httpmime\4.5.5\httpmime-4.5.5.jar;C:\Users\bla\.m2\repository\org\apache\httpcomponents\httpclient\4.5.5\httpclient-4.5.5.jar;C:\Users\bla\.m2\repository\org\apache\httpcomponents\httpcore\4.4.9\httpcore-4.4.9.jar;C:\Users\bla\.m2\repository\com\lowagie\itext\2.0.7\itext-2.0.7.jar;C:\Users\bla\.m2\repository\org\firebirdsql\jdbc\jaybird-jdk18\2.2.13\jaybird-jdk18-2.2.13.jar;C:\Users\bla\.m2\repository\net\java\dev\jna\jna-platform\4.4.0\jna-platform-4.4.0.jar;C:\Users\bla\.m2\repository\net\java\dev\jna\jna\4.4.0\jna-4.4.0.jar;C:\Users\bla\.m2\repository\com\jcraft\jsch\0.1.53\jsch-0.1.53.jar;C:\Users\bla\.m2\repository\com\jcraft\jsch.agentproxy.jsch\0.0.7\jsch.agentproxy.jsch-0.0.7.jar;C:\Users\bla\.m2\repository\com\jcraft\jsch.agentproxy.core\0.0.7\jsch.agentproxy.core-0.0.7.jar;C:\Users\bla\.m2\repository\com\jcraft\jsch.agentproxy.connector-factory\0.0.7\jsch.agentproxy.connector-factory-0.0.7.jar;C:\Users\bla\.m2\repository\com\jcraft\jsch.agentproxy.usocket-jna\0.0.7\jsch.agentproxy.usocket-jna-0.0.7.jar;C:\Users\bla\.m2\repository\com\jcraft\jsch.agentproxy.sshagent\0.0.7\jsch.agentproxy.sshagent-0.0.7.jar;C:\Users\bla\.m2\repository\com\jcraft\jsch.agentproxy.pageant\0.0.7\jsch.agentproxy.pageant-0.0.7.jar;C:\Users\bla\.m2\repository\com\jcraft\jsch.agentproxy.sshj\0.0.7\jsch.agentproxy.sshj-0.0.7.jar;C:\Users\bla\.m2\repository\javax\mail\mail\1.4.3\mail-1.4.3.jar;C:\Users\bla\.m2\repository\javax\servlet\javax.servlet-api\3.1.0\javax.servlet-api-3.1.0.jar;C:\Users\bla\.m2\repository\xalan\xalan\2.7.0\xalan-2.7.0.jar;C:\Users\bla\.m2\repository\avalon-framework\avalon-framework-impl\4.2.0\avalon-framework-impl-4.2.0.jar;C:\Users\bla\.m2\repository\avalon-framework\avalon-framework-api\4.2.0\avalon-framework-api-4.2.0.jar;C:\Users\bla\.m2\repository\org\apache\pdfbox\pdfbox\2.0.24\pdfbox-2.0.24.jar;C:\Users\bla\.m2\repository\org\apache\pdfbox\fontbox\2.0.24\fontbox-2.0.24.jar;C:\Users\bla\.m2\repository\xerces\xercesImpl\2.7.1\xercesImpl-2.7.1.jar;C:\Users\bla\.m2\repository\org\pcap4j\pcap4j-core\1.8.2\pcap4j-core-1.8.2.jar;C:\Users\bla\.m2\repository\org\apache\logging\log4j\log4j-slf4j18-impl\2.15.0\log4j-slf4j18-impl-2.15.0.jar;C:\Users\bla\.m2\repository\org\apache\logging\log4j\log4j-api\2.15.0\log4j-api-2.15.0.jar;C:\Users\bla\.m2\repository\org\apache\logging\log4j\log4j-core\2.15.0\log4j-core-2.15.0.jar;C:\Users\bla\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\bla\.m2\repository\com\google\guava\guava\31.0.1-jre\guava-31.0.1-jre.jar;C:\Users\bla\.m2\repository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;C:\Users\bla\.m2\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:\Users\bla\.m2\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;C:\Users\bla\.m2\repository\org\checkerframework\checker-qual\3.12.0\checker-qual-3.12.0.jar;C:\Users\bla\.m2\repository\com\google\errorprone\error_prone_annotations\2.7.1\error_prone_annotations-2.7.1.jar;C:\Users\bla\.m2\repository\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar;C:\Users\bla\.m2\repository\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;C:\Users\bla\.m2\repository\com\google\inject\guice\5.0.1\guice-5.0.1.jar;C:\Users\bla\.m2\repository\javax\inject\javax.inject\1\javax.inject-1.jar;C:\Users\bla\.m2\repository\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;C:\Users\bla\.m2\repository\com\rohdeschwarz\shared\dev-tools\JUST-A-SNAPSHOT\dev-tools-JUST-A-SNAPSHOT.jar;C:\Users\bla\.m2\repository\javax\resource\connector-api\1.5\connector-api-1.5.jar;C:\Users\bla\.m2\repository\com\rohdeschwarz\shared\clients\JUST-A-SNAPSHOT\clients-JUST-A-SNAPSHOT.jar;C:\Users\bla\.m2\repository\com\rohdeschwarz\tom\manager\JUST-A-SNAPSHOT\manager-JUST-A-SNAPSHOT.jar;C:\Users\bla\.m2\repository\com\rohdeschwarz\shared\infrastructure\JUST-A-SNAPSHOT\infrastructure-JUST-A-SNAPSHOT.jar;C:\Users\bla\.m2\repository\org\jopendocument\jdom\1.1.1\jdom-1.1.1.jar tom.testng.scheduling.TestScheduler
09:44:06.334 [main] TRACE o.o.c.i.d.s.d.SolutionDescriptor -     Model annotations parsed for solution TestExecutionTable:
09:44:06.339 [main] TRACE o.o.c.i.d.s.d.SolutionDescriptor -         Entity TestExecution:
09:44:06.341 [main] TRACE o.o.c.i.d.s.d.SolutionDescriptor -             Genuine variable test (slow access with reflection)
09:44:06.341 [main] TRACE o.o.c.i.d.s.d.SolutionDescriptor -             Genuine variable tomSet (slow access with reflection)
09:44:07.305 [main] DEBUG o.d.a.ObjectTypeNodeCompiler - Compiling Alpha Network:
09:44:07.305 [main] DEBUG org.drools.ancompiler.DebugHandler - [ObjectTypeNode(3)::EntryPoint::DEFAULT objectType=[ClassObjectType class=tom.testng.scheduling.model.TestExecution] expiration=-1ms ]
09:44:07.305 [main] DEBUG org.drools.ancompiler.DebugHandler - [AlphaNode(4) constraint=[Constraint for 'Filter using org.optaplanner.core.impl.domain.entity.descriptor.EntityDescriptor$$Lambda$31/0x00000007c013f840@47caedad' (index: null), ]]
09:44:07.305 [main] DEBUG org.drools.ancompiler.DebugHandler - [AlphaNode(5) constraint=[Constraint for 'Filter using tom.testng.scheduling.solver.TestExecutionTableConstraintProvider$$Lambda$63/0x00000007c018d040@7dfd3c81' (index: null), ]]
09:44:07.310 [main] DEBUG org.drools.ancompiler.DebugHandler - [AlphaTerminalNode(6)]
09:44:07.310 [main] DEBUG org.drools.ancompiler.DebugHandler - [AlphaTerminalNode(6)]
09:44:07.310 [main] DEBUG org.drools.ancompiler.DebugHandler - [AlphaNode(5) constraint=[Constraint for 'Filter using tom.testng.scheduling.solver.TestExecutionTableConstraintProvider$$Lambda$63/0x00000007c018d040@7dfd3c81' (index: null), ]]
09:44:07.310 [main] DEBUG org.drools.ancompiler.DebugHandler - [AlphaNode(4) constraint=[Constraint for 'Filter using org.optaplanner.core.impl.domain.entity.descriptor.EntityDescriptor$$Lambda$31/0x00000007c013f840@47caedad' (index: null), ]]
09:44:07.310 [main] DEBUG org.drools.ancompiler.DebugHandler - [ObjectTypeNode(3)::EntryPoint::DEFAULT objectType=[ClassObjectType class=tom.testng.scheduling.model.TestExecution] expiration=-1ms ]
09:44:07.726 [main] DEBUG o.d.a.ObjectTypeNodeCompiler - Generated Compiled Alpha Network package org.drools.ancompiler;
public class Compiledtom_testng_scheduling_model_TestExecutionNetwork32088354246 extends org.drools.ancompiler.CompiledNetwork{
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Compiledtom_testng_scheduling_model_TestExecutionNetwork32088354246.class);
org.drools.core.spi.InternalReadAccessor readAccessor;
public void init(Object... args) {
}private org.drools.modelcompiler.constraints.LambdaConstraint lambdaConstraint4; // [AlphaNode(4) constraint=[Constraint for 'Filter using org.optaplanner.core.impl.domain.entity.descriptor.EntityDescriptor$$Lambda$31/0x00000007c013f840@47caedad' (index: null), ]]
private org.drools.core.rule.ContextEntry contextEntry4;
private org.drools.modelcompiler.constraints.LambdaConstraint lambdaConstraint5; // [AlphaNode(5) constraint=[Constraint for 'Filter using tom.testng.scheduling.solver.TestExecutionTableConstraintProvider$$Lambda$63/0x00000007c018d040@7dfd3c81' (index: null), ]]
private org.drools.core.rule.ContextEntry contextEntry5;
private org.drools.core.reteoo.AlphaTerminalNode alphaTerminalNode6; // [AlphaTerminalNode(6)]
public Compiledtom_testng_scheduling_model_TestExecutionNetwork32088354246(org.drools.core.spi.InternalReadAccessor readAccessor, java.util.Map<String, org.drools.core.util.index.AlphaRangeIndex> rangeIndexDeclarationMap) {
this.readAccessor = readAccessor;
}
protected boolean isInlined() { return false; }protected void setNetworkNodeReference(org.drools.core.common.NetworkNode node) {
    boolean setNetworkResult0 = setNetworkNode0(node);
    if (setNetworkResult0) {
        return;
    }
}
private boolean setNetworkNode0(org.drools.core.common.NetworkNode node) {
    switch(node.getId()) {
        case 4:
            lambdaConstraint4 = (org.drools.modelcompiler.constraints.LambdaConstraint) ((org.drools.core.reteoo.AlphaNode) node).getConstraint();
            return true;
        case 5:
            lambdaConstraint5 = (org.drools.modelcompiler.constraints.LambdaConstraint) ((org.drools.core.reteoo.AlphaNode) node).getConstraint();
            return true;
        case 6:
            alphaTerminalNode6 = (org.drools.core.reteoo.AlphaTerminalNode) node;
            return true;
    }
    return false;
}
public final void propagateAssertObject(org.drools.core.common.InternalFactHandle handle, org.drools.core.spi.PropagationContext context, org.drools.core.common.ReteEvaluator wm) {
    if (logger.isDebugEnabled()) {
        logger.debug("propagateAssertObject on compiled alpha network {} {} {}", handle, context, wm);
    }
    if (lambdaConstraint4.isAllowed(handle, wm)) {
        if (lambdaConstraint5.isAllowed(handle, wm)) {
            alphaTerminalNode6.assertObject(handle, context, wm);
        }
    }
}
public final void propagateModifyObject(org.drools.core.common.InternalFactHandle handle, org.drools.core.reteoo.ModifyPreviousTuples modifyPreviousTuples, org.drools.core.spi.PropagationContext context, org.drools.core.common.ReteEvaluator wm) {
    if (logger.isDebugEnabled()) {
        logger.debug("propagateModifyObject on compiled alpha network {} {} {}", handle, context, wm);
    }
    if (lambdaConstraint4.isAllowed(handle, wm)) {
        if (lambdaConstraint5.isAllowed(handle, wm)) {
            alphaTerminalNode6.modifyObject(handle, modifyPreviousTuples, context, wm);
        }
    }
}

    public int getAssociationsSize() {
        return objectTypeNode.getAssociationsSize();
    }

    public short getType() {
        return objectTypeNode.getType();
    }

    public int getAssociatedRuleSize() {
        return objectTypeNode.getAssociatedRuleSize();
    }

    public int getAssociationsSize( org.kie.api.definition.rule.Rule rule ) {
        return objectTypeNode.getAssociationsSize(rule);
    }

    public boolean isAssociatedWith( org.kie.api.definition.rule.Rule rule ) {
        return objectTypeNode.isAssociatedWith(rule);
    }
 
    public void byPassModifyToBetaNode (org.drools.core.common.InternalFactHandle factHandle,
                                        org.drools.core.reteoo.ModifyPreviousTuples modifyPreviousTuples,
                                        org.drools.core.spi.PropagationContext context,
                                        org.drools.core.common.ReteEvaluator reteEvaluator) {
        throw new UnsupportedOperationException();
    }

}

09:44:09.771 [main] DEBUG o.d.a.CompiledNetworkSources - Setting [ObjectTypeNode(3)::EntryPoint::DEFAULT objectType=[ClassObjectType class=tom.testng.scheduling.model.TestExecution] expiration=-1ms ] as starting node of: org.drools.ancompiler.Compiledtom_testng_scheduling_model_TestExecutionNetwork32088354246
09:44:10.712 [main] DEBUG o.d.kiesession.agenda.DefaultAgenda - State was INACTIVE is now FIRING_ALL_RULES
09:44:10.714 [main] DEBUG o.d.kiesession.agenda.DefaultAgenda - State was FIRING_ALL_RULES is now HALTING
09:44:10.714 [main] DEBUG o.d.kiesession.agenda.DefaultAgenda - State was HALTING is now INACTIVE
09:44:10.714 [main] INFO  o.o.core.impl.solver.DefaultSolver - Solving started: time spent (201), best score (0hard/0soft), environment mode (REPRODUCIBLE), move thread count (NONE), random (JDK with seed 0).
09:44:10.726 [main] INFO  o.o.core.impl.solver.DefaultSolver - Skipped all phases (2): out of 0 planning entities, none are movable (non-pinned).
09:44:10.730 [main] DEBUG o.d.kiesession.agenda.DefaultAgenda - State was INACTIVE is now DISPOSED
09:44:10.730 [main] INFO  o.o.core.impl.solver.DefaultSolver - Solving ended: time spent (213), best score (0hard/0soft), score calculation speed (4/sec), phase total (2), environment mode (REPRODUCIBLE), move thread count (NONE).
09:44:10.730 [main] INFO  tom.testng.scheduling.TestScheduler - No TestExecutions

Lukáš Petrovický

unread,
Mar 24, 2022, 7:45:34 AM3/24/22
to optapla...@googlegroups.com
Hey there,

the only relevant part of all of that is this:

On Thu, Mar 24, 2022 at 12:23 PM 'Hashmir Hushmir' via OptaPlanner development <optapla...@googlegroups.com> wrote:
09:44:10.726 [main] INFO  o.o.core.impl.solver.DefaultSolver - Skipped all phases (2): out of 0 planning entities, none are movable (non-pinned).

That should tell you what your problem is.

You can save yourself a lot of trouble if you just set logging level of "org.drools" to "WARN" - all of the DEBUG output for this package is unlikely to give you any important information.

--

Lukáš Petrovický

He/Him/His

Principal Software Engineer

lukas.pe...@redhat.com    IM: triceo/lpetrovi

My work week is Monday to Thursday.

Hashmir Hushmir

unread,
Mar 24, 2022, 10:26:32 AM3/24/22
to OptaPlanner development
Thank you, in that case I have a missunderstanding of how things work. Can one of you please point out the flaw in my understanding?

I used the quickstart example for understanding the basics and I was under the impression that I need a PlanningEntity like the TestExecution below:

@PlanningEntity
public class TestExecution {

@PlanningId
private Long id;

@PlanningVariable(valueRangeProviderRefs = "testRange")
private Test test;

@PlanningVariable(valueRangeProviderRefs = "tomSetRange")
private TomSet tomSet;

}

I need a solution, which gathers all the bits and pieces, which shall be used for planning like below:

@PlanningSolution
public class TestExecutionTable {

@ProblemFactCollectionProperty
@ValueRangeProvider(id = "tomSetRange")
private List<TomSet> tomSetList;

@ProblemFactCollectionProperty
@ValueRangeProvider(id = "testRange")
private List<Test> testList;

@PlanningEntityCollectionProperty
private List<TestExecution> testExecutions;

@PlanningScore
private HardSoftScore score;

public TestExecutionTable() {
}

public TestExecutionTable(List<TomSet> tomSetList, List<Test> testList) {
this.tomSetList = tomSetList;
this.testList = testList;
this.testExecutions = Collections.EMPTY_LIST;
}

...
}

and I need to formulate my constraints:

public class TestExecutionTableConstraintProvider implements ConstraintProvider {

@Override
public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
return new Constraint[]{
matchingTomSet(constraintFactory)
};
}

public Constraint matchingTomSet(ConstraintFactory constraintFactory) {
return constraintFactory
// Select TestExecutions with TomSet status hash equaling the Test expected status hash
.forEach(TestExecution.class)
.filter(testExecution -> testExecution.getTest().getExpectedStatusHash().equals(testExecution.getTomSet().getSetStatusHash()))
.reward("Test TomSet Match", HardSoftScore.ONE_HARD);
}

}

and of course I need to execute the entire thing as below. The generateDemoData() just fills the List<Test> and the List<TomSet> and hands it over to the TestExecutionTable constructor.

public class TestScheduler {

private static final Logger LOGGER = LoggerFactory.getLogger(TestScheduler.class);

public static void main(String[] args) {
SolverFactory<TestExecutionTable> solverFactory = SolverFactory.create(new SolverConfig()
.withSolutionClass(TestExecutionTable.class)
.withEntityClasses(TestExecution.class)
.withConstraintProviderClass(TestExecutionTableConstraintProvider.class)
.withTerminationSpentLimit(Duration.ofSeconds(20)));

TestExecutionTable problem = generateDemoData();

// Solve the problem
Solver<TestExecutionTable> solver = solverFactory.buildSolver();
TestExecutionTable solution = solver.solve(problem);
if (solution.getTestExecutions().size() == 0) {
LOGGER.info("No TestExecutions");
} else {
solution.getTestExecutions().stream().forEach(execution -> LOGGER.info(execution.toString()));
}
}

Hashmir Hushmir

unread,
Mar 24, 2022, 10:51:54 AM3/24/22
to OptaPlanner development
I can answer my own question, I am just not good at rubber duging:

My mistake was not to create a list of TestExecutions, as you can see from my code, I just had an empty list there:
this.testExecutions = Collections.EMPTY_LIST;

I added this parameter to the constructor,

public TestExecutionTable(List<TomSet> tomSetList, List<Test> testList, List<TestExecution> testExecutionList) {

and added an empty constructor because OptaPlanner needs this to create clones of TestExecutions, I think.

Then I added an empty shell during the initialization in generateDemoData():

List<TestExecution> testExecutionList = new ArrayList<>();
long id = 0;

testExecutionList.add(new TestExecution(id++));

TestExecutionTable testExecutionTable = new TestExecutionTable(tomSetList, testList, testExecutionList);

After that I got results. Not sure if they are correct, but I will check that next.

So my main mistake was, since my PlanningEntity looks like this, see below, and I have nothing to define inside the PlanningEntity that OptaPlanner would just do this by itself, because all it needs to do is iterate through all combinations of tests and TomSets, but that was wishful thinking.

@PlanningEntity
public class TestExecution {

@PlanningId
private Long id;

@PlanningVariable(valueRangeProviderRefs = "testRange")
private Test test;

@PlanningVariable(valueRangeProviderRefs = "tomSetRange")
private TomSet tomSet;

// No-arg constructor required for OptaPlanner
public TestExecution() {

}

public TestExecution(Long id) {
this.id = id;
}

public Long getId() {
return id;
}

public Test getTest() {
return test;
}

public TomSet getTomSet() {
return tomSet;
}
}

Thank you for your help
Reply all
Reply to author
Forward
0 new messages