Beispiel #1
0
    def runBCS(self):
        pcmodel = self.pcModel
        x_uq = mkSetDbl2D(self.x_np)
        # Should this be the original LHS points or the actual physical parameters that we fed into the model?
        y_uq = mkSetDbl1D(self.y_np)
        eta = 1.e-9
        adpt = 0
        optml = 1
        scl = 0.1
        verb = -1

        for iters in range(1, self.nBCS + 1):
            print 'Starting BCS ' + str(iters)
            self.nPCT = pcmodel.GetNumberPCTerms()
            phi_uq = mkBlnkDbl2D()
            midx_uq = mkBlnkInt2D()
            sgm2_uq = mkSetDblRef((np.std(self.y_np)**2) / 1.0e6)
            lmbdInit_uq = mkBlnkDbl1D()
            wghts_uq = mkBlnkDbl1D()
            usd_uq = mkBlnkInt1D()
            errBrs_uq = mkBlnkDbl1D()
            basis_uq = mkBlnkDbl1D()
            alpha_uq = mkBlnkDbl1D()
            lmbd_uq = mkDblRef()
            newMIdx_uq = mkBlnkInt2D()

            # evalulate pc model to get phi
            pcmodel.EvalBasisAtCustPts(x_uq, phi_uq)
            self.phi_np = uqtk2NumpyDbl(phi_uq)
            self.saveDat(self.phi_np, 'phi_' + str(iters) + '.dat')

            # Perform BCS
            uqtkbcs.FastLaplace(phi_uq, y_uq, sgm2_uq, eta, lmbdInit_uq, adpt,
                                optml, scl, verb, wghts_uq, usd_uq, errBrs_uq,
                                basis_uq, alpha_uq, lmbd_uq)
            usd_np = uqtkarray.uqtk2numpy(usd_uq)
            print "BCS selected " + str(len(usd_np)) + " of " + str(
                self.mIdx_np.shape[0]) + " Multi Index"
            self.mIdx_np = self.mIdx_np[usd_np, :]

            # skip add front for last iteration of BCS
            if iters != self.nBCS:
                # Update Multi Index with BCS Results
                [mIdxNew_np, mIdxAdd_np,
                 mIdxFrnt_np] = uqtkmlti.mi_addfront(self.mIdx_np)
                self.saveDat(mIdxNew_np, 'nIdexNew_' + str(iters) + '.dat')

                # Redefine PCE with update Multi Index
                mIdxNew_uq = mkSetInt2D(mIdxNew_np)
                pcmodel = uqtkpce.PCSet('NISPnoq', mIdxNew_uq, 'LEG')
                self.mIdx_np = uqtkarray.uqtk2numpy(mIdxNew_uq)
                print ''

        print ''
        mIdxFin_uq = mkSetInt2D(self.mIdx_np)
        pcmodel = uqtkpce.PCSet('NISPnoq', mIdxFin_uq, 'LEG')
        print "Final mIdx size: " + str(self.mIdx_np.shape[0])
        self.pcModel = pcmodel
        self.wghts_uq = wghts_uq
Beispiel #2
0
  def runPCE(self):
    print "Instantiate PCE object"
    pcmodel = uqtkpce.PCSet('NISPnoq',self.nord,self.ndim,'LEG')
    mIdx_uq  = mkBlnkInt2D();
    pcmodel.GetMultiIndex(mIdx_uq);

    self.mIdx_np = uqtk2NumpyDbl(mIdx_uq)
    self.saveDat(self.mIdx_np,'mIdex.dat')

    self.pcModel = pcmodel;
Beispiel #3
0
 def generate_pc_model(self,
                       pce_dim,
                       nord=3,
                       pc_type="HG",
                       pc_alpha=0.0,
                       pc_beta=1.0,
                       quadtype='full'):
     """
     Wrapper for uqtk PCSet with default values
     """
     param = nord + 1  # Parameter for quadrature point generation. Equal to number of quad points per dimension for full quadrature
     self.pc_model = uqtkpce.PCSet("NISP", nord, pce_dim, pc_type, pc_alpha,
                                   pc_beta)
     self.pc_model.SetQuadRule(pc_type, quadtype, param)
