def _isomorphisms(q, g, check_varprops=True):
    """
    Inspired by Turbo_ISO: http://dl.acm.org/citation.cfm?id=2465300
    """
    # convert MRSs to be more graph-like, and add some indices
    qig = _IsoGraph(q, varprops=check_varprops)  # qig = q isograph
    gig = _IsoGraph(g, varprops=check_varprops)  # gig = q isograph
    # qsigs, qsigidx = _isomorphism_sigs(q, check_varprops)
    # gsigs, gsigidx = _isomorphism_sigs(g, check_varprops)
    # (it would be nice to not have to do this... maybe later)
    # qadj = _isomorphism_adj(q, qsigidx)
    # gadj = _isomorphism_adj(g, gsigidx)
    # the degree of each node is useful (but can it be combined with adj?)
    # qdeg = _isomorphism_deg(qadj)
    # gdeg = _isomorphism_deg(gadj)

    u_s = _isomorphism_choose_start_q_vertex(qig, gig, subgraph=False)
    q_ = _isomorphism_rewrite_to_NECtree(u_s, qig)
    for v_s in gsigs.get(qsigidx[u_s], []):
        cr = _isomorphism_explore_CR(q_, {v_s}, qig, gig)
        if cr is None:
            continue
        order = _isomorphism_determine_matching_order(q_, cr)
        update_state(M,F,{u_s}, {v_s})
        subraph_search(q, q_, g, order, 1)  # 1="the first query vertex to match"
        restore_state(M, F, {u_s}, {v_s})
Inspired by Turbo_ISO: http://dl.acm.org/citation.cfm?id=2465300