Hi Nina,

You're exactly right on the error. Stephan mentioned this the other day but we thought it might just have been if you mix the byte codes (i.e. compile with JDK 6 and run with JDK 7). Luckily I found the error straight away.

A comparison violation is as follows if a < b and b < c then a must be less then c. If a is not less then c you haven't written the comparison method incorrectly. Having a quick look at the stack trace it's possible to find the bug in the canonical labeller.

Hint: what happens if the first values is negative… :)

1
2
3
4
5
6
7
8
9
10
11
12
  private void sortArrayList(ArrayList v) {
    Collections.sort(v, new Comparator() {
      public int compare(Object o1, Object o2) {
        return (int) (((InvPair) o1).getCurr() - ((InvPair) o2).getCurr());
      }
    });
    Collections.sort(v, new Comparator() {
      public int compare(Object o1, Object o2) {
        return (int) (((InvPair) o1).getLast() - ((InvPair) o2).getLast());
      }
    });
  }

https://gist.github.com/4139439
me John May | Predoctoral Student – Chemoinformatics and Metabolism
European Bioinformatics Institute, Wellcome Trust Genome Campus, Hinxton, Cambridge, CB10 1SD, UK
johnmay@ebi.ac.uk | +44–(0) 1223 49 2603

On 24 Nov 2012, at 08:41, Nina Jeliazkova <jeliazkova.nina@gmail.com> wrote:

Dear Alberto, All

On 24 November 2012 10:06, Alberto Manganaro <alberto.manganaro@unimib.it> wrote:
Dear all,

I encountered a strange Exception while using classes for generation of
SMILES. For a couple of molecules, I get a "Comparison method violates
its general contract!" message and I really can understand the meaning!

I'm actually working with CDK 1.4.9, following a slice of code where
such Exception is raised:

String s_in =
"CC(C)(C)C1=CC(=C(OP2OCC3(COP(OC4=CC=C(C=C4C(C)(C)C)C(C)(C)C)OC3)CO2)C=C1)C(C)(C)C";
SmilesParser sp = new SmilesParser(DefaultChemObjectBuilder.getInstance());
IMolecule m = sp.parseSmiles(s_in);
SmilesGenerator sg = new SmilesGenerator();
String s_out = sg.createSMILES(m);
System.out.println(s_out);

The molecule itself is correctly parsed from the SMILES, and anyway it
doesn't seem a "strange" or complex molecule... but then when I try to
generate again the SMILES from the molecule, I get that Exception.

Does anyone know what's wrong? I make some mistakes or is it a weird
behaviour of the SMILES generator? Thanks in advance for the help! Regards

I did a quick test with  https://github.com/ideaconsult/examples-cdk/tree/master/maven-single-module , where CDK versions could be changed by maven profile. It works fine, no exceptions (you could get the code and run it with , e.g.  mvn clean install -P cdk-1.4.9  )

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running net.idea.examples.cdk.maven_single_module.SmilesTest
O(C=1C=CC(=CC=1C(C)(C)C)C(C)(C)C)P2OCC4(CO2)(COP(OC3=CC=C(C=C3C(C)(C)C)C(C)(C)C)OC4)
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.706 sec

Otherwise, the error means a comparator is not transitive (Google search is usually exceptionally precise when searching for error messages ;)   https://www.google.com/search?q=Comparison+method+violates+its+general+contract 

Which exactly comparator is hard to say without reproducing the error. 

But it is likely due to error in a specific JDK version - which one do you use?  (I've tested with JDK 1.6_037)

http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#source 
Area: API: Utilities
Synopsis: Updated sort behavior for Arrays and Collections may throw anIllegalArgumentException
Description: The sorting algorithm used by java.util.Arrays.sort and (indirectly) byjava.util.Collections.sort has been replaced. The new sort implementation may throw anIllegalArgumentException if it detects a Comparable that violates the Comparable contract. The previous implementation silently ignored such a situation.
If the previous behavior is desired, you can use the new system property,java.util.Arrays.useLegacyMergeSort, to restore previous mergesort behavior.
Nature of Incompatibility: behavioral
RFE: 6804124

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6804124

I am copying the cdk-devel list, as this seems to be change in the behaviour in JDK 1.7 for a pretty core JDK functionality , and it could affect lot more code than SMILES processing ...

Regards,
Nina



Alberto

--
Alberto Manganaro

Milano Chemometrics and QSAR Research Group
Department of Environmental Sciences
University of Milano-Bicocca P.zza della Scienza, 1
20126 Milano - Italy

http://michem.disat.unimib.it/chm/

------------------------------------------------------------------------------
Monitor your physical, virtual and cloud infrastructure from a single
web console. Get in-depth insight into apps, servers, databases, vmware,
SAP, cloud infrastructure, etc. Download 30-day Free Trial.
Pricing starts from $795 for 25 servers or applications!
http://p.sf.net/sfu/zoho_dev2dev_nov
_______________________________________________
Cdk-user mailing list
Cdk-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/cdk-user

------------------------------------------------------------------------------
Monitor your physical, virtual and cloud infrastructure from a single
web console. Get in-depth insight into apps, servers, databases, vmware,
SAP, cloud infrastructure, etc. Download 30-day Free Trial.
Pricing starts from $795 for 25 servers or applications!
http://p.sf.net/sfu/zoho_dev2dev_nov_______________________________________________
Cdk-user mailing list
Cdk-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/cdk-user