Example #1
0
 def join(
     self,
     ami: AgentMechanismInterface,
     state: MechanismState,
     *,
     ufun: Optional["UtilityFunction"] = None,
     role: str = "agent",
 ) -> bool:
     if ufun is None:
         ufun = self.__ufun_received
     result = super().join(ami=ami, state=state, ufun=ufun, role=role)
     if (
         result
         and ufun is not None
         and (self.utility_file_name is None or self.domain_file_name is None)
     ):
         domain_file = tempfile.NamedTemporaryFile("w")
         self.domain_file_name = domain_file.name
         domain_file.write(Issue.to_xml_str(ami.issues))
         domain_file.close()
         utility_file = tempfile.NamedTemporaryFile("w")
         self.utility_file_name = utility_file.name
         utility_file.write(
             UtilityFunction.to_xml_str(
                 ufun, issues=ami.issues, discount_factor=self.discount
             )
         )
         utility_file.close()
     return result
Example #2
0
 def _unorm(self, u: UtilityFunction, mn, mx):
     if not isinstance(u, LinearUtilityAggregationFunction) and not isinstance(
         u, LinearUtilityFunction
     ):
         return normalize(u, outcomes=Issue.enumerate(issues, max_n_outcomes=1000))
     # _, mx = self._urange(u, issues)
     if mx < 0:
         return None
     u.weights = {k: _ / mx for k, _ in u.weights.items()}
     return u
Example #3
0
def test_reading_writing_linear_ufun(tmp_path):
    from negmas.utilities import LinearUtilityAggregationFunction, UtilityFunction
    from negmas.outcomes import Issue

    base_folder = pkg_resources.resource_filename(
        "negmas", resource_name="tests/data/Laptop")
    _, agent_info, issues = load_genius_domain_from_folder(
        base_folder,
        keep_issue_names=True,
        keep_value_names=True,
    )
    ufuns = [_["ufun"] for _ in agent_info]
    for ufun in ufuns:
        assert isinstance(ufun, LinearUtilityAggregationFunction)
        dst = tmp_path / "tmp.xml"
        print(dst)
        UtilityFunction.to_genius(ufun, issues=issues, file_name=dst)
        ufun2, _ = UtilityFunction.from_genius(dst)
        assert isinstance(ufun2, LinearUtilityAggregationFunction)
        for outcome in Issue.enumerate(issues):
            assert abs(ufun2(outcome) - ufun(outcome)) < 1e-3
Example #4
0
 def __init__(
     self,
     java_class_name: str,
     assume_normalized=True,
     ufun: Optional[UtilityFunction] = None,
     rational_proposal=False,
     parent: Controller = None,
     port: int = None,
     domain_file_name: str = None,
     utility_file_name: str = None,
     keep_issue_names: bool = True,
     keep_value_names: bool = True,
     auto_load_java: bool = False,
     can_propose=True,
     genius_bridge_path: str = None,
     name: str = None,
 ):
     super().__init__(name=name)
     self.capabilities["propose"] = can_propose
     self.add_capabilities({"genius": True})
     self.java = None
     self.java_class_name = java_class_name
     self.port = port
     self.connected = self._connect(
         path=genius_bridge_path, port=self.port, auto_load_java=auto_load_java
     )
     self.java_uuid = self._create()
     self.uuid = self.java_uuid
     self.name = self.java_uuid
     self.domain_file_name = str(domain_file_name)
     self.utility_file_name = str(utility_file_name)
     self._my_last_offer = None
     self.keep_issue_names = keep_issue_names
     self._utility_function, self.discount = None, None
     if domain_file_name is not None:
         # we keep original issues details so that we can create appropriate answers to Java
         self.issues = get_domain_issues(
             domain_file_name=domain_file_name,
             keep_issue_names=True,
             keep_value_names=True,
         )
         self.issue_names = [_.name for _ in self.issues]
         self.issue_index = dict(zip(self.issue_names, range(len(self.issue_names))))
     if utility_file_name is not None:
         self._utility_function, self.discount = UtilityFunction.from_genius(
             utility_file_name,
             keep_issue_names=keep_issue_names,
             keep_value_names=keep_value_names,
         )
     self.base_utility = self._utility_function
     self.__ufun_received = ufun
     pass
