| Client Algorithms |  | 
SMARTS language
The atomic primitives provided are:
| Symbol | Description | Default | 
|---|---|---|
| * | any atom | no default | 
| a | aromatic atom | no default | 
| A | aliphatic atom | no default | 
| D<n> | n number of connections | 1 | 
| H<n> | n total number of Hydrogens attached | 1 | 
| h<n> | n implicit number of Hydrogens attached | 1 | 
| R<n> | the atoms belongs to n SSSR rings | any ring atom | 
| r<n> | the atoms belongs to a SSSR ring of size n | any ring atom | 
| X<n> | n number of total connections | 1 | 
| x<n> | n total ring connections | at least 1 | 
| -<n> | -n charge | -1 (-- is -2) | 
| +<n> | +n charge | +1 (++ is +2) | 
| #<n> | atomic number of n | no default | 
Additional CDL atomic primitives are
| Symbol | Description | Default | 
|---|---|---|
| j<n> | Vertex index equals n | no defaults. Must provide a value. This primitive is handy when searching for subgroups from a certain distance of a known atom: i.e. [j15]~*~*~*~[$([NX3+](=O)[O-])] searches a Nitro group 4 bonds apart from the vertex of index 15 | 
| < | repositions the index of the second smarts graph vertex to the one of the LHS of symbol < This symbol is actually not an atomic primitive, hence it should be included in the main branch of a smarts (it should not be included in brackets). | no arguments required. Please refer to the fusion operator of the CDL chemical algebra | 
The bond primitives provided :
| Symbol | Description | 
|---|---|
| - | single bond | 
| = | double bond | 
| # | triple bond | 
| : | aromatic bond | 
| ~ | any bond | 
| @ | any ring bond | 
Logical operators:
| Symbol | Operator | Description | 
|---|---|---|
| , | or | Lazy evaluator of LHS or RHS | 
| ! | not | negates the subsequent rule | 
| & | and | Lazy operator. Checks first LHS | 
| ; | and | Lazy operator. Checks first RHS | 
  template <class Molecule>
  struct smarts {
    typedef Molecule                                               molecule_t;
    smarts(const std::string& smart_str);
    bool operator()(const molecule_t& external_mol);
    
    bool empty();
    const mapped_cont_t& get_mapped_vertices() const;
    
    size_t smarts_size() const;
    
  };
mapped_cont_t is of type std::vector<std::vector<std::pair<vertex_descriptor,vertex_descriptor> > > which provides the same mapping as explained in the indexed_molecule.
For component grouping use the following class :
  template <class Molecule>
  struct component_smarts {
  
    typedef Molecule    molecule_t;
  
    component_smarts(const std::string& smart_str);
      
    bool operator()(const molecule_t& external_mol);
    
  private :
    std::vector<std::string>        m_component_smarts;
    
  };
This implementation of componen grouping accepts groups enclosed by parenthesis. If an initial zero-level parenthesis is present, then the following groups must be enclosed by parenthesis: i.e. "(" must follow a "."