anchor.diff:                ruleengine.compilePatternToRule <@ cast_d @>; 
                 ruleengine.compilePatternToRule <@ vget_d @>;
                 ruleengine.compilePatternToRule <@ mget_d @>;
  +              ruleengine.compilePatternToRule <@ m3get_d @>;
                 ruleengine.compilePatternToRule <@ vlength_d @>;
                 ruleengine.compilePatternToRule <@ mlength_d @>;
  -              ruleengine.compilePatternToRule <@ vbuild_d @>;
  -              ruleengine.compilePatternToRule <@ mbuild_d @>;
  +              ruleengine.compilePatternToRule <@ m3length_d @>;
  +              build_d;
  +              //ruleengine.compilePatternToRule <@ vbuild_d @>;
  +              //ruleengine.compilePatternToRule <@ mbuild_d @>;
                 //ruleengine.compilePatternToRule <@ sfold_d @>;
                 fold_d;
                 const_d;
  
positive.code: open FSharp.Quotations
  open phase_based_optimizer
  open types
  
  let symdiff (exp: Expr): Expr = 
    exp
  
negative.code:     //printfn "symdiff9: %A" (symdiff <@ fun (x: double) (y: Vector) (z: Vector) -> diff (foldOnRange (fun s i -> s * s) 0.0 (Card 0) (Card 10)) x @>)
      //printfn "symdiff10: %A" (symdiff <@ fun (x: double) (y: Vector) (z: Vector) -> diff (foldOnRange (fun s i -> build (length s) (fun i -> s.[i])) z (Card 0) (Card 10)) x @>)
      compiler.compileModule "linalg" [] false false
      compiler.compileModule "usecases_gmm" ["linalg"] false false
      let vectorAdd3 = compiler.getMethodExpr "linalg" "vectorAdd3" |> fusion_optimize |> transformDiff |> fusion_optimize |> fscodegen.fscodegenTopLevel
      printfn "symdiff vadd3: %A" vectorAdd3
      let dot_prod = compiler.getMethodExpr "linalg" "dot_prod" |> fusion_optimize |> transformDiff |> fusion_optimize |> fscodegen.fspreprocess |> trans [rules_old.letCSE] |> fscodegen.fscodegenTopLevel
      printfn "symdiff vdot: %A" dot_prod
      let gmm = 
        compiler.getMethodExpr "usecases_gmm" "gmm_objective" 
          |> fusion_optimize 
  