# Buggy code
def _add_in_aclib_format(self, train_perf, incumbent_id, incumbent):
    """
    adds entries to AClib2-like trajectory file

    Parameters
    ----------
    train_perf: float
        estimated performance on training (sub)set
    incumbent_id: int
        id of incumbent
    incumbent: Configuration()
        current incumbent configuration
    """

    conf = []
    for p in incumbent:
        if not incumbent[p] is None:
            conf.append("%s='%s'" % (p, incumbent[p]))

    ta_time_used = self.stats.ta_time_used
    wallclock_time = self.stats.get_used_wallclock_time()

    traj_entry = {
        "cpu_time": ta_time_used,
        "total_cpu_time": None,  # TODO: fix this
        "wallclock_time": wallclock_time,
        "evaluations": self.stats.ta_runs,
        "cost": train_perf,
        "incumbent": conf,
    }

    with open(self.aclib_traj_fn, "a") as fp:
        json.dump(traj_entry, fp)
        fp.write("\n")


# Traceback (KeyError)
KeyError                                  Traceback (most recent call last)
<ipython-input-10-a9f6024df581> in <module>()
38 smbo = SMBO(scenario=scenario, rng=1, tae_runner=taf)
39 Stats.scenario = scenario
---> 40 smbo.run(max_iters=100)
41
42 print("Final Incumbent: %s" % (smbo.incumbent))

/home/feurerm/virtualenvs/ml2016/local/lib/python2.7/site-packages/smac/smbo/smbo.pyc in run(self, max_iters)
291                 run_history=self.runhistory,
292                 objective=self.objective,
--> 293                 time_bound=max(0.01, time_spend))
294
295             # TODO: Write run history into database

/home/feurerm/virtualenvs/ml2016/local/lib/python2.7/site-packages/smac/smbo/intensification.pyc in intensify(self, challengers, incumbent, run_history, objective, time_bound)
226                 chall_inst_seeds = set(map(lambda x: (
227                     x.instance, x.seed), run_history.get_runs_for_config(challenger)))
--> 228                 chal_perf = objective(challenger, run_history, chall_inst_seeds)
229                 run_history.update_cost(challenger, chal_perf)
230

/home/feurerm/virtualenvs/ml2016/local/lib/python2.7/site-packages/smac/smbo/objective.pyc in average_cost(config, run_history, instance_seed_pairs)
116     float
117     """
--> 118     return np.mean(_cost(config, run_history, instance_seed_pairs))
119
120 def sum_cost(config, run_history, instance_seed_pairs=None):

/home/feurerm/virtualenvs/ml2016/local/lib/python2.7/site-packages/smac/smbo/objective.pyc in _cost(config, run_history, instance_seed_pairs)
93     for i, r in instance_seed_pairs:
94         k = run_history.RunKey(id_, i, r)
---> 95         costs.append(run_history.data[k].cost)
96     return costs
97

KeyError: RunKey(config_id=36, instance_id='2', seed=931243971)

# Fixed code
def _add_in_aclib_format(self, train_perf, incumbent_id, incumbent):
    """
    adds entries to AClib2-like trajectory file

    Parameters
    ----------
    train_perf: float
        estimated performance on training (sub)set
    incumbent_id: int
        id of incumbent
    incumbent: Configuration()
        current incumbent configuration
    """

    conf = []
    for p in incumbent:
        if not incumbent[p] is None:
            conf.append("%s='%s'" % (p, repr(incumbent[p])))

    ta_time_used = self.stats.ta_time_used
    wallclock_time = self.stats.get_used_wallclock_time()

    traj_entry = {
        "cpu_time": ta_time_used,
        "total_cpu_time": None,  # TODO: fix this
        "wallclock_time": wallclock_time,
        "evaluations": self.stats.ta_runs,
        "cost": train_perf,
        "incumbent": conf,
    }

    with open(self.aclib_traj_fn, "a") as fp:
        json.dump(traj_entry, fp)
        fp.write("\n")