diff --git a/.travis.yml b/.travis.yml
index f10b836..bc27d17 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,10 +2,7 @@
         virtualenv:
             system_site_packages: false
         env:
-            - DISTRIB="conda" PYTHON_VERSION="3.4" COVERAGE="true"
             - DISTRIB="conda" PYTHON_VERSION="3.5" COVERAGE="true"
-            - DISTRIB="conda" PYTHON_VERSION="3.6" COVERAGE="true"
-            - DISTRIB="conda" PYTHON_VERSION="3.7" COVERAGE="true"
 
         before_install:
             - uname -a
diff --git a/pgmpy/base/DAG.py b/pgmpy/base/DAG.py
index f2ade04..50cdb9f 100644
--- a/pgmpy/base/DAG.py
+++ b/pgmpy/base/DAG.py
@@ -385,20 +385,15 @@ class DAG(nx.DiGraph):
     def is_active_trail(self, start, end, observed=None):
         """
         Returns True if there is any active trail between start and end node
-
         Parameters
         ----------
         start : Graph Node
-
         end : Graph Node
-
         observed : List of nodes (optional)
             If given the active trail would be computed assuming these nodes to be observed.
-
         additional_observed : List of nodes (optional)
             If given the active trail would be computed assuming these nodes to be observed along with
             the nodes marked as observed in the model.
-
         Examples
         --------
         >>> from pgmpy.base import DAG
@@ -415,3 +410,36 @@ class DAG(nx.DiGraph):
             return True
         else:
             return False
+
+    def get_markov_blanket(self, node):
+        """
+        Returns a markov blanket for a random variable. In the case
+        of Bayesian Networks, the markov blanket is the set of
+        node's parents, its children and its children's other parents.
+
+        Returns
+        -------
+        list(blanket_nodes): List of nodes contained in Markov Blanket
+
+        Parameters
+        ----------
+        node: string, int or any hashable python object.
+              The node whose markov blanket would be returned.
+
+        Examples
+        --------
+        >>> from pgmpy.base import DAG
+        >>> from pgmpy.factors.discrete import TabularCPD
+        >>> G = DAG([('x', 'y'), ('z', 'y'), ('y', 'w'), ('y', 'v'), ('u', 'w'),
+                               ('s', 'v'), ('w', 't'), ('w', 'm'), ('v', 'n'), ('v', 'q')])
+        >>> G.get_markov_blanket('y')
+        ['s', 'w', 'x', 'u', 'z', 'v']
+        """
+        children = self.get_children(node)
+        parents = self.get_parents(node)
+        blanket_nodes = children + parents
+        for child_node in children:
+            blanket_nodes.extend(self.get_parents(child_node))
+        blanket_nodes = set(blanket_nodes)
+        blanket_nodes.remove(node)
+        return list(blanket_nodes)
diff --git a/pgmpy/models/BayesianModel.py b/pgmpy/models/BayesianModel.py
index a7a7887..22a3e44 100644
--- a/pgmpy/models/BayesianModel.py
+++ b/pgmpy/models/BayesianModel.py
@@ -938,36 +938,3 @@ class BayesianModel(DAG):
         if self.cpds:
             model_copy.add_cpds(*[cpd.copy() for cpd in self.cpds])
         return model_copy
-
-    def get_markov_blanket(self, node):
-        """                                                       
-        Returns a markov blanket for a random variable. In the case
-        of Bayesian Networks, the markov blanket is the set of 
-        node's parents, its children and its children's other parents. 
-        
-        Returns
-        -------
-        list(blanket_nodes): List of nodes contained in Markov Blanket
-
-        Parameters
-        ----------
-        node: string, int or any hashable python object.
-              The node whose markov blanket would be returned.
-                                                                  
-        Examples                                                  
-        --------                                                  
-        >>> from pgmpy.models import BayesianModel
-        >>> from pgmpy.factors.discrete import TabularCPD
-        >>> G = BayesianModel([('x', 'y'), ('z', 'y'), ('y', 'w'), ('y', 'v'), ('u', 'w'), 
-                               ('s', 'v'), ('w', 't'), ('w', 'm'), ('v', 'n'), ('v', 'q')])
-        >>> bayes_model.get_markov_blanket('y') 
-        ['s', 'w', 'x', 'u', 'z', 'v']
-        """
-        children = self.get_children(node)
-        parents = self.get_parents(node)
-        blanket_nodes = children + parents
-        for child_node in children:
-            blanket_nodes.extend(self.get_parents(child_node))
-        blanket_nodes = set(blanket_nodes)
-        blanket_nodes.remove(node)
-        return list(blanket_nodes)

Move `BayesianModel.get_markov_blanket` method
diff --git a/pgmpy/tests/test_models/test_BayesianModel.py b/pgmpy/tests/test_models/test_BayesianModel.py
index 2c7ecf0..be8d9c4 100644
--- a/pgmpy/tests/test_models/test_BayesianModel.py
+++ b/pgmpy/tests/test_models/test_BayesianModel.py
@@ -6,6 +6,7 @@ import numpy as np
 import numpy.testing as np_test
 
 from pgmpy.models import BayesianModel, MarkovModel
+from pgmpy.base import DAG
 import pgmpy.tests.help_functions as hf
 from pgmpy.factors.discrete import TabularCPD, JointProbabilityDistribution, DiscreteFactor
 from pgmpy.independencies import Independencies
@@ -177,7 +178,7 @@ class TestBayesianModelMethods(unittest.TestCase):
         self.assertRaises(TypeError, self.G1.is_imap, fac)
 
     def test_markov_blanet(self):
-        G = BayesianModel([('x', 'y'), ('z', 'y'), ('y', 'w'), ('y', 'v'), ('u', 'w'),
+        G = DAG([('x', 'y'), ('z', 'y'), ('y', 'w'), ('y', 'v'), ('u', 'w'),
                            ('s', 'v'), ('w', 't'), ('w', 'm'), ('v', 'n'), ('v', 'q')])
         self.assertEqual(set(G.get_markov_blanket('y')), set(['s', 'w', 'x', 'u', 'z', 'v']))
 

pip install -e .
parse_log_pytest
requirements.txt
nose pytest
apt-get update apt-get install -y build-essential
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
certifi==2021.5.30
decorator==4.4.2
importlib-metadata==4.8.3
iniconfig==1.1.1
networkx==2.5.1
nose==1.3.7
numpy==1.19.5
packaging==21.3
pandas==1.1.5
-e git+https://github.com/top-tier-ci-coders/pgmpy.git@afb4fc1bb1fd9b3ee6e926fe200377015195a9f9#egg=pgmpy
pluggy==1.0.0
py==1.11.0
pyparsing==3.1.4
pytest==7.0.1
python-dateutil==2.9.0.post0
pytz==2025.2
scipy==1.5.4
six==1.17.0
tomli==1.2.3
typing_extensions==4.1.1
wrapt==1.16.0
zipp==3.6.0

name: pgmpy
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - decorator==4.4.2
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - networkx==2.5.1
      - nose==1.3.7
      - numpy==1.19.5
      - packaging==21.3
      - pandas==1.1.5
      - pluggy==1.0.0
      - py==1.11.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - scipy==1.5.4
      - six==1.17.0
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - wrapt==1.16.0
      - zipp==3.6.0
prefix: /opt/conda/envs/pgmpy

pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelMethods::test_markov_blanet
pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelFitPredict::test_bayesian_fit pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelFitPredict::test_connected_predict pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelFitPredict::test_connected_predict_probability pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelFitPredict::test_disconnected_fit pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelFitPredict::test_fit_missing_data pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelFitPredict::test_predict pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelFitPredict::test_predict_probability_errors
pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_add_edge_nonstring pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_add_edge_result_cycle pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_add_edge_selfloop pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_add_edge_string pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_add_edges_from_nonstring pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_add_edges_from_result_cycle pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_add_edges_from_self_loop pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_add_edges_from_string pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_add_node_nonstring pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_add_node_string pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_add_nodes_from_non_string pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_add_nodes_from_string pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_class_init_with_data_nonstring pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_class_init_with_data_string pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_class_init_without_data pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_update_node_parents pgmpy/tests/test_models/test_BayesianModel.py::TestBaseModelCreation::test_update_node_parents_bm_constructor pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelMethods::test_copy pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelMethods::test_get_ancestors_of_failure pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelMethods::test_get_ancestors_of_success pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelMethods::test_get_cardinality pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelMethods::test_get_cardinality_with_node pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelMethods::test_get_immoralities pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelMethods::test_get_independencies pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelMethods::test_is_iequivalent pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelMethods::test_is_imap pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelMethods::test_local_independencies pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelMethods::test_moral_graph pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelMethods::test_moral_graph_with_edge_present_over_parents pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelMethods::test_remove_node pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelMethods::test_remove_nodes_from pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelCPD::test_active_trail_nodes pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelCPD::test_active_trail_nodes_args pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelCPD::test_add_multiple_cpds pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelCPD::test_add_single_cpd pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelCPD::test_check_model pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelCPD::test_check_model1 pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelCPD::test_check_model2 pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelCPD::test_get_cpds pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelCPD::test_get_cpds1 pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelCPD::test_is_active_trail pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelCPD::test_is_active_trail_args pgmpy/tests/test_models/test_BayesianModel.py::TestBayesianModelCPD::test_is_active_trail_triplets pgmpy/tests/test_models/test_BayesianModel.py::TestDAGCPDOperations::test_add_multiple_cpds pgmpy/tests/test_models/test_BayesianModel.py::TestDAGCPDOperations::test_add_single_cpd pgmpy/tests/test_models/test_BayesianModel.py::TestDAGCPDOperations::test_get_values_for_node pgmpy/tests/test_models/test_BayesianModel.py::TestDAGCPDOperations::test_get_values_raises_error pgmpy/tests/test_models/test_BayesianModel.py::TestDAGCPDOperations::test_remove_multiple_cpds pgmpy/tests/test_models/test_BayesianModel.py::TestDAGCPDOperations::test_remove_multiple_cpds_string pgmpy/tests/test_models/test_BayesianModel.py::TestDAGCPDOperations::test_remove_single_cpd pgmpy/tests/test_models/test_BayesianModel.py::TestDAGCPDOperations::test_remove_single_cpd_string
pgmpy/models/BayesianModel.py .travis.yml pgmpy/base/DAG.py
pgmpy/models/BayesianModel.py .travis.yml pgmpy/base/DAG.py