Qcert.Translation.NNRCMRtoNNRC

















Section NNRCMRtoNNRC.

  Context {fruntime:foreign_runtime}.
  Context {fredop:foreign_reduce_op}.
  Context {ftoredop:foreign_to_reduce_op}.

  Context (h:brand_relation_t).

  Definition gen_apply_fun (f: var × nnrc) (e2: nnrc) : nnrc :=
    let (x, e1) := f in
    NNRCLet x e2
           e1.

  Fixpoint gen_apply_fun_n (f: list var × nnrc) (eff: list (var × dlocalization)) : option nnrc :=
    let (form, e) := f in
    lift (List.fold_right
            (fun t k
               let '(x, (y, loc)) := t in
               NNRCLet x (NNRCVar y)
                      k)
            e)
         (zip form eff).

  Definition nnrc_of_mr_map (input: var) (mr_map: map_fun) : nnrc :=
    match mr_map with
    | MapDist (x, n)
      NNRCFor x (NNRCVar input) n
    | MapDistFlatten (x, n)
      let res_map :=
          NNRCFor x (NNRCVar input) n
      in
      NNRCUnop AFlatten res_map
    | MapScalar (x, n)
      NNRCFor x (NNRCVar input) n
    end.

  Definition nnrc_of_mr (m:mr) : option nnrc :=
    match (m.(mr_map), m.(mr_reduce)) with
    | (MapScalar (x, NNRCUnop AColl n), RedSingleton)
      Some (gen_apply_fun (x, n) (NNRCVar m.(mr_input)))
    | (_, RedSingleton)
      None
    | (map, RedId)
      Some (nnrc_of_mr_map (mr_input m) map)
    | (map, RedCollect red_fun)
      let map_expr := nnrc_of_mr_map (mr_input m) map in
      Some (gen_apply_fun red_fun map_expr)
    | (map, RedOp op)
      match op with
      | RedOpForeign frop
        let map_expr := nnrc_of_mr_map (mr_input m) map in
        lift (fun opNNRCUnop op map_expr) (foreign_to_reduce_op_to_unary_op op)
      end
    end.

  Fixpoint nnrc_of_mr_chain (outputs: list var) (l: list mr) (k: nnrc) : option nnrc :=
    match l with
    | nilSome k
    | mr :: l
      match (nnrc_of_mr mr, nnrc_of_mr_chain (mr_output mr :: outputs) l k) with
      | (Some n, Some k)
        Some (NNRCLet
                (mr_output mr)
                (if in_dec equiv_dec (mr_output mr) outputs then
                   NNRCBinop AUnion (NNRCVar (mr_output mr)) n
                 else n)
                k)
      | _None
      end
    end.

  Definition nnrc_of_nnrcmr (l: nnrcmr) : option nnrc :=
    let (last_fun, last_args) := mr_last l in
    let k := gen_apply_fun_n last_fun last_args in
    olift (nnrc_of_mr_chain nil (mr_chain l)) k.

End NNRCMRtoNNRC.