コード例 #1
0
    def setUp(self):
        parser = tmpArgs()
        parser.streamed = False
        parser.devices = -1
        parser.use_GPU = False

        par = {}
        pyqmri.pyqmri._setupOCL(parser, par)
        setupPar(par)
        if DTYPE == np.complex128:
            file = resource_filename('pyqmri',
                                     'kernels/OpenCL_Kernels_double.c')
        else:
            file = resource_filename('pyqmri', 'kernels/OpenCL_Kernels.c')
        prg = []
        for j in range(len(par["ctx"])):
            with open(file) as myfile:
                prg.append(Program(par["ctx"][j], myfile.read()))
        prg = prg[0]

        self.weights = par["weights"]

        self.symgrad = pyqmri.operator.OperatorFiniteSymGradient(
            par, prg, DTYPE=DTYPE, DTYPE_real=DTYPE_real)

        self.symgradin = np.random.randn(par["unknowns"], par["NSlice"],
                                         par["dimY"], par["dimX"], 4) +\
            1j * np.random.randn(par["unknowns"], par["NSlice"],
                                 par["dimY"], par["dimX"], 4)
        self.symdivin = np.random.randn(par["unknowns"], par["NSlice"],
                                        par["dimY"], par["dimX"], 8) +\
            1j * np.random.randn(par["unknowns"], par["NSlice"],
                                 par["dimY"], par["dimX"], 8)
        self.symgradin = self.symgradin.astype(DTYPE)
        self.symdivin = self.symdivin.astype(DTYPE)
        self.dz = par["dz"]
        self.queue = par["queue"][0]

        parser = tmpArgs()
        parser.streamed = False
        parser.devices = -1
        parser.use_GPU = True

        par = {}
        pyqmri.pyqmri._setupOCL(parser, par)
        setupPar(par)

        prg = []
        for j in range(len(par["ctx"])):
            with open(file) as myfile:
                prg.append(Program(par["ctx"][j], myfile.read()))
        prg = prg[0]

        self.symgrad_GPU = pyqmri.operator.OperatorFiniteSymGradient(
            par, prg, DTYPE=DTYPE, DTYPE_real=DTYPE_real)

        self.queue_GPU = par["queue"][0]
コード例 #2
0
    def setUp(self):
        parser = tmpArgs()
        parser.streamed = True
        parser.devices = -1
        parser.use_GPU = True

        par = {}
        par["packs"] = 6
        par["MB"] = 2
        par["shift"] = np.array([0, 64])
        par["numofpacks"] = 1
        pyqmri.pyqmri._setupOCL(parser, par)
        setupPar(par)
        if DTYPE == np.complex128:
            file = resource_filename(
                        'pyqmri', 'kernels/OpenCL_Kernels_double_streamed.c')
        else:
            file = resource_filename(
                        'pyqmri', 'kernels/OpenCL_Kernels_streamed.c')

        prg = []
        for j in range(len(par["ctx"])):
            with open(file) as myfile:
                prg.append(Program(
                    par["ctx"][j],
                    myfile.read()))

        par["par_slices"] = 1
        par["mask"] = np.ones((par["dimY"], par["dimX"]),
                              dtype=DTYPE_real)

        self.op = pyqmri.operator.OperatorKspaceSMSStreamed(
            par, prg,
            DTYPE=DTYPE,
            DTYPE_real=DTYPE_real)

        self.opinfwd = np.random.randn(par["NSlice"], par["unknowns"],
                                       par["dimY"], par["dimX"]) +\
            1j * np.random.randn(par["NSlice"], par["unknowns"],
                                 par["dimY"], par["dimX"])
        self.opinadj = np.random.randn(par["packs"], par["NScan"], par["NC"],
                                       par["dimY"], par["dimX"]) +\
            1j * np.random.randn(par["packs"], par["NScan"], par["NC"],
                                 par["dimY"], par["dimX"])
        self.model_gradient = np.random.randn(par["NSlice"], par["unknowns"],
                                              par["NScan"],
                                              par["dimY"], par["dimX"]) + \
            1j * np.random.randn(par["NSlice"], par["unknowns"],
                                 par["NScan"],
                                 par["dimY"], par["dimX"])
        self.C = np.random.randn(par["NSlice"], par["NC"],
                                 par["dimY"], par["dimX"]) + \
            1j * np.random.randn(par["NSlice"], par["NC"],
                                 par["dimY"], par["dimX"])

        self.model_gradient = self.model_gradient.astype(DTYPE)
        self.C = self.C.astype(DTYPE)
        self.opinfwd = self.opinfwd.astype(DTYPE)
        self.opinadj = self.opinadj.astype(DTYPE)
        self.queue = par["queue"][0]
