<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def input_data_ports(self, input_data_ports):
 """Property for the _input_data_ports field See Property. :param dict input_data_ports: Dictionary that maps :class:`int` data_port_ids onto values of type :class:`rafcon.core.state_elements.data_port.InputDataPort` :raises exceptions.TypeError: if the input_data_ports parameter has the wrong type :raises exceptions.AttributeError: if the key of the input dictionary and the id of the data port do not match """

        if not isinstance(input_data_ports, dict):
            raise TypeError("input_data_ports must be of type dict")
        if [port_id for port_id, port in input_data_ports.items() if not port_id == port.data_port_id]:
            raise AttributeError("The key of the input dictionary and the id of the data port do not match")

        # This is a fix for older state machines, which didn't distinguish between input and output ports
        for port_id, port in input_data_ports.items():
            if not isinstance(port, InputDataPort):
                if isinstance(port, DataPort):
                    port = InputDataPort(port.name, port.data_type, port.default_value, port.data_port_id)
                    input_data_ports[port_id] = port
                else:
                    raise TypeError("Elements of input_data_ports must be of type InputDataPort, given: {0}".format(
                        type(port).__name__))

        old_input_data_ports = self._input_data_ports
        self._input_data_ports = input_data_ports
        for port_id, port in input_data_ports.items():
            try:
                port.parent = self
            except ValueError:
                self._input_data_ports = old_input_data_ports
                raise

        # check that all old_input_data_ports are no more referencing self as there parent
        for old_input_data_port in old_input_data_ports.values():
            if old_input_data_port not in self._input_data_ports.values() and old_input_data_port.parent is self:
                old_input_data_port.parent = None