Beispiel #4
0
    def runPCE(self):
        print "Instantiate PCE object"
        self.nord = 1
        pcmodel = uqtkpce.PCSet('NISPnoq', self.nord, self.ndim, 'LEG')
        # set quad rule for pc model
        pcmodel.SetQuadRule(self.q)

        # Get the multiindex for postprocessing
        mIdx_uq = mkBlnkInt2D()
        pcmodel.GetMultiIndex(mIdx_uq)
        self.mIdx_np = uqtk2NumpyDbl(mIdx_uq)
        self.saveDat(self.mIdx_np, 'mIdex.dat')

        # get the coefficients using the quadrature rule to calculate the projections
        nPCT = pcmodel.GetNumberPCTerms()
        ck_uq = mkSzDbl1D(nPCT)
        y_uq = mkSetDbl1D(self.y_np)
        pcmodel.GalerkProjection(y_uq, ck_uq)
        self.ck_np = uqtk2NumpyDbl(ck_uq)
        self.saveDat(self.ck_np, 'ck.dat')

        self.pcModel = pcmodel
        self.mIdx_uq = mIdx_uq
        self.ck_uq = ck_uq
Beispiel #5
0
  def runBCS(self):  
    pcmodel = self.pcModel;
    x_uq    = mkSetDbl2D(self.x_np);
    y_uq    = mkSetDbl1D(self.y_np);
    eta     = 1.e-4;
    adpt    = 0;
    optml   = 1;
    scl     = 0.1;
    verb    = -1;

    for iters in range(1, self.nBCS+1):
      print 'Starting BCS ' + str(iters)
      self.nPCT   = pcmodel.GetNumberPCTerms();
      phi_uq      = mkBlnkDbl2D();
      midx_uq     = mkBlnkInt2D();
      sgm2_uq     = mkSetDblRef((np.std(self.y_np)**2)/1.0e6);
      lmbdInit_uq = mkBlnkDbl1D();
      wghts_uq    = mkBlnkDbl1D();
      usd_uq      = mkBlnkInt1D();
      errBrs_uq   = mkBlnkDbl1D();
      basis_uq    = mkBlnkDbl1D();
      alpha_uq    = mkBlnkDbl1D();
      lmbd_uq     = mkDblRef();
      newMIdx_uq  = mkBlnkInt2D();
      
      # evalulate pc model to get phi
      pcmodel.EvalBasisAtCustPts(x_uq, phi_uq)
      self.phi_np = uqtk2NumpyDbl(phi_uq)
      self.saveDat(self.phi_np,'phi_' + str(iters) + '.dat')
    
      # Perform BCS
      uqtkbcs.FastLaplace(phi_uq, y_uq, sgm2_uq, eta, lmbdInit_uq, adpt, optml, scl, verb, wghts_uq, usd_uq, errBrs_uq, basis_uq, alpha_uq, lmbd_uq)
      usd_np = uqtkarray.uqtk2numpy(usd_uq)
      print "BCS selected " + str(len(usd_np)) + " of " + str(self.mIdx_np.shape[0]) + " Multi Index"
      
      if (1.0*len(usd_np) / self.mIdx_np.shape[0]) > 0.5:
        print 'No reduction, skipping BCS'
        self.skp = self.skp + 1;
        print str(self.skp) + ' of ' + str(self.cnt) + 'Skipped so far'
        break;

      self.mIdx_np = self.mIdx_np[usd_np,:]

      # skip add front for last iteration of BCS
      if iters != self.nBCS:
        # Update Multi Index with BCS Results
        [mIdxNew_np, mIdxAdd_np, mIdxFrnt_np] = uqtkmlti.mi_addfront(self.mIdx_np)
        self.saveDat(mIdxNew_np,'nIdexNew_' + str(iters) + '.dat')
      
        # Redefine PCE with update Multi Index
        mIdxNew_uq = mkSetInt2D(mIdxNew_np);
        pcmodel = uqtkpce.PCSet('NISPnoq',mIdxNew_uq,'LEG')
        self.mIdx_np = uqtkarray.uqtk2numpy(mIdxNew_uq)
        print ''
    
    print ''
    mIdxFin_uq = mkSetInt2D(self.mIdx_np);
    pcmodel = uqtkpce.PCSet('NISPnoq',mIdxFin_uq,'LEG')
    print "Final mIdx size: " + str(self.mIdx_np.shape[0])
    self.pcModel = pcmodel;
    self.wghts_uq = wghts_uq;