コード例 #3
0
    def setUp(self):
        parser = tmpArgs()
        parser.streamed = False
        parser.devices = -1
        parser.use_GPU = True

        par = {}
        pyqmri.pyqmri._setupOCL(parser, par)
        setupPar(par)
        if DTYPE == np.complex128:
            file = resource_filename(
                        'pyqmri', 'kernels/OpenCL_Kernels_double.c')
        else:
            file = resource_filename(
                        'pyqmri', 'kernels/OpenCL_Kernels.c')

        prg = []
        for j in range(len(par["ctx"])):
            with open(file) as myfile:
                prg.append(Program(
                    par["ctx"][j],
                    myfile.read()))
        prg = prg[0]

        par["mask"] = np.ones((par["dimY"], par["dimX"]),
                              dtype=DTYPE_real)

        self.op = pyqmri.operator.OperatorKspace(
            par, prg,
            DTYPE=DTYPE,
            DTYPE_real=DTYPE_real, trafo=False)

        self.opinfwd = np.random.randn(par["unknowns"], par["NSlice"],
                                        par["dimY"], par["dimX"]) +\
            1j * np.random.randn(par["unknowns"], par["NSlice"],
                                  par["dimY"], par["dimX"])
        self.opinadj = np.random.randn(par["NScan"], par["NC"], par["NSlice"],
                                        par["dimY"], par["dimX"]) +\
            1j * np.random.randn(par["NScan"], par["NC"], par["NSlice"],
                                  par["dimY"], par["dimX"])

        self.model_gradient = np.random.randn(par["unknowns"], par["NScan"],
                                              par["NSlice"],
                                              par["dimY"], par["dimX"]) + \
            1j * np.random.randn(par["unknowns"], par["NScan"],
                                  par["NSlice"],
                                  par["dimY"], par["dimX"])
        self.C = np.random.randn(par["NC"], par["NSlice"],
                                  par["dimY"], par["dimX"]) + \
            1j * np.random.randn(par["NC"], par["NSlice"],
                                  par["dimY"], par["dimX"])

        self.model_gradient = self.model_gradient.astype(DTYPE)
        self.C = self.C.astype(DTYPE)
        self.opinfwd = self.opinfwd.astype(DTYPE)
        self.opinadj = self.opinadj.astype(DTYPE)
        self.queue = par["queue"][0]
        self.grad_buf = clarray.to_device(self.queue, self.model_gradient)
        self.coil_buf = clarray.to_device(self.queue, self.C)
コード例 #4
0
    def setUp(self):
        parser = tmpArgs()
        parser.streamed = True
        parser.devices = -1
        parser.use_GPU = True

        par = {}
        pyqmri.pyqmri._setupOCL(parser, par)
        setupPar(par)
        if DTYPE == np.complex128:
            file = resource_filename(
                        'pyqmri', 'kernels/OpenCL_Kernels_double_streamed.c')
        else:
            file = resource_filename(
                        'pyqmri', 'kernels/OpenCL_Kernels_streamed.c')

        prg = []
        for j in range(len(par["ctx"])):
            with open(file) as myfile:
                prg.append(Program(
                    par["ctx"][j],
                    myfile.read()))

        par["par_slices"] = 1

        self.op = pyqmri.operator.OperatorImagespaceStreamed(
            par, prg,
            DTYPE=DTYPE,
            DTYPE_real=DTYPE_real)
        self.opinfwd = np.random.randn(par["NSlice"], par["unknowns"],
                                       par["dimY"], par["dimX"]) +\
            1j * np.random.randn(par["NSlice"], par["unknowns"],
                                 par["dimY"], par["dimX"])
        self.opinadj = np.random.randn(par["NSlice"], par["NScan"], 1,
                                       par["dimY"], par["dimX"]) +\
            1j * np.random.randn(par["NSlice"], par["NScan"], 1,
                                 par["dimY"], par["dimX"])
        self.model_gradient = np.random.randn(par["NSlice"], par["unknowns"],
                                              par["NScan"],
                                              par["dimY"], par["dimX"]) + \
            1j * np.random.randn(par["NSlice"], par["unknowns"],
                                 par["NScan"],
                                 par["dimY"], par["dimX"])

        self.model_gradient = self.model_gradient.astype(DTYPE)
        self.opinfwd = self.opinfwd.astype(DTYPE)
        self.opinadj = self.opinadj.astype(DTYPE)
