public int Visit(Gp gp)
            {
                return(Compile(gp, () =>
                {
                    int[] indices = new int[gp.Args.Length];
                    Compiled.InputEdge[] inputs = new Compiled.InputEdge[indices.Length];
                    for (int i = 0; i < indices.Length; i++)
                    {
                        indices[i] = gp.Args[i].Accept(this);
                        inputs[i] = new Compiled.InputEdge {
                            Index = indices[i]
                        };
                    }

                    var element = new Compiled.Gp {
                        Terms = indices,
                        Inputs = inputs,
                        Gpr = gp.Gpr,
                        dc = gp.DivCount,
                    };
                    return element;
                }));
            }
            public int Visit(Sum sum)
            {
                return(Compile(sum, () =>
                {
                    //replacement for linq code -- HS:
                    int[] indices = new int[sum.Terms.Count];
                    Compiled.InputEdge[] inputs = new Compiled.InputEdge[indices.Length];
                    for (int i = 0; i < indices.Length; i++)
                    {
                        indices[i] = sum.Terms[i].Accept(this);
                        inputs[i] = new Compiled.InputEdge {
                            Index = indices[i]
                        };
                    }


                    var element = new Compiled.Sum {
                        Terms = indices,
                        Inputs = inputs,
                    };
                    return element;
                }));
            }