Hey! This is the fourth blog-post in my series of GSoC experience. That means I successfully passed first evaluation. First month was just great for me! I got to learn so many new things. Initially, it felt quite hard to get adjusted to these things. But, through constant searching and experimentation things turned out to be quite simple. And then I got this email on June, 28th. I was overjoyed and unable to contain my excitement for upcoming journey.

Fifth week
Now, that the basic methods were implemented for fallback_mode and it worked for any NumPy method of the form res=numpy.func(*args, **kwargs), my next goal was to support fallback of methods of the form res=x.func(*args, **kwargs) where x is of type ndarray.
So, I implemented a wrapper fallback.ndarray class around cupy.ndarray which would fallback to numpy.ndarray when associated method is not yet implemented in CuPy. In this case, I think the challenging task was to wrap magic methods(methods starting and ending with '__') of cupy.ndarray as Python skip lookup of these magic methods through __getattr__. So, I had to proxy all magic methods of cupy.ndarray into fallback.ndarray. This will be automatically done when user imports cupyx.fallback_mode.
Simultaneously, I was working on creating a notification mechanism for fallback_mode similar to NumPy’s floating point error. I implemented seterr, geterr, errstate. It includes support for following 6 modes to dispatch notification:
warn: Print warning usingwarningsmodule.print: Prints warning to stdout.log: Record message in log object specified byseterrcall.ignore: No action is taken.raise: Raise anAttributeError.call: Call function which was specified byseterrcall.
Sixth week
Until this week, fallback.ndarray was almost done. Notification support was done for all modes but call and log. Then, I had to implement seterrcall and geterrcall and integrate those with errstate. Other than that, this week was all about fixing comments and creating tests. I got meyself familiar with parameterized testing. It’s really good!
Also, there was this task of supporting isinstance(x, fallback.ndarray). As fallback.ndarray was a wrapper, so I was not suppossed to expose it. I initially felt this was going to be hard one, but guess what! Another magic method to the rescue! Python has __instancecheck__ method to override isinstance. Python is really cool and gives so much freedom to the users. I’m loving Python more than ever before!
Summary
Following objects were implemented for fallback.ndarray:
- class
ndarray - decorator
make_method - method
_create_magic_methods
Related work can be found in PR #2272
Following objects were implemented for Notifications:
- method
seterr - method
geterr - method
seterrcall - method
geterrcall - context-manager
errstate - method
dispatch_notification
Related work can be found in PR #2279
Some other bug-fixes/improvements were also done:
- method
_RecursiveAttr.__doc__ - method
_RecursiveAttr.__instancecheck__ - fix error in code of type
dtype=numpy.int64
Future work
Future work will include adding support for in-place operations in fallback_mode and other improvements or bug fixes.