Java Settings, Logging and Debugging

PyNeuraLogic, at its core, utilizes procedures (such as grounding) running on a Java Virtual Machine (JVM). JVM itself offers plentiful options to set, such as memory limitations, garbage collectors settings, and more.

This section will go through interfaces that allow you to pass your own JVM settings. We will also look into JVM logging and JVM debugging.

JVM Settings

Important

Customizing JVM settings and JVM path is applicable only before a JVM is started. If you want to do some customizations, do them before working with PyNeuraLogic (building model/building samples, etc.)

By default, PyNeuraLogic uses JVM found on your PATH. If you want to use a different JVM, you can do that by calling the neuralogic.set_jvm_path function, such as:

import neuralogic

neuralogic.set_jvm_path("/some/path/my_jvm/")

You can also make some adjustments to JVM settings via the neuralogic.set_jvm_options function. By default, one option is passed into the JVM - "-Xms1g", which sets the minimum amount of heap memory size to 1 GB. The maximum amount of the heap memory size can be set via the neuralogic.set_max_memory_size function.

This function overrides already set options, so if you want to keep defaults or previously set options,you will have to specify them again. For example, you can inspect the garbage collector with customizing settings such as:

import neuralogic

neuralogic.set_jvm_options(["-Xms1g", "-Xmx64g", "-XX:+PrintGCDetails"])

Java Logging

Looking into the Java logs can be valuable practice to get better insight into what is going on in the background. It offers a lot of information about all steps, such as the grounding process. This info is also practical when asking for help in discussion/issues.

You can add a logging handler anytime you want with any level by calling the add_handler function. The first argument can be any object that implements a write(message: str) method (e.g., file handlers, sys.stdout, etc.).

import sys
from neuralogic.logging import add_handler, Formatter, Level

add_handler(sys.stdout, Level.FINE, Formatter.COLOR)

If you decide you no longer want to subscribe to loggers, you can remove all logging handlers by calling the clear_handlers function.

from neuralogic.logging import clear_handlers

clear_handlers()

Java Debugging

Important

To run PyNeuraLogic in debug mode, you have to run the debug mode before a JVM is started - therefore, run the debug mode before working with PyNeuraLogic (building model/building samples, etc.)

There is a prepared interface to run the JVM in the debug mode, which allows to attach a remote debugger on the JVM and then use breakpoints on the NeuraLogic project, as usual. You can enable the debug mode by calling the neuralogic.initialize function with the argument debug_mode=True.

import neuralogic

neuralogic.initialize(debug_mode=True)
>>> Listening for transport dt_socket at address: 12999

Once you get the message above, the execution of the python program will wait (by default) for you to connect your remote debugger to the port (by default, 12999). Via other arguments of the initialize function, it is possible to specify further things like debugging port, etc.

Once the remote debugger is attached, the execution of the Python program will continue until the execution hits a breakpoint.