Source code for examples.migrations.0004_bn_example

# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2017-09-02 20:29
from __future__ import unicode_literals
import os

from graphviz import Digraph

from django.db import migrations
from django.core.files.base import ContentFile
from django.contrib.contenttypes.management import create_contenttypes

from bayesian_networks.bayespy_constants import (
    DIST_GAUSSIAN_ARD, DIST_GAMMA)
from bayesian_networks.models import BayesianNetworkNode as BNN


def generate_bn_image(bn):
    """
    Auxiliary function for generating the image of a BN, as model
    methods are not available in migrations.
    """
    dot = Digraph(comment=bn.name)
    nodes = bn.nodes.all()
    for node in nodes:
        dot.node(name=node.name, label=node.name)
    edges = bn.edges.all()
    for edge in edges:
        dot.edge(str(edge.parent.name),
                 str(edge.child.name))
    dot.format = "png"
    contentfile = ContentFile(dot.pipe())
    image_name = "{0}/{1}".format(
        os.path.join("django_ai",
                     "bayesian_networks"),
        bn.name + ".png")
    bn.image.save(image_name, contentfile)
    bn.save()


[docs]def create_bn1_example(apps, schema_editor): """ Create a Bayesian Network from the scratch. """ # Content Types Hackery for ensuring that it exists app_config = apps.get_app_config('examples') app_config.models_module = app_config.models_module or True create_contenttypes(app_config) ## BayesianNetwork = apps.get_model("bayesian_networks", "BayesianNetwork") BayesianNetworkEdge = apps.get_model("bayesian_networks", "BayesianNetworkEdge") BayesianNetworkNode = apps.get_model("bayesian_networks", "BayesianNetworkNode") BayesianNetworkNodeColumn = apps.get_model("bayesian_networks", "BayesianNetworkNodeColumn") ContentType = apps.get_model("contenttypes", "ContentType") bn1 = BayesianNetwork(name="BN1 (Example)") bn1.save() mu = BayesianNetworkNode( network=bn1, name="mu", node_type=BNN.NODE_TYPE_STOCHASTIC, is_observable=False, distribution=DIST_GAUSSIAN_ARD, distribution_params="0, 1e-6", graph_interval="-10, 20" ) tau = BayesianNetworkNode( network=bn1, name="tau", node_type=BNN.NODE_TYPE_STOCHASTIC, is_observable=False, distribution=DIST_GAMMA, distribution_params="1e-6, 1e-6", graph_interval="1e-6, 0.1" ) ui_avg1 = BayesianNetworkNode( network=bn1, name="userinfo.avg1", node_type=BNN.NODE_TYPE_STOCHASTIC, is_observable=True, distribution=DIST_GAUSSIAN_ARD, distribution_params="mu, tau", ) mu.save() tau.save() ui_avg1.save() # ui_avg1_col = BayesianNetworkNodeColumn( node=ui_avg1, ref_model=ContentType.objects.get(model="userinfo", app_label="examples"), ref_column="avg1" ) ui_avg1_col.save() # mu_to_ui_avg1 = BayesianNetworkEdge( network=bn1, description="mu -> userinfo.avg1", parent=mu, child=ui_avg1 ) tau_to_ui_avg1 = BayesianNetworkEdge( network=bn1, description="tau -> userinfo.avg1", parent=tau, child=ui_avg1 ) mu_to_ui_avg1.save() tau_to_ui_avg1.save() # Generate the image generate_bn_image(bn1)
def delete_bn1_example(apps, schema_editor): BayesianNetwork = apps.get_model("bayesian_networks", "BayesianNetwork") BayesianNetwork.objects.get(name="BN1 (Example)").delete() class Migration(migrations.Migration): dependencies = [ ('examples', '0003_populate_userinfo'), ] operations = [ migrations.RunPython(create_bn1_example, delete_bn1_example), ]