diff --git a/lang/zh/gklearn/ged/methods/ged_method.py b/lang/zh/gklearn/ged/methods/ged_method.py
new file mode 100644
index 0000000..aecd16b
--- /dev/null
+++ b/lang/zh/gklearn/ged/methods/ged_method.py
@@ -0,0 +1,195 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Thu Jun 18 15:52:35 2020
+
+@author: ljia
+"""
+import numpy as np
+import time
+import networkx as nx
+
+
+class GEDMethod(object):
+
+
+ def __init__(self, ged_data):
+ self._initialized = False
+ self._ged_data = ged_data
+ self._options = None
+ self._lower_bound = 0
+ self._upper_bound = np.inf
+ self._node_map = [0, 0] # @todo
+ self._runtime = None
+ self._init_time = None
+
+
+ def init(self):
+ """Initializes the method with options specified by set_options().
+ """
+ start = time.time()
+ self._ged_init()
+ end = time.time()
+ self._init_time = end - start
+ self._initialized = True
+
+
+ def set_options(self, options):
+ """
+ /*!
+ * @brief Sets the options of the method.
+ * @param[in] options String of the form [--@, where @p option contains neither spaces nor single quotes,
+ * and @p arg contains neither spaces nor single quotes or is of the form '[--@ @] [...]',
+ * where both @p sub-option and @p sub-arg contain neither spaces nor single quotes.
+ */
+ """
+ self._ged_set_default_options()
+ for key, val in options.items():
+ if not self._ged_parse_option(key, val):
+ raise Exception('Invalid option "', key, '". Usage: options = "' + self._ged_valid_options_string() + '".') # @todo: not implemented.
+ self._initialized = False
+
+
+ def run(self, g_id, h_id):
+ """
+ /*!
+ * @brief Runs the method with options specified by set_options().
+ * @param[in] g_id ID of input graph.
+ * @param[in] h_id ID of input graph.
+ */
+ """
+ start = time.time()
+ result = self.run_as_util(self._ged_data._graphs[g_id], self._ged_data._graphs[h_id])
+ end = time.time()
+ self._lower_bound = result['lower_bound']
+ self._upper_bound = result['upper_bound']
+ if len(result['node_maps']) > 0:
+ self._node_map = result['node_maps'][0]
+ self._runtime = end - start
+
+
+ def run_as_util(self, g, h):
+ """
+ /*!
+ * @brief Runs the method with options specified by set_options().
+ * @param[in] g Input graph.
+ * @param[in] h Input graph.
+ * @param[out] result Result variable.
+ */
+ """
+ # Compute optimal solution and return if at least one of the two graphs is empty.
+ if nx.number_of_nodes(g) == 0 or nx.number_of_nodes(h) == 0:
+ print('This is not implemented.')
+ pass # @todo:
+
+ # Run the method.
+ return self._ged_run(g, h)
+
+
+ def get_upper_bound(self):
+ """
+ /*!
+ * @brief Returns an upper bound.
+ * @return Upper bound for graph edit distance provided by last call to run() or -1 if the method does not yield an upper bound.
+ */
+ """
+ return self._upper_bound
+
+
+ def get_lower_bound(self):
+ """
+ /*!
+ * @brief Returns a lower bound.
+ * @return Lower bound for graph edit distance provided by last call to run() or -1 if the method does not yield a lower bound.
+ */
+ """
+ return self._lower_bound
+
+
+ def get_runtime(self):
+ """
+ /*!
+ * @brief Returns the runtime.
+ * @return Runtime of last call to run() in seconds.
+ */
+ """
+ return self._runtime
+
+
+ def get_init_time(self):
+ """
+ /*!
+ * @brief Returns the initialization time.
+ * @return Runtime of last call to init() in seconds.
+ */
+ """
+ return self._init_time
+
+
+ def get_node_map(self):
+ """
+ /*!
+ * @brief Returns a graph matching.
+ * @return Constant reference to graph matching provided by last call to run() or to an empty matching if the method does not yield a matching.
+ */
+ """
+ return self._node_map
+
+
+ def _ged_init(self):
+ """
+ /*!
+ * @brief Initializes the method.
+ * @note Must be overridden by derived classes that require initialization.
+ */
+ """
+ pass
+
+
+ def _ged_parse_option(self, option, arg):
+ """
+ /*!
+ * @brief Parses one option.
+ * @param[in] option The name of the option.
+ * @param[in] arg The argument of the option.
+ * @return Boolean @p true if @p option is a valid option name for the method and @p false otherwise.
+ * @note Must be overridden by derived classes that have options.
+ */
+ """
+ return False
+
+
+ def _ged_run(self, g, h):
+ """
+ /*!
+ * @brief Runs the method with options specified by set_options().
+ * @param[in] g Input graph.
+ * @param[in] h Input graph.
+ * @param[out] result Result variable.
+ * @note Must be overridden by derived classes.
+ */
+ """
+ return {}
+
+
+
+ def _ged_valid_options_string(self):
+ """
+ /*!
+ * @brief Returns string of all valid options.
+ * @return String of the form [--@.
+ * @note Must be overridden by derived classes that have options.
+ */
+ """
+ return ''
+
+
+ def _ged_set_default_options(self):
+ """
+ /*!
+ * @brief Sets all options to default values.
+ * @note Must be overridden by derived classes that have options.
+ */
+ """
+ pass
+
\ No newline at end of file