def __init__(self, options):
        #Data structures for storing info
        self.user_job_last3 = {}
        self.user_job_last2 = {}
        self.user_job_last1 = {}
        self.job_x = {}

        #machine learning thing
        m = LinearModel(self.n_features)

        if options["loss"] == "squaredloss":
            from valopt.losses.squared_loss import SquaredLoss
            l = SquaredLoss(m)
        elif options["loss"] == "absloss":
            from valopt.losses.abs_loss import AbsLoss
            l = AbsLoss(m)
        elif options["loss"] == "weightedsquaredloss":
            from valopt.losses.weighted_squared_loss import WeightedSquaredLoss
            l = WeightedSquaredLoss(m)
        else:
            raise ValueError(
                "predictor config error: no valid loss specified.")

        if "max_runtime" in options.keys():
            self.max_runtime = options["max_runtime"]
        else:
            self.max_runtime = False

        self.model = NAG(m, l, options["eta"], verbose=False)
Exemplo n.º 2
0
    def __init__(self, options):
        #Data structures for storing info
        self.user_job_last3 = {}
        self.user_job_last2 = {}
        self.user_job_last1 = {}
        self.user_sum_runtimes = {}
        self.user_sum_cores = {}
        self.user_n_jobs = {}
        self.job_x = {}
        self.user_last_ending = {}

        #Statistics oriented.
        self.last_loss = 0

        if options["scheduler"]["predictor"]["quadratic"]:
            print("Using predictor with quadratic features")
            self.quadratic = True
            if options["scheduler"]["predictor"]["cubic"]:
                self.cubic = True
                self.n_features = int(3 * self.n_features +
                                      kPn(self.n_features, 2) +
                                      kPn(self.n_features, 3))
            else:
                self.n_features = int(3 * self.n_features +
                                      2 * kPn(self.n_features, 2))
                self.cubic = False
        else:
            self.cubic = False
            self.quadratic = False

        #machine learning thing
        m = LinearModel(self.n_features)

        if "max_runtime" in options["scheduler"]["predictor"].keys():
            self.max_runtime = options["scheduler"]["predictor"]["max_runtime"]
        else:
            self.max_runtime = False

        if options["scheduler"]["predictor"]["loss"] == "squaredloss":
            from valopt.losses.squared_loss import SquaredLoss
            l = SquaredLoss(m, maxloss=self.max_runtime)
        elif options["scheduler"]["predictor"]["loss"] == "composite":

            from valopt.losses.composite import CompositeLoss
            if options["scheduler"]["predictor"]["leftside"] == "abs":
                from valopt.losses.losscurves.abs import Abscurve
                leftside = Abscurve(
                    m, options["scheduler"]["predictor"]["leftparam"])
            elif options["scheduler"]["predictor"]["leftside"] == "square":
                from valopt.losses.losscurves.square import Squarecurve
                leftside = Squarecurve(
                    m, options["scheduler"]["predictor"]["leftparam"])
            elif options["scheduler"]["predictor"]["leftside"] == "exp":
                from valopt.losses.losscurves.exp import Expcurve
                leftside = Expcurve(
                    m, options["scheduler"]["predictor"]["leftparam"])
            else:
                raise ValueError(
                    "predictor config error: no leftside specified")

            if options["scheduler"]["predictor"]["rightside"] == "abs":
                from valopt.losses.losscurves.abs import Abscurve
                rightside = Abscurve(
                    m, options["scheduler"]["predictor"]["rightparam"])
            elif options["scheduler"]["predictor"]["rightside"] == "square":
                from valopt.losses.losscurves.square import Squarecurve
                rightside = Squarecurve(
                    m, options["scheduler"]["predictor"]["rightparam"])
            elif options["scheduler"]["predictor"]["rightside"] == "exp":
                from valopt.losses.losscurves.exp import Expcurve
                rightside = Expcurve(
                    m, options["scheduler"]["predictor"]["rightparam"])
            else:
                raise ValueError(
                    "predictor config error: no rightside specified")

            l = CompositeLoss(m, rightside, leftside,
                              options["scheduler"]["predictor"]["threshold"])

        else:
            raise ValueError(
                "predictor config error: no valid loss specified.")

        if "lambda" in options["scheduler"]["predictor"].keys():
            if options["scheduler"]["predictor"]["regularization"] == "l1":
                from valopt.losses.regularizations.l1 import L1
                from valopt.losses.regularized_loss import RegularizedLoss
                l = RegularizedLoss(
                    m, l, L1(), options["scheduler"]["predictor"]["lambda"])
            elif options["scheduler"]["predictor"]["regularization"] == "l2":
                from valopt.losses.regularizations.l2 import L2
                from valopt.losses.regularized_loss import RegularizedLoss
                l = RegularizedLoss(
                    m, l, L2(), options["scheduler"]["predictor"]["lambda"])
            else:
                raise ValueError(
                    "predictor config error: lambda present and no valid regularizer specified."
                )

        if options["scheduler"]["predictor"]["gd"] == "NAG":
            from valopt.algos.nag import NAG
            self.model = NAG(m,
                             l,
                             options["scheduler"]["predictor"]["eta"],
                             verbose=False)
        elif options["scheduler"]["predictor"]["gd"] == "sNAG":
            from valopt.algos.snag import sNAG
            self.model = sNAG(m,
                              l,
                              options["scheduler"]["predictor"]["eta"],
                              verbose=False)

        if not options["scheduler"]["predictor"]["weight"]:
            wstr = compile("1", "<string>", "eval")
        else:
            wstr = compile(options["scheduler"]["predictor"]["weight"],
                           "<string>", "eval")

        def weight(job):
            m = float(job.num_required_processors)
            r = float(job.actual_run_time)
            #log=np.log
            log = math.log
            return eval(wstr)

        self.weight = weight