Beispiel #6
0
# Number of random samples
n = 100000
######### Forward Propagation using PCEs ##########
# Set verbose to 1 if you want intermediate print statements, otherwise set to 0
verbose = 0
nord = 4  # Order of the PCE
ndim = 12  # Number of dimensions of the PCE
pc_type = "HG"
pc_alpha = 0.0
pc_beta = 1.0
param = nord + 1  # Parameter for quadrature point generation
# Equal to number of quad points per dimension for full quadrature or level for sparse quadrature

# Instantiate PC Object with sparse quadrature methods
pc_model2 = uqtkpce.PCSet("NISPnoq", nord, ndim, pc_type, pc_alpha, pc_beta)
pc_model2.SetQuadRule(pc_type, 'sparse', param)
npce2 = pc_model2.GetNumberPCTerms()  # Number of terms in the PCE
if verbose > 0:
    print "The number of terms in each PCE is", npce2
    pc_model2.PrintMultiIndexNormSquared()

print "\nInstantiation complete"

##### Sparse quadrature methods ######

#Get numpy array of quadrature points
qdpts2, totquat2 = get_quadpts(pc_model2, ndim)

# Convert Quadrature points in \xi_i to equivalent samples of input parameters
# (taking advantage of the fact that inputs are assumed to be Gaussian)
Beispiel #7
0
# define function for evaluation over [-1,1]
f = lambda x: 1. / (1 + x**2)
y = f(x_np)
y.shape = (len(y), )  # make 1d array

# convert numpy y to 1d array
ydata = uqtkarray.dblArray1D(len(y), 0)
ydata.setnpdblArray(y)
'''
Define PCSet object
'''
# Instantiate object
nord = 8
chaos_type = "LEG"
pcmodel = uqtkpce.PCSet('NISPnoq', nord, ndim, 'LEG')

# set quad rule for pc model
pcmodel.SetQuadRule(q)
nup = pcmodel.GetNumberPCTerms() - 1
totquad = pcmodel.GetNQuadPoints()

# Get the multiindex for postprocessing
mindex = uqtkarray.intArray2D()
pcmodel.GetMultiIndex(mindex)

