Adding Integro Differential Equations and Improving symbolic representation of geometry in PINNs
This summer I was selected for Google Summer of Code 2021 with NumFOCUS. My project is “Adding Integro Differential Equations and Improving symbolic representation of geometry in PINNs”. I’d thank Chris Rackauckas and Kirill Zubov for superb guidance throughout the course of the project.
The detailed implementation of the project can be found in the following series of blogs:
- Blog 1 : Adding Symbolic Integral
- Blog 2: Using the Numeric Integral and solving simple equations
- Blog 3:Multi Dimensional Integral and Integro Differential Equations
I started with the addition of the symbolic integral operator in the Symbolics.jl. The initial addition was naive and this was improved over the course of time, inorder to better suit the JuliaSymbolics system. The DomainSets.jl provides various domains that can be used in the integral. A major implementation in this was the “derivative of an integral” part. The inbuilt function for expanding derivatives, needed support for the derivative of an integral. Thus the Leibniz integral rule was added to this function. The detailed information about the usage can be found in this blog.
After the symbolic integral and some basic helper functions were added, we needed to numerically evaluate that integral. For this, the Quadrature.jl package was used. Thus, first the integral was converted into an inner representation of NeuralPDE and then, it was numerically evaluated. The “integral” is written as an expression, and then RuntimeGeneratedFunctions.jl is used to generate the function that would give the numeric value of the integral in runtime.
Finally this numeric integral was added to the PINNs solver and thus support for the Integro-differential equations was added. The next task was to add a support for multidimensional integral by making changes to the existing code and generalising it.
- Adding the Integro Differential Equations Support. #330
Other than the Integral in NeuralPDE.jl
- Add symbolic integral #240
- Change type of domain to variable and domain pairing. #330
- Writing dispatch for Num type for infimum and supremum of domains. #346
- Make x field of the integral redundant.#355
- Add units to symbolic integral #1219
- Fix for the get_unit on integral operator #1226
- Refactoring the get_unit function #1230
I loved the experience that GSoC provides. I have been a contributor to SciML and Julia for about 2 years now, and its a wonderful community! People here are great, and always up for helping. The different projects are vast, and yet interconnected. I plan on to keep contributing to NeuralPDE.jl and SciML, and stay active in the community.