Example #5
0
 def _urange(self, u: UtilityFunction, issues):
     if not isinstance(u, LinearUtilityAggregationFunction) and not isinstance(
         u, LinearUtilityFunction
     ):
         return u.utility_range(issues=issues)
     mn = mx = 0.0
     for (_, w), issue in zip(u.weights.items(), issues):
         values = list(issue.values)
         mnv, mxv = min(values), max(values)
         if w > 0:
             mn += mnv * w
             mx += mxv * w
         else:
             mn += mxv * w
             mx += mnv * w
     return mn, mx
Example #6
0
def test_inverse_genius_domain(normalize):
    issues, _ = Issue.from_xml_str(
        open(
            pkg_resources.resource_filename(
                "negmas", resource_name="tests/data/Laptop/Laptop-C-domain.xml"
            ),
            "r",
        ).read(),
    )
    u, _ = UtilityFunction.from_xml_str(
        open(
            pkg_resources.resource_filename(
                "negmas", resource_name="tests/data/Laptop/Laptop-C-prof1.xml"
            ),
            "r",
        ).read(),
        force_single_issue=False,
        normalize_utility=normalize,
    )
    u.init_inverse(issues=issues)
    for i in range(100):
        v = u(u.inverse(i / 100.0, eps=(0.001, 0.1), assume_normalized=normalize))
        assert v-1e-3 <= v <= v+0.1
Example #7
0
 def __init__(self, java_class_name: str
              , port: int = None
              , domain_file_name: str = None
              , utility_file_name: str = None
              , keep_issue_names: bool = True
              , keep_value_names: bool = True
              , auto_load_java: bool = False
              , can_propose=True
              , name: str = None):
     super().__init__(name=name)
     self.capabilities['propose'] = can_propose
     self.add_capabilities({'genius': True})
     self.java = None
     self.java_class_name = java_class_name
     self.port = port
     self.connected = self._connect(port=self.port, auto_load_java=auto_load_java)
     self.java_uuid = self._create()
     self.uuid = self.java_uuid
     self.name = self.java_uuid
     self.domain_file_name = str(domain_file_name)
     self.utility_file_name = str(utility_file_name)
     self._my_last_offer = None
     self.keep_issue_names = keep_issue_names
     self.utility_function, self.discount = None, None
     if domain_file_name is not None:
         # we keep original issues details so that we can create appropriate answers to Java
         self.issues = get_domain_issues(domain_file_name=domain_file_name, keep_issue_names=True
                                         , keep_value_names=True)
         self.issue_names = [_.name for _ in self.issues]
         self.issue_index = dict(zip(self.issue_names, range(len(self.issue_names))))
     if utility_file_name is not None:
         self.utility_function, self.discount = UtilityFunction.from_genius(utility_file_name
                                                                            , keep_issue_names=keep_issue_names
                                                                            , keep_value_names=keep_value_names)
     self.base_utility = self.utility_function
     pass