# get the coefficients using the quadrature rule
# to calculate the projections
ck = uqtkarray.dblArray1D(nup + 1, 0.0)
pcmodel.GalerkProjection(ydata, ck)
c_np = zeros(len(ck))
Beispiel #8
0
def run_ddd(components,
            working_directory,
            max_iter=30,
            tolerance=0.01,
            pce_order=3,
            exo_links=[],
            restart=False):
    """
    Perform deterministic domain decomposition wrapped in NISP
    """

    working_directory = os.path.abspath(working_directory)

    # Calculate pce dimension (total number of exogenous ports in network)
    pce_dim = 0
    for comp in components:
        pce_dim += comp.get_num_exogenous_ports()
    pce_dim -= len(exo_links)
    print("Network has %d exogenous ports." % pce_dim)

    # Generate PCE model
    pc_type = "HG"
    pc_alpha = 0.0
    pc_beta = 1.0
    param = pce_order + 1  # Parameter for quadrature point generation. Equal to number of quad points per dimension for full quadrature
    pc_model = uqtkpce.PCSet("NISP", pce_order, pce_dim, pc_type, pc_alpha,
                             pc_beta)
    pc_model.SetQuadRule(pc_type, 'full', param)

    for comp in components:
        comp.pc_model = pc_model

    # Get Quadrature Points
    qdpts_uqtk = uqtkarray.dblArray2D()
    pc_model.GetQuadPoints(qdpts_uqtk)
    totquat = pc_model.GetNQuadPoints()
    qdpts = np.zeros((totquat, pce_dim))
    qdpts_uqtk.getnpdblArray(qdpts)

    # Create and populate working directories for each simulation
    if not restart:
        if os.path.isdir(working_directory):
            shutil.rmtree(working_directory)
        os.makedirs(working_directory)

    for quad_iter in range(totquat):
        # Create subdirectory for each quadrature point
        #   and copy required files into it
        newfolder = os.path.join(working_directory, "qdpt_%d" % quad_iter)
        if not os.path.isdir(newfolder):
            os.makedirs(newfolder)
            for c in components:
                for f in c.get_required_files():
                    shutil.copy2(f, newfolder)

    # Perform iterations
    for jacobi_iter in range(max_iter):
        print("Performing iteration %d..." % jacobi_iter)
        old_endo_data = []
        new_endo_data = []
        exo_port_idx = []
        exogenous_idx = 0
        for compidx, comp in enumerate(components):
            old_endo_data.append(comp.get_endogenous_data())
            running_jobs = []
            for quad_iter in range(totquat):
                targetfolder = os.path.join(working_directory,
                                            "qdpt_%d" % quad_iter)
                os.chdir(targetfolder)
                unique_ports = 0
                my_ports = []
                for portidx, port in enumerate(comp.exogenous_ports):
                    found = False
                    for link in exo_links:
                        if compidx == link[2] and portidx == link[3]:
                            port.value = port.mean + port.std * qdpts[
                                quad_iter, exo_port_idx[link[0]][link[1]]]
                            my_ports.append(exo_port_idx[link[0]][link[1]])
                            found = True
                    if not found:
                        port.value = port.mean + port.std * qdpts[
                            quad_iter, exogenous_idx + unique_ports]
                        my_ports.append(exogenous_idx + unique_ports)
                        unique_ports += 1

                job = comp.execute()
                running_jobs.append(job)

            exo_port_idx.append(my_ports)
            exogenous_idx += len(my_ports)

            # Wait for all simulations to complete
            print("Waiting for aria jobs to complete...")
            for job in running_jobs:
                job.communicate()

            new_endo_data.append(comp.get_endogenous_data())

        # Check for convergence
        maxdiff = 0
        for comp_idx in range(len(components)):
            for timestep, nodal_data in enumerate(old_endo_data[comp_idx]):
                for nid in nodal_data:
                    diff = abs(new_endo_data[comp_idx][timestep][nid] -
                               old_endo_data[comp_idx][timestep][nid])
                    maxdiff = max(maxdiff, diff)
        print(maxdiff)
        if maxdiff < tolerance:
            break

    # Collect update PCE coefficients
    print("Collect Data")
    QoI_pce_coeffs = []
    for comp in components:
        QoI_data = np.zeros(
            (totquat, comp.get_num_QoI() * comp.get_num_timesteps()))
        for quad_iter in range(totquat):
            targetfolder = os.path.join(working_directory,
                                        "qdpt_%d" % quad_iter)
            os.chdir(targetfolder)
            QoI_at_qdpt = comp.get_QoI_data()
            for i, QoI in enumerate(comp.QoIs):
                QoI_data[[quad_iter], (i * comp.get_num_timesteps()):(
                    (i + 1) * comp.get_num_timesteps())] = QoI_at_qdpt[QoI]

        QoI_ck = np.zeros((QoI_data.shape[1], pc_model.GetNumberPCTerms()))
        for i in range(QoI_data.shape[1]):
            QoI_ck[i, ...] = GalerkinProjection(pc_model, QoI_data[:, i])
        QoI_pce_coeffs.append(QoI_ck)

    return QoI_pce_coeffs