# Path: philharmonic/utils.py
# def deprecated(func):
#     """This is a decorator which can be used to mark functions
#     as deprecated. It will result in a warning being emmitted
#     when the function is used."""
#     def newFunc(*args, **kwargs):
#         warnings.warn("Call to deprecated function %s." % func.__name__,
#                       category=DeprecationWarning)
#         return func(*args, **kwargs)
#     newFunc.__name__ = func.__name__
#     newFunc.__doc__ = func.__doc__
#     newFunc.__dict__.update(func.__dict__)
#     return newFunc
# 
# class CommonEqualityMixin(object):
# 
#     def __eq__(self, other):
#         return (isinstance(other, self.__class__)
#             and self.__dict__ == other.__dict__)
# 
#     def __ne__(self, other):
#         return not self.__eq__(other)
# 
#     def __hash__(self):
#         """Override the default hash behavior
#         (that returns the id or the object)"""
#         return hash(tuple(sorted(self.__dict__.items())))


import copy
import itertools
import pandas as pd
from philharmonic.utils import deprecated, CommonEqualityMixin
from . import visualiser
        return self._current.vms

    def get_servers(self):
        return self._servers

    def get_current(self):
        """Get the current state."""
        return self._current

    vms = property(get_vms, doc="get the VMs in the current state")
    servers = property(get_servers, doc="get the servers (always the same)")

    def apply(self, action, inplace=False):
        """Apply an Action on the current state. The original current state
        is left untouched (the action is performed on a copy),
        unless inplace is True.

        """
        self._current = self._current.transition(action, inplace=inplace)
        return self._current

    def apply_real(self, action, inplace=False):
        """Apply an Action on the real state (reflecting the actual physical
        state) and reset the virtual state.

        """
        self._real = self._real.transition(action, inplace=inplace)
        self.reset_to_real()
        return self._real


# Path: philharmonic/utils.py
# def deprecated(func):
#     """This is a decorator which can be used to mark functions
#     as deprecated. It will result in a warning being emmitted
#     when the function is used."""
#     def newFunc(*args, **kwargs):
#         warnings.warn("Call to deprecated function %s." % func.__name__,
#                       category=DeprecationWarning)
#         return func(*args, **kwargs)
#     newFunc.__name__ = func.__name__
#     newFunc.__doc__ = func.__doc__
#     newFunc.__dict__.update(func.__dict__)
#     return newFunc
# 
# class CommonEqualityMixin(object):
# 
#     def __eq__(self, other):
#         return (isinstance(other, self.__class__)
#             and self.__dict__ == other.__dict__)
# 
#     def __ne__(self, other):
#         return not self.__eq__(other)
# 
#     def __hash__(self):
#         """Override the default hash behavior
#         (that returns the id or the object)"""
#         return hash(tuple(sorted(self.__dict__.items())))


# Path: philharmonic/cloud/model.py
import copy
import itertools
import pandas as pd
from philharmonic.utils import deprecated, CommonEqualityMixin
from . import visualiser

        return self._current.vms

    def get_servers(self):
        return self._servers

    def get_current(self):
        """Get the current state."""
        return self._current

    vms = property(get_vms, doc="get the VMs in the current state")
    servers = property(get_servers, doc="get the servers (always the same)")

    def apply(self, action, inplace=False):
        """Apply an Action on the current state. The original current state
        is left untouched (the action is performed on a copy),
        unless inplace is True.

        """
        self._current = self._current.transition(action, inplace=inplace)
        return self._current

    def apply_real(self, action, inplace=False):
        """Apply an Action on the real state (reflecting the actual physical
        state) and reset the virtual state.

        """
        self._real = self._real.transition(action, inplace=inplace)
        self.reset_to_real()
        return self._real


    @deprecated