def search(self, regex):
        try:
            spec = {'$or': [{'data.content'    : {'$regex': regex, '$options': 'im'}},
                            {'data.description': {'$regex': regex, '$options': 'im'}}]}
            fields = {'_id': 0}
            cur = self.db.docs.find(spec, fields)
        except Exception as e:
            raise DatabaseException(e)
        return [Document(**row) for row in cur]
def testSparse(self, dtype, param_value):
    (learning_rate, decay, momentum, epsilon, centered, _) = tuple(
        param_value)
    with self.session(use_gpu=True):
      # Initialize variables for numpy implementation.
      var0_np = np.array([1.0, 2.0], dtype=dtype.as_numpy_dtype)
      grads0_np = np.array([0.1], dtype=dtype.as_numpy_dtype)
      var1_np = np.array([3.0, 4.0], dtype=dtype.as_numpy_dtype)
      grads1_np = np.array([0.01], dtype=dtype.as_numpy_dtype)

      var0 = variables.Variable(var0_np)
      var1 = variables.Variable(var1_np)
      grads0_np_indices = np.array([0], dtype=np.int32)
      grads0 = ops.IndexedSlices(
          constant_op.constant(grads0_np),
          constant_op.constant(grads0_np_indices), constant_op.constant([1]))
      grads1_np_indices = np.array([1], dtype=np.int32)
      grads1 = ops.IndexedSlices(
          constant_op.constant(grads1_np),
          constant_op.constant(grads1_np_indices), constant_op.constant([1]))
      opt = rmsprop.RMSPropOptimizer(
          learning_rate=learning_rate,
          decay=decay,
          momentum=momentum,
          epsilon=epsilon,
          centered=centered)
      update = opt.apply_gradients(zip([grads0, grads1], [var0, var1]))
      variables.global_variables_initializer().run()

      mg0 = opt.get_slot(var0, "mg")
      self.assertEqual(mg0 is not None, centered)
      mg1 = opt.get_slot(var1, "mg")
      self.assertEqual(mg1 is not None, centered)
      rms0 = opt.get_slot(var0, "rms")
      self.assertIsNotNone(rms0)
      rms1 = opt.get_slot(var1, "rms")
      self.assertIsNotNone(rms1)
      mom0 = opt.get_slot(var0, "momentum")
      self.assertIsNotNone(mom0)
      mom1 = opt.get_slot(var1, "momentum")
      self.assertIsNotNone(mom1)

      mg0_np = np.array([0.0, 0.0], dtype=dtype.as_numpy_dtype)
      mg1_np = np.array([0.0, 0.0], dtype=dtype.as_numpy_dtype)
      rms0_np = np.array([epsilon, epsilon], dtype=dtype.as_numpy_dtype)
      rms1_np = np.array([epsilon, epsilon], dtype=dtype.as_numpy_dtype)
      mom0_np = np.array([0.0, 0.0], dtype=dtype.as_numpy_dtype)
      mom1_np = np.array([0.0, 0.0], dtype=dtype.as_numpy_dtype)

      # Fetch params to validate initial values
      self.assertAllClose([1.0, 2.0], var0.eval())
      self.assertAllClose([3.0, 4.0], var1.eval())

      # Run 4 steps of RMSProp
      for _ in range(4):
        update.run()

        var0_np, mg0_np, rms0_np, mom0_np = self._sparse_rmsprop_update_numpy(
            var0_np, grads0_np_indices, grads0_np, mg0_np, rms0_np, mom0_np,
            learning_rate, decay, momentum, centered)
        var1_np, mg1_np, rms1_np, mom1_np = self._sparse_rmsprop_update_numpy(
            var1_np, grads1_np_indices, grads1_np, mg1_np, rms1_np, mom1_np,
            learning_rate, decay, momentum, centered)

        # Validate updated params
        if centered:
          self.assertAllCloseAccordingToType(mg0_np, mg0.eval())
          self.assertAllCloseAccordingToType(mg1_np, mg1.eval())
        self.assertAllCloseAccordingToType(rms0_np, rms0.eval())
        self.assertAllCloseAccordingToType(rms1_np, rms1.eval())
        self.assertAllCloseAccordingToType(mom0_np, mom0.eval())
        self.assertAllCloseAccordingToType(mom1_np, mom1.eval())
        self.assertAllCloseAccordingToType(var0_np, var0.eval())
        self.assertAllCloseAccordingToType(var1_np, var1.eval())