Robot explain crashes upon writing the explanations to Markdown
The command
robot explain -vvv -i input.owl --reasoner ELK -M unsatisfiability --unsatisfiable all --explanation explanations.md
ends-up with the following exception (I will try to pinpoint some MWE ontology to provide here).
21:14:13 DEBUG Missing exception ID: Comparison method violates its general contract!
21:14:45 Comparison method violates its general contract!
21:14:45 java.lang.IllegalArgumentException: Comparison method violates its general contract!
21:14:45 at java.base/java.util.TimSort.mergeLo(TimSort.java:781)
21:14:45 at java.base/java.util.TimSort.mergeAt(TimSort.java:518)
21:14:45 at java.base/java.util.TimSort.mergeCollapse(TimSort.java:448)
21:14:45 at java.base/java.util.TimSort.sort(TimSort.java:245)
21:14:45 at java.base/java.util.Arrays.sort(Arrays.java:1515)
21:14:45 at java.base/java.util.ArrayList.sort(ArrayList.java:1750)
21:14:45 at java.base/java.util.Collections.sort(Collections.java:179)
21:14:45 at uk.ac.manchester.cs.owl.explanation.ProtegeExplanationOrderer.getRHSEntitiesSorted(ProtegeExplanationOrderer.java:181)
21:14:45 at uk.ac.manchester.cs.owl.explanation.ProtegeExplanationOrderer.insertChildren(ProtegeExplanationOrderer.java:212)
21:14:45 at uk.ac.manchester.cs.owl.explanation.ProtegeExplanationOrderer.insertChildren(ProtegeExplanationOrderer.java:213)
21:14:45 at uk.ac.manchester.cs.owl.explanation.ProtegeExplanationOrderer.insertChildren(ProtegeExplanationOrderer.java:213)
21:14:45 at uk.ac.manchester.cs.owl.explanation.ProtegeExplanationOrderer.getOrderedExplanation(ProtegeExplanationOrderer.java:135)
21:14:45 at org.obolibrary.robot.ExplainOperation.renderExplanationAsMarkdown(ExplainOperation.java:165)
21:14:45 at org.obolibrary.robot.ExplainCommand.lambda$writeExplanationsToFile$5(ExplainCommand.java:292)
21:14:45 at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
21:14:45 at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1621)
21:14:45 at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
21:14:45 at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
21:14:45 at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
21:14:45 at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
21:14:45 at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
21:14:45 at org.obolibrary.robot.ExplainCommand.writeExplanationsToFile(ExplainCommand.java:293)
21:14:45 at org.obolibrary.robot.ExplainCommand.handleUnsatisfiableMode(ExplainCommand.java:199)
21:14:45 at org.obolibrary.robot.ExplainCommand.execute(ExplainCommand.java:139)
21:14:45 at org.obolibrary.robot.CommandManager.executeCommand(CommandManager.java:244)
21:14:45 at org.obolibrary.robot.CommandManager.execute(CommandManager.java:188)
21:14:45 at org.obolibrary.robot.CommandManager.main(CommandManager.java:135)
21:14:45 at org.obolibrary.robot.CommandLineInterface.main(CommandLineInterface.java:61)
Instead of all, try random:50. this May simply be too many unsats to write out.
Thanks for tip @matentzn, worked (but for nothing greater than 2 in my case ;-) )!
I propose to keep the ticket open for improving the error message in this case.
@balhoff Any ideas about this one?
Not offhand, but I could take a look at an example input that causes the problem.
I was able to replicate this, see attached
Sorry the ontology is a bit crazy (it was made by ontogpt)
however, Nico's solution doesn't work for me, even if I only ask for one explanation:
robot explain -vvv -M unsatisfiability --unsatisfiable random:1 -r elk -i ~/tmp/expl-test.owl -e test.md
DEBUG Loading file META-INF/services/org.semanticweb.owlapi.model.OWLOntologyIRIMapper
DEBUG No files found for META-INF/services/org.semanticweb.owlapi.model.OWLOntologyIRIMapper
DEBUG Injecting values [[]] on method public void uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.setIRIMappers(java.util.Set).
DEBUG Missing exception ID: Comparison method violates its general contract!
Comparison method violates its general contract!
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.base/java.util.TimSort.mergeLo(TimSort.java:781)
at java.base/java.util.TimSort.mergeAt(TimSort.java:518)
at java.base/java.util.TimSort.mergeCollapse(TimSort.java:448)
at java.base/java.util.TimSort.sort(TimSort.java:245)
at java.base/java.util.Arrays.sort(Arrays.java:1307)
at java.base/java.util.ArrayList.sort(ArrayList.java:1721)
at java.base/java.util.Collections.sort(Collections.java:179)
at uk.ac.manchester.cs.owl.explanation.ProtegeExplanationOrderer.getRHSEntitiesSorted(ProtegeExplanationOrderer.java:181)
at uk.ac.manchester.cs.owl.explanation.ProtegeExplanationOrderer.insertChildren(ProtegeExplanationOrderer.java:212)
at uk.ac.manchester.cs.owl.explanation.ProtegeExplanationOrderer.getOrderedExplanation(ProtegeExplanationOrderer.java:135)
at org.obolibrary.robot.ExplainOperation.renderExplanationAsMarkdown(ExplainOperation.java:165)
at org.obolibrary.robot.ExplainCommand.lambda$writeExplanationsToFile$5(ExplainCommand.java:292)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1707)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at org.obolibrary.robot.ExplainCommand.writeExplanationsToFile(ExplainCommand.java:293)
at org.obolibrary.robot.ExplainCommand.handleUnsatisfiableMode(ExplainCommand.java:199)
at org.obolibrary.robot.ExplainCommand.execute(ExplainCommand.java:139)
at org.obolibrary.robot.CommandManager.executeCommand(CommandManager.java:244)
at org.obolibrary.robot.CommandManager.execute(CommandManager.java:188)
at org.obolibrary.robot.CommandManager.main(CommandManager.java:135)
at org.obolibrary.robot.CommandLineInterface.main(CommandLineInterface.java:61)
I get the same error when I switch the reasoner to hermit
FWIW, Protege isn't much help:
the log shows the same message:
@cmungall thanks a lot, I actually completely forgot on this bit ...
Attached is a MUPS (or almost MUPS, didn't check) pinpointed from that ontology. expl-test.owl.txt
Since the same error happens in Protégé, the fix might need to be made in one of these:
- https://github.com/protegeproject/explanation-workbench
- https://github.com/matthewhorridge/owlexplanation