Datalog Intermediate Representation Example based on the Destrieux Atlas

Uploading the Destrieux left sulci into NeuroLang and executing some simple queries.

import warnings

warnings.filterwarnings("ignore")

import nilearn
import numpy as np
from matplotlib import pyplot as plt
from nilearn import plotting

import nibabel as nib
from neurolang.datalog.chase import Chase
from neurolang import expression_walker as ew
from neurolang import expressions, region_solver, regions
from neurolang.datalog import DatalogProgram
from neurolang.datalog.expressions import Fact, Implication, TranslateToLogic

Set up IR shortcuts

C_ = expressions.Constant
S_ = expressions.Symbol
Imp_ = Implication
Fact_ = Fact
Eb_ = expressions.ExpressionBlock

Load the Destrieux example from nilearn as a fact list

atlas_destrieux = nilearn.datasets.fetch_atlas_destrieux_2009()

image = nib.load(atlas_destrieux['maps'])
image_data = image.get_data()

Load the regions into Voxel-style regions

region_dict = {}
for label, name in atlas_destrieux['labels']:
    if label == 0:
        continue

    voxels = np.transpose((image_data == label).nonzero())
    if voxels.shape[0] == 0:
        continue

    r = regions.ExplicitVBR(
            voxels,
            image.affine, image_dim=image.shape
    )
    region_dict[name.decode('utf8')] = r

plotting.plot_roi(region_dict['L S_temporal_sup'].spatial_image())
plot load destrieux datalog ir
<nilearn.plotting.displays.OrthoSlicer object at 0x7f508cabd190>

Make the fact list

destrieux = S_('Destrieux')
destrieux_facts = [
    Fact_(destrieux(
        C_(name),
        C_(region)
    ))
    for name, region in region_dict.items()
]

Set the datalog interpreter with Region-managing builtins and adding lh, lr

class Datalog(
    region_solver.RegionSolver,
    TranslateToLogic,
    DatalogProgram,
    ew.ExpressionBasicEvaluator
):
    def function_lh(self, x: str) -> bool:
        return x.startswith('L ')

    def function_rh(self, x: str) -> bool:
        return x.startswith('R ')

Construct a query

superior_sts_l(name, r) :- destrieux(‘L S_temporal_sup’, superior_sts_l),

anatomical_superior_of(r, superior_sts_l), lh(name), destrieux(name, r)

superior_sts_l = S_('region_l_sts')
r = S_('r')
name = S_('name_')

r1 = Imp_(
    S_('superior_sts_l')(name, r),
    destrieux(C_('L S_temporal_sup'), superior_sts_l) &
    S_('anatomical_superior_of')(r, superior_sts_l) &
    S_('lh')(name) &
    destrieux(name, r)
)

print(r1)

datalog_program = Eb_(
    destrieux_facts + [
        r1,
    ]
)
Implication{λ{S{superior_sts_l: Unknown}}(S{name_: Unknown}, S{r: Unknown}) ← λ{C{and_: typing.Callable[[neurolang.type_system.Unknown, neurolang.type_system.Unknown], neurolang.type_system.Unknown]}}(λ{C{and_: typing.Callable[[neurolang.type_system.Unknown, neurolang.type_system.Unknown], neurolang.type_system.Unknown]}}(λ{C{and_: typing.Callable[[neurolang.type_system.Unknown, neurolang.type_system.Unknown], neurolang.type_system.Unknown]}}(λ{S{Destrieux: Unknown}}(C{'L S_temporal_sup': str}, S{region_l_sts: Unknown}), λ{S{anatomical_superior_of: Unknown}}(S{r: Unknown}, S{region_l_sts: Unknown})), λ{S{lh: Unknown}}(S{name_: Unknown})), λ{S{Destrieux: Unknown}}(S{name_: Unknown}, S{r: Unknown}))}

Interpreting and running the query

dl = Datalog()
dl.walk(datalog_program)
solution = Chase(dl).build_chase_solution()

Extracting the results from the intermediate representation to a python set and plotting the first element of the result

rsbv = ew.ReplaceExpressionsByValues({})
result = rsbv.walk(solution['superior_sts_l'])

for name, region in result.unwrapped_iter():
    plt.figure()
    plotting.plot_roi(region.spatial_image(), title=name)
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir
  • plot load destrieux datalog ir

Total running time of the script: (1 minutes 11.245 seconds)

Gallery generated by Sphinx-Gallery