Example #1
0
    def synthesize(self, code):
        old_code = spu.get_active_code()
        spu.set_active_code(code)

        self._load_parameters(code)

        log = spu_log.SPULog()
        log.setup(code)

        if self.renderer is not None:
            self.renderer.setup(code)
            self.renderer.set_one(log.consts['ONE'])

        r1_inc = var.SingleFloat()
        r2_inc = var.SingleFloat()
        r1 = var.SingleFloat()
        r2 = var.SingleFloat()
        result = var.SingleFloat()
        pattern = var.Word(0)

        self.ly_point.set_pattern_reg(pattern)
        self.ly_point.set_result_reg(result)
        self.ly_point.set_r_regs(r1, r2)
        self.ly_point.set_log(log)
        self.ly_point.setup(code)

        spu.lqa(r1, 0)
        spu.lqa(r2, 4)
        spu.lqa(r1_inc, 8)
        spu.lqa(r2_inc, 12)
        spu.lqa(pattern, 16)

        for y in spuiter.syn_iter(code, self.h):
            spu.lqa(r1, 0)

            for x in spuiter.syn_iter(code, self.w / 4):
                self.ly_point.synthesize(code)
                r1.v = spu.fa.ex(r1, r1_inc)

                if self.renderer is not None:
                    # result.v = spu.fm.ex(r1, r2)
                    self.renderer.set_result_reg(result)
                    self.renderer.synthesize(code)

            if self.renderer is not None:
                self.renderer.row_complete(code)
            r2.v = spu.fa.ex(r2, r2_inc)

        # return Numeric.where(Numeric.less(results, 0), results, 0)

        spu.set_active_code(old_code)
        return
Example #2
0
  def synthesize(self, code):
    old_code = spu.get_active_code()
    spu.set_active_code(code)

    # Sanity checks
    if self._x_addr is None: raise Exception("Please set x_addr")
    if self._y_addr is None: raise Exception("Please set y_addr")
    if self._n_bits is None: raise Exception("Please set n_bits")
    if self._m is None: raise Exception("Please set m")
    if self._n is None: raise Exception("Please set n")    
    
    # Acquire a registers for the bit vectors and result
    n_vecs = self._n_bits / 128
    x_regs = [code.acquire_register() for i in range(n_vecs)]
    y_regs = [code.acquire_register() for i in range(n_vecs)]
    result = code.acquire_register()

    x_addr = var.Word()
    y_addr = var.Word()

    if self._save_op is not None:
      if self._threshold is not None:
        threshold = var.SingleFloat(self._threshold)
      else:
        threshold = var.SingleFloat(0.0)
      bcmp = var.Word(0)
    
    # Setup the Tanimito kernel
    tan = Tanimoto()

    tan.set_n_bits(self._n_bits)
    tan.set_x_regs(x_regs)
    tan.set_y_regs(y_regs)
    tan.set_result(result)

    tan.synthesize_constants(code)

    # Setup the save op
    save_op = self._save_op
    if save_op is not None:
      save_op.setup()
      
    # Create the iterators
    xiter = spuiter.syn_iter(code, self._m)
    yiter = spuiter.syn_iter(code, self._n)

    # Synthesize the block comparison loops
    x_addr.v = self._x_addr

    for x_off in xiter:
      x_addr.v = x_addr + 16 * n_vecs
      y_addr.v = self._y_addr

      self._load_bit_vector(x_addr, x_regs)

      for y_off in yiter:
        y_addr.v = y_addr + 16 * n_vecs

        self._load_bit_vector(y_addr, y_regs)
        tan.synthesize(code)

        if save_op is not None:
          spu.fcgt(bcmp, result, threshold)
          save_op.test(bcmp, result, x_off, y_off)

    # /x_off

    if old_code is not None:
      spu.set_active_code(old_code)
    
    return
Example #3
0
    def synthesize(self, code):
        self._check_inputs()

        old_code = spu.get_active_code()
        spu.set_active_code(code)

        zero = var.Word(reg=code.r_zero)
        one = self.log.consts['ONE']
        two = self.consts['TWO']

        x = var.Word(self.x0)
        r = var.Word(0)
        cmp = var.Word(0)
        x_neg = var.Word(0)
        fmax = var.Word(self.max_init)
        temp = var.SingleFloat()

        fmax.v = spu.cuflt.ex(fmax, 155)

        # Init
        for i in spuiter.syn_iter(code, self.max_init):
            # x = r[i % r_max] * x * (1.0 - x)
            self._next_r(r)
            temp.v = spu.fs.ex(one, x)
            x.v = spu.fm.ex(x, temp)
            x.v = spu.fm.ex(r, x)

        #  if x == float('-infinity'):
        #    return -10.0

        # Derive Exponent
        total = var.Word(0)
        logx = var.SingleFloat()

        for i in spuiter.syn_iter(code, self.max_n):
            # x = ri * x * (1.0 - x)
            self._next_r(r)
            temp.v = spu.fs.ex(one, x)
            x.v = spu.fm.ex(x, temp)
            x.v = spu.fm.ex(r, x)

            # logx = ri - 2.0 * ri * x
            logx.v = spu.fm.ex(two, x)
            logx.v = spu.fm.ex(r, logx)
            logx.v = spu.fs.ex(r, logx)

            # abs(logx)
            x_neg.v = spu.fs.ex(zero, logx)
            cmp.v = spu.fcgt.ex(logx, zero)
            logx.v = spu.selb.ex(x_neg, logx, cmp)
            # logx.v = spu.selb.ex(logx, x_neg, cmp)

            # log(logx)
            self.log.set_result(logx)
            self.log.set_x(logx)
            self.log.synthesize(code)

            # total = total + x
            total.v = spu.fa.ex(total, logx)

        # return total / float(max_n)
        fdiv(code, self.result, total, fmax, one)

        spu.set_active_code(code)
        return