Rubi (Rule-based integrator) is an open source program written in Mathematica's powerful pattern-matching language. The recently released version 4.15 of Rubi at http://www.apmaths.uwo.ca/~arich/ requires Mathematica 7 or better to run. Among other improvements, Rubi 4.15 enhances the functionality of its integrate command as follows:
The last element of the list of statistics displayed by Rubi's Int[expn, var, Stats] command is the number of distinct rules required to integrate expn divided by the size of expn. This rule-to-size ratio provides a normalized measure of the amount of mathematical knowledge Rubi uses to integrate expressions. In other words, this ratio can be used as a metric showing the difficulty of solving indefinite integration problems. For example, the hardest problem in Rubi's 70,000+ test suite is integrating (a+b ArcTanh[c/x^2])^2 which has a rule-to-size ratio of 2.5.
On Rubi's website are the terms of a challenge, for which there is a substantial prize, for the user who finds the hardest problem Rubi can integrate.
Since your package came up in several discussions so far and most notably in this highly discussed post on StackExchange, I'd like to leave some words. There are two things I appreciate in your package and your work in general
Only through your work, we have an extensive database of integration rules that can be used virtually in any system, although we currently have it just in Mathematica code. I'm not sure if you are aware of this project, but Cory Walker is working on an open-source CAS that uses the same language as Mathematica which is called Expreduce. So while Cory only (!) had to implement the core system of replacement rules, he can now use Rubi's set of rules for integration.
I have some suggestions for Rubi to make it more accessible. After downloading, I looked at your code and these are the points jumped into my eye
If any of this is of interest, I encourage you to visit our Mathematica StackExchange chat-room and say hi. I'm sure that many would be delighted to see you around and we can discuss things; especially if you are thinking about making Rubi more visible. You can always ping me there by starting your message with @halirutan and I will be notified.
Finally, here are some small comments on your code. As I said earlier, there is currently an error when you try to load your package, and the reason is this portion:
NotebookDirectory uses the directory of the current notebook and this fails as soon as your notebook is (a) not saved and (b) not in the directory of your package. The fix is easy when you use this undocumented function inside your Rubi.m instead:
Because what you actually want is the directory-name where your Rubi.m lives. Another thing that looks suspicious to me is in Integration utility functions.m in line 289
Integration utility functions.m
LogQ[u] || InverseTrigQ[u] && Length[u]<=1 || InverseHyperbolicQ[u] || Head[u]===Mods || Head[u]===PolyLog
I might be wrong, but I cannot find any definition of Mods inside your code and it seems you wanted to write Mod. As a last minor point, inside the same file, you are defining many little helper functions like this
(* If u is a power, SumQ[u] returns True; else it returns False. *)
PowerQ[u_] := Head[u]===Power
Besides that the comment seems the wrong one, why not turn all these comments into a ::usage message? It is good practice to have a usage message and there is no harm even to define them for internal functions. Additionally, it lets users quickly look-up what a function does when you used them