robot icon indicating copy to clipboard operation
robot copied to clipboard

Robot explain crashes upon writing the explanations to Markdown

Open psiotwo opened this issue 3 years ago • 7 comments

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)

psiotwo avatar Jun 28 '22 04:06 psiotwo

Instead of all, try random:50. this May simply be too many unsats to write out.

matentzn avatar Jun 28 '22 10:06 matentzn

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.

psiotwo avatar Jun 29 '22 06:06 psiotwo

@balhoff Any ideas about this one?

jamesaoverton avatar Jul 06 '22 17:07 jamesaoverton

Not offhand, but I could take a look at an example input that causes the problem.

balhoff avatar Jul 06 '22 18:07 balhoff

I was able to replicate this, see attached

Sorry the ontology is a bit crazy (it was made by ontogpt)

expl-test.owl.gz.txt

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:

image

the log shows the same message:

image

cmungall avatar Jan 05 '23 22:01 cmungall

@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

psiotwo avatar Jan 09 '23 10:01 psiotwo

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

balhoff avatar Jan 10 '23 20:01 balhoff