Solution de contournement pour un changement radical dans ConnectedMoleculeComponents de 12.1.1 à 12.2.0

Dec 18 2020

Le code suivant utilisé pour travailler dans Mathematica Version 12.1.1:

ClearAll[mol];
mol = Molecule["NC(Cc1ccc(O)c(I)c1)C(=O)O", IncludeHydrogens -> True];

{mol, {"DeleteAtom", 2}} //
Apply[MoleculeModify] //
ConnectedMoleculeComponents

L'atome d'indice 2 est mis en évidence ci-dessous:

Dans Mathematica Version 12.2.0, le code fonctionne jusqu'à l'appel à Apply[MoleculeModify]. Mais en invoquant, ConnectedMoleculeComponentsj'obtiens les erreurs suivantes:

Pendant l'évaluation de In [415]: = KeyMap :: invak: L'argument> LibraryFunctionError [LIBRARY_FUNCTION_ERROR, 6] [atomPropertyAssociation] n'est pas une association valide.

Pendant l'évaluation de In [415]: = KeySort :: invrl: L'argument KeyMap [FromDigits] [LibraryFunctionError [LIBRARY_FUNCTION_ERROR, 6] [atomPropertyAssociation]] n'est pas une association valide ou une liste de règles.

Pendant l'évaluation de In [415]: = KeyValueMap :: invak: L'argument KeySort [KeyMap [FromDigits] [LibraryFunctionError [LIBRARY_FUNCTION_ERROR, 6] [atomPropertyAssociation]]] n'est pas une association valide.

Pendant l'évaluation de In [415]: = Molecule :: nintrp: Impossible d'interpréter LibraryFunctionError [LIBRARY_FUNCTION_ERROR, 6] [Atom [Missing [KeyAbsent, getAtomsList]]] comme nom ou identifiant chimique.

Out [417] = MoleculeModify [Molecule [{"N", "C", "C", "C", "C", "C", "O", "C", "I", "C", "C", "O", "O", "H", "H", "H", "H", "H", "H", "H", "H", "H"}, { Bond [{2, 3}, "Single"], Bond [{3, 4}, "Aromatic"], Bond [{4, 5}, "Aromatic"], Bond [{5, 6}, "Aromatic" ], Bond [{6, 7}, "Single"], Bond [{6, 8}, "Aromatic"], Bond [{8, 9}, "Single"], Bond [{8, 10}, " Aromatique "], Bond [{11, 12}," Double "], Bond [{11, 13}," Single "], Bond [{10, 3}," Aromatic "], Bond [{1, 14} , "Single"], Bond [{1, 15}, "Single"], Bond [{2, 16}, "Single"], Bond [{2, 17}, "Single"], Bond [{4, 18}, "Single"], Bond [{5, 19}, "Single"], Bond [{7, 20}, "Single"], Bond [{10, 21}, "Single"], Bond [{ 13, 22}, "Single"]}, {}], {"ExtractParts", {{2, 3, 4, 5, 6, 7, 8, 9, 10, 16, 17, 18, 19, 20, 21}, {11, 12, 13, 22}, {1, 14, 15}}}, ValenceErrorHandling -> False]

La dernière fois que je me suis plaint de la rupture des changements dans la dernière version, qui était alors Mathematica Version 12.1.0, j'ai été averti de vérifier d' abord l'avis sur les changements incompatibles . Cette fois, j'ai vérifié le lien. Mais il n'y a rien sur ce lien ConnectedMoleculeComponents.

Donc, mes questions sont:

  1. Existe-t-il une solution de contournement à ce problème?
  2. Y a-t-il un espoir d'influencer Wolfram Research pour publier une liste plus complète des changements majeurs, de préférence des semaines avant la sortie de la nouvelle version?

Merci d'avance pour votre aide.

Réponses

8 JasonB. Dec 18 2020 at 09:25

Jusqu'à ce que le bogue soit corrigé, cela devrait fonctionner comme un remplacement pour ConnectedMoleculeComponents:

fixStereo[indices_, replacement_][stereo_] := If[
    SameQ[Complement[Select[Flatten @ Values @ stereo, IntegerQ], indices],
        {}
    ],
    replacement @ stereo, Nothing
];
moleculePart[mol_, indices_] := Module[
    {
        atomlist = AtomList[mol, indices],
        bondlist = BondList[mol, indices],
        options = Options @ mol,
        fixIndices = ReplaceAll[Thread[indices -> Range[Length[indices]]]]
    },
    options = Replace[
        options,
        {
            RuleDelayed[
                HoldPattern[Rule[opt:AtomCoordinates | AtomDiagramCoordinates, x_]],
                opt -> Part[x, indices]
            ],
            HoldPattern[Rule[StereochemistryElements, x_List]] :> (StereochemistryElements -> Map[fixStereo[indices, fixIndices], x])
        },
        {1}
    ];
    Molecule[atomlist, fixIndices @ bondlist, options]
];
connectedMoleculeComponents[mol_] := Map[
    moleculePart[mol, #]&,
    ConnectedComponents @ MoleculeGraph @ mol
]

Pour l'exemple, cela fonctionne très bien,

mol = Molecule["NC(Cc1ccc(O)c(I)c1)C(=O)O", IncludeHydrogens -> True] // 
    MoleculeModify[{"DeleteAtom", 2}] // connectedMoleculeComponents