  Lenses are programs that can be run both "front to back" and "back to front,"
allowing updates to either their source or their target data to be transferred
in both directions. Lenses have been extensively studied, extended, and
applied. Recent work has demonstrated how techniques from type-directed program
synthesis can be used to efficiently synthesize a simple class of
lenses---bijective lenses over string data---given a pair of types (regular
expressions) and examples.
  We extend this synthesis algorithm to a broader class of lenses, called
simple symmetric lenses, including all bijective lenses, all of the popular
category of "asymmetric" lenses, and a subset of the "symmetric lenses"
proposed by Hofmann et al. Intuitively, simple symmetric lenses allow some
information to be present on one side but not the other and vice versa. They
are of independent theoretical interest, being the largest class of symmetric
lenses that do not use persistent internal state.
  Synthesizing simple symmetric lenses is more challenging than synthesizing
bijective lenses: Since some of the information on each side can be
"disconnected" from the other side, there will typically be many lenses that
agree with a given example. To guide the search process, we use stochastic
regular expressions and information theory to estimate the amount of
information propagated by a candidate lens, preferring lenses that propagate
more information, as well as user annotations marking parts of the source and
target formats as either irrelevant or essential.
  We describe an implementation of simple symmetric lenses and our synthesis
procedure as extensions to the Boomerang language. We evaluate its performance
on 48 benchmark examples drawn from Flash Fill, Augeas, and the bidirectional
programming literature. Our implementation can synthesize each of these lenses
in under 30 seconds.
