code: def get_materialized_checkpoints(
      checkpoints, colnames, lower_dt, odo_kwargs
  ):
      """
      Computes a lower bound and a DataFrame checkpoints.
  
      Parameters
      ----------
      checkpoints : Expr
          Bound blaze expression for a checkpoints table from which to get a
          computed lower bound.
      colnames : iterable of str
          The names of the columns for which checkpoints should be computed.
      lower_dt : pd.Timestamp
          The lower date being queried for that serves as an upper bound for
          checkpoints.
      odo_kwargs : dict, optional
          The extra keyword arguments to pass to ``odo``.
      """
      if checkpoints is not None:
          ts = checkpoints[TS_FIELD_NAME]
          checkpoints_ts = odo(
              ts[ts <= lower_dt].max(), pd.Timestamp, **odo_kwargs
          )
          if pd.isnull(checkpoints_ts):
              # We don't have a checkpoint for before our start date so just
              # don't constrain the lower date.
              materialized_checkpoints = pd.DataFrame(columns=colnames)
              lower = None
          else:
              materialized_checkpoints = odo(
                  checkpoints[ts == checkpoints_ts][colnames],
                  pd.DataFrame,
                  **odo_kwargs,
              )
              lower = checkpoints_ts
      else:
          materialized_checkpoints = pd.DataFrame(columns=colnames)
          lower = None  # we don't have a good lower date constraint
      return lower, materialized_checkpoints
  
imports: from __future__ import division, absolute_import
  from abc import ABCMeta, abstractproperty
  from collections import namedtuple, defaultdict
  from functools import partial
  from itertools import count
  import warnings
  from weakref import WeakKeyDictionary
  import blaze
  from datashape import Date, DateTime, Option, isrecord, isscalar
  import numpy
  from odo import odo
  import pandas
  from six import with_metaclass, PY2, itervalues, iteritems
  from toolz import complement, compose, flip, groupby, identity, memoize, merge
  import toolz.curried.operator
  from catalyst.pipeline.common import AD_FIELD_NAME, SID_FIELD_NAME, TS_FIELD_NAME
  from catalyst.pipeline.data.dataset import DataSet, Column
  from catalyst.pipeline.loaders.utils import check_data_query_args, last_in_date_group, normalize_data_query_bounds, normalize_timestamp_to_query_time, ffill_across_cols
  from catalyst.pipeline.sentinels import NotSpecified
  from catalyst.lib.adjusted_array import AdjustedArray, can_represent_dtype
  from catalyst.lib.adjustment import make_adjustment_from_indices, OVERWRITE
  from catalyst.utils.input_validation import expect_element, ensure_timezone, optionally
  from catalyst.utils.numpy_utils import bool_dtype
  from catalyst.utils.pool import SequentialPool
  from catalyst.utils.preprocess import preprocess
label_desc: Use image node_id 14 for calling a global function with example usage: get_materialized_checkpoints(checkpoints, colnames, lower_dt, odo_kwargs) and returns: lower,  materialized_checkpoints