コード例 #5
0
ファイル: irgn.py プロジェクト: philippgualdi/PyQMRI
    def __init__(
        self,
        par,
        model,
        trafo=1,
        imagespace=False,
        SMS=0,
        reg_type="TGV",
        config="",
        streamed=False,
        DTYPE=np.complex64,
        DTYPE_real=np.float32,
    ):
        self.par = par
        self.gn_res = []
        self.irgn_par = utils.read_config(config, reg_type)
        utils.save_config(self.irgn_par, par["outdir"], reg_type)
        num_dev = len(par["num_dev"])
        self._fval_old = 0
        self._fval = 0
        self._fval_init = 0
        self._ctx = par["ctx"]
        self._queue = par["queue"]
        self._model = model
        self._reg_type = reg_type
        self._prg = []

        self._DTYPE = DTYPE
        self._DTYPE_real = DTYPE_real

        self._streamed = streamed
        self._imagespace = imagespace
        self._SMS = SMS
        if streamed and par["NSlice"] / (num_dev * par["par_slices"]) < 2:
            raise ValueError(
                "Number of Slices devided by parallel "
                "computed slices and devices needs to be larger two.\n"
                "Current values are %i total Slices, %i parallel slices and "
                "%i compute devices." %
                (par["NSlice"], par["par_slices"], num_dev))
        if streamed and par["NSlice"] % par["par_slices"]:
            raise ValueError(
                "Number of Slices devided by parallel "
                "computed slices needs to be an integer.\n"
                "Current values are %i total Slices with %i parallel slices." %
                (par["NSlice"], par["par_slices"]))
        if DTYPE == np.complex128:
            if streamed:
                kernname = "kernels/OpenCL_Kernels_double_streamed.c"
            else:
                kernname = "kernels/OpenCL_Kernels_double.c"
            for j in range(num_dev):
                self._prg.append(
                    Program(self._ctx[j],
                            open(resource_filename("pyqmri",
                                                   kernname)).read()))
        else:
            if streamed:
                kernname = "kernels/OpenCL_Kernels_streamed.c"
            else:
                kernname = "kernels/OpenCL_Kernels.c"
            for j in range(num_dev):
                self._prg.append(
                    Program(self._ctx[j],
                            open(resource_filename("pyqmri",
                                                   kernname)).read()))

        if imagespace:
            self._coils = []
            self.sliceaxis = 1
            if self._streamed:
                self._data_trans_axes = (1, 0, 2, 3)
                self._grad_trans_axes = (2, 0, 1, 3, 4)
        else:
            if SMS:
                self._data_shape = (
                    par["NScan"],
                    par["NC"],
                    par["packs"] * par["numofpacks"],
                    par["Nproj"],
                    par["N"],
                )
            else:
                if par["is3D"] and trafo:
                    self._data_shape = (
                        par["NScan"],
                        par["NC"],
                        1,
                        par["Nproj"],
                        par["N"],
                    )
                else:
                    self._data_shape = (
                        par["NScan"],
                        par["NC"],
                        par["NSlice"],
                        par["Nproj"],
                        par["N"],
                    )
            if self._streamed:
                self._data_trans_axes = (2, 0, 1, 3, 4)
                self._grad_trans_axes = (2, 0, 1, 3, 4)
                self._coils = np.require(np.swapaxes(par["C"], 0, 1),
                                         requirements="C",
                                         dtype=DTYPE)

                if SMS:
                    self._data_shape = (
                        par["packs"] * par["numofpacks"],
                        par["NScan"],
                        par["NC"],
                        par["dimY"],
                        par["dimX"],
                    )
                    self._data_shape_T = (
                        par["NScan"],
                        par["NC"],
                        par["packs"] * par["numofpacks"],
                        par["dimY"],
                        par["dimX"],
                    )
                    self._expdim_dat = 1
                    self._expdim_C = 0
                else:
                    self._data_shape = (
                        par["NSlice"],
                        par["NScan"],
                        par["NC"],
                        par["Nproj"],
                        par["N"],
                    )
                    self._data_shape_T = self._data_shape
                    self._expdim_dat = 2
                    self._expdim_C = 1
            else:
                self._coils = clarray.to_device(self._queue[0], self.par["C"])

        self._MRI_operator, self._FT = operator.Operator.MRIOperatorFactory(
            par, self._prg, DTYPE, DTYPE_real, trafo, imagespace, SMS,
            streamed)

        self._grad_op, self._symgrad_op, self._v = self._setupLinearOps(
            DTYPE, DTYPE_real)

        if not reg_type == "H1":
            self._pdop = optimizer.PDBaseSolver.factory(
                self._prg,
                self._queue,
                self.par,
                self.irgn_par,
                self._fval_init,
                self._coils,
                linops=(self._MRI_operator, self._grad_op, self._symgrad_op),
                model=model,
                reg_type=self._reg_type,
                SMS=self._SMS,
                streamed=self._streamed,
                imagespace=self._imagespace,
                DTYPE=DTYPE,
                DTYPE_real=DTYPE_real,
            )
        else:
            self._pdop = optimizer.CGSolver_H1(
                self._prg,
                self._queue,
                self.par,
                self.irgn_par,
                self._coils,
                linops=(self._MRI_operator, self._grad_op),
            )

        self._gamma = None
        self._delta = None
        self._omega = None
        self._step_val = None
        self._modelgrad = None