def example(extract='m', estimate=False):
    import pandas as pd

    import larch as lx

    d = lx.examples.MTC(format="dataset")
    d

    m = lx.Model(d)

    from larch import PX, P, X

    m.utility_co[2] = P("ASC_SR2") + P("hhinc#2") * X("hhinc")
    m.utility_co[3] = P("ASC_SR3P") + P("hhinc#3") * X("hhinc")
    m.utility_co[4] = P("ASC_TRAN") + P("hhinc#4") * X("hhinc")
    m.utility_co[5] = P("ASC_BIKE") + P("hhinc#5") * X("hhinc")
    m.utility_co[6] = P("ASC_WALK") + P("hhinc#6") * X("hhinc")

    m.utility_ca = PX("tottime") + PX("totcost")

    m.availability_ca_var = "avail"
    m.choice_ca_var = "chose"

    m.title = "MTC Example 1 (Simple MNL)"

    # TEST
    buffer = (
        b"\x80\x05\x95\xc9\x04\x00\x00\x00\x00\x00\x00\x8c\x11pandas.core.frame\x94\x8c\tDataFrame"
        b"\x94\x93\x94)\x81\x94}\x94(\x8c\x04_mgr\x94\x8c\x1epandas.core.internals.managers\x94\x8c\x0c"
        b"BlockManager\x94\x93\x94\x8c\x16pandas._libs.internals\x94\x8c\x0f_unpickle_block\x94\x93\x94"
        b"\x8c\x15numpy.core.multiarray\x94\x8c\x0c_reconstruct\x94\x93\x94\x8c\x05numpy\x94\x8c\x07nda"
        b"rray\x94\x93\x94K\x00\x85\x94C\x01b\x94\x87\x94R\x94(K\x01K\x01K\x07\x86\x94h\x0f\x8c\x05dtyp"
        b"e\x94\x93\x94\x8c\x02O8\x94\x89\x88\x87\x94R\x94(K\x03\x8c\x01|\x94NNNJ\xff\xff\xff\xffJ\xff"
        b"\xff\xff\xffK?t\x94b\x89]\x94(h\x0c\x8c\x06scalar\x94\x93\x94h\x18\x8c\x02U2\x94\x89\x88\x87"
        b"\x94R\x94(K\x03\x8c\x01<\x94NNNK\x08K\x04K\x08t\x94bC\x08D\x00\x00\x00A\x00\x00\x00\x94\x86"
        b"\x94R\x94h h\x18\x8c\x02U3\x94\x89\x88\x87\x94R\x94(K\x03h$NNNK\x0cK\x04K\x08t\x94bC\x0cS\x00"
        b"\x00\x00R\x00\x00\x002\x00\x00\x00\x94\x86\x94R\x94h h\x18\x8c\x02U4\x94\x89\x88\x87\x94R\x94"
        b"(K\x03h$NNNK\x10K\x04K\x08t\x94bC\x10S\x00\x00\x00R\x00\x00\x003\x00\x00\x00+\x00\x00\x00\x94"
        b"\x86\x94R\x94h h\x18\x8c\x02U7\x94\x89\x88\x87\x94R\x94(K\x03h$NNNK\x1cK\x04K\x08t\x94bC\x1cT"
        b"\x00\x00\x00r\x00\x00\x00a\x00\x00\x00n\x00\x00\x00s\x00\x00\x00i\x00\x00\x00t\x00\x00\x00\x94"
        b"\x86\x94R\x94h h\x18\x8c\x02U4\x94\x89\x88\x87\x94R\x94(K\x03h$NNNK\x10K\x04K\x08t\x94bC\x10B"
        b"\x00\x00\x00i\x00\x00\x00k\x00\x00\x00e\x00\x00\x00\x94\x86\x94R\x94h h\x18\x8c\x02U4\x94\x89"
        b"\x88\x87\x94R\x94(K\x03h$NNNK\x10K\x04K\x08t\x94bC\x10W\x00\x00\x00a\x00\x00\x00l\x00\x00\x00k"
        b"\x00\x00\x00\x94\x86\x94R\x94\x8c\x00\x94et\x94b\x8c\x08builtins\x94\x8c\x05slice\x94\x93\x94K"
        b"\x00K\x01K\x01\x87\x94R\x94K\x02\x87\x94R\x94h\x0b\x8c\x12numpy.core.numeric\x94\x8c\x0b_from"
        b"buffer\x94\x93\x94(\x968\x00\x00\x00\x00\x00\x00\x005\x0e\x00\x00\x00\x00\x00\x00\x05\x02\x00"
        b"\x00\x00\x00\x00\x00\xa1\x00\x00\x00\x00\x00\x00\x00\xf2\x01\x00\x00\x00\x00\x00\x002\x00\x00"
        b"\x00\x00\x00\x00\x00\xa6\x00\x00\x00\x00\x00\x00\x00\xa5\x13\x00\x00\x00\x00\x00\x00\x94h\x18"
        b"\x8c\x02i8\x94\x89\x88\x87\x94R\x94(K\x03h$NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94bK"
        b"\x01K\x07\x86\x94\x8c\x01C\x94t\x94R\x94hPK\x01K\x02K\x01\x87\x94R\x94K\x02\x87\x94R\x94h\x0bh"
        b"\x0eh\x11K\x00\x85\x94h\x13\x87\x94R\x94(K\x01K\x01K\x07\x86\x94h\x1b\x89]\x94(M\x93\x12M\xa5"
        b"\x13M\xa5\x13M\xa3\x0fM\xca\x06M\xc7\x05hLet\x94bhPK\x02K\x03K\x01\x87\x94R\x94K\x02\x87\x94R"
        b"\x94\x87\x94]\x94(\x8c\x18pandas.core.indexes.base\x94\x8c\n_new_Index\x94\x93\x94hq\x8c\x05"
        b"Index\x94\x93\x94}\x94(\x8c\x04data\x94h\x0eh\x11K\x00\x85\x94h\x13\x87\x94R\x94(K\x01K\x03"
        b"\x85\x94h\x1b\x89]\x94(\x8c\x04name\x94\x8c\x06chosen\x94\x8c\tavailable\x94et\x94bh}Nu\x86"
        b"\x94R\x94hshu}\x94(hwh\x0eh\x11K\x00\x85\x94h\x13\x87\x94R\x94(K\x01K\x07\x85\x94h\x1b\x89]"
        b"\x94(K\x01K\x02K\x03K\x04K\x05K\x06\x8c\x1a< Total All Alternatives >\x94et\x94bh}Nu\x86\x94R"
        b"\x94e\x86\x94R\x94\x8c\x04_typ\x94\x8c\tdataframe\x94\x8c\t_metadata\x94]\x94\x8c\x05attrs\x94"
        b"}\x94\x8c\x06_flags\x94}\x94\x8c\x17allows_duplicate_labels\x94\x88sub."
    )
    import io

    pd.testing.assert_frame_equal(
        pd.read_pickle(io.BytesIO(buffer)),
        m.choice_avail_summary(),
    )

    m.set_cap(20)

    assert m.compute_engine == "jax"
    if not estimate:
        if isinstance(extract, str):
            return locals()[extract]
        else:
            _locals = locals()
            return [_locals.get(i) for i in extract]
    result = m.maximize_loglike(stderr=True)

    m.parameter_summary()

    m.ordering = (
        (
            "LOS",
            "totcost",
            "tottime",
        ),
        (
            "ASCs",
            "ASC.*",
        ),
        (
            "Income",
            "hhinc.*",
        ),
    )

    m.parameter_summary()

    m.estimation_statistics()
    if isinstance(extract, str):
        return locals()[extract]
    else:
        _locals = locals()
        return [_locals.get(i) for i in extract]
