On 01/04/2015 12:32, "Sandeep Murthy" <s.mur...@mykolab.com> wrote:
>Hi > >This could be useful for optimising sorting and search, since GAP is very >slow. > >Can it deal with lists of GAP objects, like groups and tuples? At the moment no, it only deals with objects which have an "obvious" C++ version. One could write a C++ wrapper for these types, but if it simply called back to the methods on the original GAP objects, it wouldn't particularlly be faster. This will get much easier in HPC-GAP, as by design HPC-GAP makes it much easier to have GAP and C/C++ objects interact, due to better memory manager. > >Sandeep Murthy >s.mur...@mykolab.com > >> On 1 Apr 2015, at 12:20, Christopher Jefferson <ca...@st-andrews.ac.uk> >>wrote: >> >> Ever wish you could just write C and C++ code in GAP? Well now you can, >> with the gapcpp package from: https://github.com/ChrisJefferson/gapcpp >> >> After running './configure' in the packages directory and loading it, >>you >> will find one method, 'CompileMethod', which accepts C++ (or C) code, >>the >> name of your function and it's number of arguments. The function is then >> automatically linked into GAP, and GAP types turned into C++ types (and >> vice versa). >> >> Here's an easy example: >> >> gap> fun := CompileMethod("int f(int X) { return X; }", "f", 1);; >> gap> fun(3); >> 3 >> >> That's fairly boring however. Let's consider something more interesting! >> >> Perhaps we want to sort a list of integers by their last digit: >> >> gap> SortBy([1..1000000], x -> x mod 10);; >> gap> time; >> 548 >> >> Hmm.. Lets give that 'mod' function some C++ power! >> >> gap> m := CompileMethod("int f(int X) { return X % 10; }", "f", 1);; >> gap> SortBy([1..1000000], m);; >> gap> time >> 487 >> >> Hmm, a little speedup, but not as much as we would like. Let's push the >> whole thing into C++, using new 'triple quotes' to make the code easier >> to write (in the master branch of GAP, not package specific!) >> >> gap> x := CompileMethod(""" >> bool comp(int i, int j) >> { return i%10 < j%10; } >> std::vector<int> sb(std::vector<int> i) >> { std::sort(i.begin(), i.end(),comp); return i; }""", "sb", 1); >> gap> x([1..1000000]);; >> gap> time; >> 48 >> >> Wow, 10x speedup! >> >> Of course, C++ lets us do new things. Perhaps we really wish we had a >> stable sort? No problem! >> >> gap> x := CompileMethod(""" >> bool comp(int i, int j) >> { return i%10 < j%10; } >> std::vector<int> sb(std::vector<int> i) >> { std::stable_sort(i.begin(), i.end(),comp); return i; }""", "sb", 1); >> gap> x([1..1000000]);; >> gap> time; >> 124 >> >> A little slower, but with the bonus of being stable! >> >> Let's try some more things: >> >> gap> PartialSums([1..50000]);; >> gap> time; >> 26021 >> >> gap> x := CompileMethod(""" >> #include <numeric> >> std::vector<int> sums(std::vector<int> v) >> { >> std::vector<int> out(v.size()); >> // r means 'reverse', we do this to agree with GAP's order >> std::partial_sum(v.rbegin(), v.rend(), out.rbegin()); >> return out; >> }""", "sums", 1);; >> gap> PartialSums([1..50000]);; >> gap> time; >> 1 >> >> The following C++ types are currently supported (recursively). More >>types >> can be added on request! >> >> std::vector >> std::list >> std::deque >> std::pair >> std::string >> int >> Bool >> vec1 (a custom vector type which is 1-indexed, for each GAP<->C++ >> integration) >> >> optional (a way of marking missing values, so std::vector<optional<int> >>> >> supports lists with missing values, unlike std::vector<int>) >> >> If you understand GAP, You can also use Obj and all the normal GAP >>method >> to access objects. There is also initial support for gap records (see >>the >> tests for examples). >> >> >> I am interested in any requests for improvements, or usage of this >>package >> (or wished usages of this package). >> >> >> Chris >> >> >> _______________________________________________ >> Forum mailing list >> Forum@mail.gap-system.org >> http://mail.gap-system.org/mailman/listinfo/forum > _______________________________________________ Forum mailing list Forum@mail.gap-system.org http://mail.gap-system.org/mailman/listinfo/forum