Example #8
0
def test_normalization():

    u, _ = UtilityFunction.from_xml_str(
        open(
            pkg_resources.resource_filename(
                "negmas", resource_name="tests/data/Laptop/Laptop-C-prof1.xml"
            ),
            "r",
        ).read(),
        force_single_issue=True,
        normalize_utility=False,
    )
    assert abs(u(("Dell+60 Gb+19'' LCD",)) - 21.987727736172488) < 0.000001
    assert abs(u(("HP+80 Gb+20'' LCD",)) - 22.68559475583014) < 0.000001

    gt_max = {
        ("Dell", "60 Gb", "19'' LCD"): 0.7328862913051053,
        ("Dell", "60 Gb", "20'' LCD"): 0.6150545888614856,
        ("Dell", "60 Gb", "23'' LCD"): 0.6739704400832954,
        ("Dell", "80 Gb", "19'' LCD"): 0.6068653140240788,
        ("Dell", "80 Gb", "20'' LCD"): 0.48903361158045916,
        ("Dell", "80 Gb", "23'' LCD"): 0.547949462802269,
        ("Dell", "120 Gb", "19'' LCD"): 0.4682422390149499,
        ("Dell", "120 Gb", "20'' LCD"): 0.3504105365713301,
        ("Dell", "120 Gb", "23'' LCD"): 0.40932638779313996,
        ("Macintosh", "60 Gb", "19'' LCD"): 0.851603495169503,
        ("Macintosh", "60 Gb", "20'' LCD"): 0.7337717927258832,
        ("Macintosh", "60 Gb", "23'' LCD"): 0.7926876439476931,
        ("Macintosh", "80 Gb", "19'' LCD"): 0.7255825178884765,
        ("Macintosh", "80 Gb", "20'' LCD"): 0.6077508154448569,
        ("Macintosh", "80 Gb", "23'' LCD"): 0.6666666666666666,
        ("Macintosh", "120 Gb", "19'' LCD"): 0.5869594428793475,
        ("Macintosh", "120 Gb", "20'' LCD"): 0.4691277404357278,
        ("Macintosh", "120 Gb", "23'' LCD"): 0.5280435916575378,
        ("HP", "60 Gb", "19'' LCD"): 1.0,
        ("HP", "60 Gb", "20'' LCD"): 0.8821682975563803,
        ("HP", "60 Gb", "23'' LCD"): 0.9410841487781901,
        ("HP", "80 Gb", "19'' LCD"): 0.8739790227189735,
        ("HP", "80 Gb", "20'' LCD"): 0.7561473202753539,
        ("HP", "80 Gb", "23'' LCD"): 0.8150631714971638,
        ("HP", "120 Gb", "19'' LCD"): 0.7353559477098447,
        ("HP", "120 Gb", "20'' LCD"): 0.6175242452662248,
        ("HP", "120 Gb", "23'' LCD"): 0.6764400964880347,
    }
    gt_range = {
        ("Dell", "60 Gb", "19'' LCD"): 0.5887961185746265,
        ("Dell", "60 Gb", "20'' LCD"): 0.40740200879076527,
        ("Dell", "60 Gb", "23'' LCD"): 0.4980990636826959,
        ("Dell", "80 Gb", "19'' LCD"): 0.39479516200759546,
        ("Dell", "80 Gb", "20'' LCD"): 0.21340105222373418,
        ("Dell", "80 Gb", "23'' LCD"): 0.3040981071156648,
        ("Dell", "120 Gb", "19'' LCD"): 0.1813941097838614,
        ("Dell", "120 Gb", "20'' LCD"): 0.0,
        ("Dell", "120 Gb", "23'' LCD"): 0.09069705489193064,
        ("Macintosh", "60 Gb", "19'' LCD"): 0.7715533992081258,
        ("Macintosh", "60 Gb", "20'' LCD"): 0.5901592894242645,
        ("Macintosh", "60 Gb", "23'' LCD"): 0.6808563443161952,
        ("Macintosh", "80 Gb", "19'' LCD"): 0.5775524426410947,
        ("Macintosh", "80 Gb", "20'' LCD"): 0.3961583328572335,
        ("Macintosh", "80 Gb", "23'' LCD"): 0.48685538774916415,
        ("Macintosh", "120 Gb", "19'' LCD"): 0.3641513904173608,
        ("Macintosh", "120 Gb", "20'' LCD"): 0.18275728063349939,
        ("Macintosh", "120 Gb", "23'' LCD"): 0.27345433552543014,
        ("HP", "60 Gb", "19'' LCD"): 1.0,
        ("HP", "60 Gb", "20'' LCD"): 0.8186058902161387,
        ("HP", "60 Gb", "23'' LCD"): 0.9093029451080693,
        ("HP", "80 Gb", "19'' LCD"): 0.8059990434329689,
        ("HP", "80 Gb", "20'' LCD"): 0.6246049336491076,
        ("HP", "80 Gb", "23'' LCD"): 0.7153019885410383,
        ("HP", "120 Gb", "19'' LCD"): 0.592597991209235,
        ("HP", "120 Gb", "20'' LCD"): 0.41120388142537345,
        ("HP", "120 Gb", "23'' LCD"): 0.501900936317304,
    }
    u, _ = UtilityFunction.from_xml_str(
        open(
            pkg_resources.resource_filename(
                "negmas", resource_name="tests/data/Laptop/Laptop-C-prof1.xml"
            ),
            "r",
        ).read(),
        force_single_issue=False,
        normalize_utility=True,
        normalize_max_only=False,
        keep_issue_names=True,
        keep_value_names=True,
    )

    for k, v in gt_range.items():
        assert abs(v - u(k)) < 1e-3, (k, v, u(k))

    u, _ = UtilityFunction.from_xml_str(
        open(
            pkg_resources.resource_filename(
                "negmas", resource_name="tests/data/Laptop/Laptop-C-prof1.xml"
            ),
            "r",
        ).read(),
        force_single_issue=False,
        normalize_utility=True,
        normalize_max_only=True,
        keep_issue_names=True,
        keep_value_names=True,
    )

    for k, v in gt_max.items():
        assert abs(v - u(k)) < 1e-3, (k, v, u(k))

    u, _ = UtilityFunction.from_xml_str(
        open(
            pkg_resources.resource_filename(
                "negmas", resource_name="tests/data/Laptop/Laptop-C-prof1.xml"
            ),
            "r",
        ).read(),
        force_single_issue=True,
        keep_issue_names=False,
        keep_value_names=False,
        normalize_utility=False,
    )
    assert abs(u((0,)) - 21.987727736172488) < 0.000001

    u, _ = UtilityFunction.from_xml_str(
        open(
            pkg_resources.resource_filename(
                "negmas", resource_name="tests/data/Laptop/Laptop-C-prof1.xml"
            ),
            "r",
        ).read(),
        force_single_issue=False,
        normalize_utility=False,
    )
    assert (
        abs(
            u({"Laptop": "Dell", "Harddisk": "60 Gb", "External Monitor": "19'' LCD"})
            - 21.987727736172488
        )
        < 0.000001
    )
    assert (
        abs(
            u({"Laptop": "HP", "Harddisk": "80 Gb", "External Monitor": "20'' LCD"})
            - 22.68559475583014
        )
        < 0.000001
    )

    u, _ = UtilityFunction.from_xml_str(
        open(
            pkg_resources.resource_filename(
                "negmas", resource_name="tests/data/Laptop/Laptop-C-prof1.xml"
            ),
            "r",
        ).read(),
        force_single_issue=True,
        normalize_utility=True,
    )
    assert abs(u(("Dell+60 Gb+19'' LCD",)) - 0.599329436957658) < 0.1
    assert abs(u(("HP+80 Gb+20'' LCD",)) - 0.6342209804130308) < 0.01

    u, _ = UtilityFunction.from_xml_str(
        open(
            pkg_resources.resource_filename(
                "negmas", resource_name="tests/data/Laptop/Laptop-C-prof1.xml"
            ),
            "r",
        ).read(),
        force_single_issue=True,
        keep_issue_names=False,
        keep_value_names=False,
        normalize_utility=True,
    )
    assert abs(u((0,)) - 0.599329436957658) < 0.1

    u, _ = UtilityFunction.from_xml_str(
        open(
            pkg_resources.resource_filename(
                "negmas", resource_name="tests/data/Laptop/Laptop-C-prof1.xml"
            ),
            "r",
        ).read(),
        force_single_issue=False,
        normalize_utility=True,
    )
    assert (
        abs(
            u({"Laptop": "Dell", "Harddisk": "60 Gb", "External Monitor": "19'' LCD"})
            - 0.599329436957658
        )
        < 0.1
    )
    assert (
        abs(
            u({"Laptop": "HP", "Harddisk": "80 Gb", "External Monitor": "20'' LCD"})
            - 0.6342209804130308
        )
        < 0.01
    )
    assert (
        abs(
            u({"Laptop": "HP", "Harddisk": "60 Gb", "External Monitor": "19'' LCD"})
            - 1.0
        )
        < 0.0001
    )