Index
 start  module-attribute  ¶
  A Program starting point, alias of empty [ListOfLocations][bloqade.ir.location.list.ListOfLocations].
- Next possible steps to build your program are:
- Specify which level coupling to address with:- start.rydberg: for [- Rydberg][bloqade.builder.coupling.Rydberg] Level coupling
- start.hyperfine: for [- Hyperfine][bloqade.builder.coupling.Hyperfine] Level coupling
- LOCKOUT: You cannot add atoms to your geometry after specifying level coupling.
 
- continue/start building your geometry with:- start.add_position(): to add atom(s) to current register. It will accept:- A single coordinate, represented as a tuple (e.g. (5,6)) with a value that can either be:- integers: (5,6)
- floats: (5.1, 2.5)
- strings (for later variable assignment): ("x", "y")
- [Scalar][bloqade.ir.scalar.Scalar] objects:(2*cast("x"), 5+cast("y"))
 
- integers: 
- A list of coordinates, represented as a list of types mentioned previously.
- A numpy array with shape (n, 2) where n is the total number of atoms
 
- A single coordinate, represented as a tuple (e.g. 
 
AlignedWaveform ¶
 Bases: Waveform
<padded waveform> ::= <waveform> | <waveform> <alignment> <value>
<alignment> ::= 'left aligned' | 'right aligned'
<value> ::= 'left value' | 'right value' | <scalar expr>
AnalogCircuit ¶
AnalogCircuit is a dummy type that bundle register and sequence together.
 register  property  ¶
  Get the register of the program.
Returns:
| Type | Description | 
|---|---|
| register (Union["AtomArrangement", "ParallelRegister"]) | 
Note
If the program is built with [parallelize()][bloqade.builder.emit.Emit.parallelize], The the register will be a [ParallelRegister][bloqade.ir.location.base.ParallelRegister]. Otherwise it will be a [AtomArrangement][bloqade.ir.location.base.AtomArrangement].
show ¶
Interactive visualization of the program
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| **assignments | assigning the instance value (literal) to the existing variables in the program | {} | 
AtomArrangement ¶
 Bases: ProgramStart
Source code in src/bloqade/analog/builder/base.py
  add_position ¶
Add a position or multiple positions to a pre-existing geometry.
add_position is capable of accepting: - A single tuple for one atom coordinate: (1.0, 2.5) - A list of tuples: `[(0.0, 1.0), (2.0,1.5), etc.] - A numpy array of shape (N, 2) where N is the number of atoms
You may also intersperse variables anywhere a value may be present.
You can also pass in an optional argument which determines the atom "filling" (whether or not at a specified coordinate an atom should be present).
Usage Example:¶
# single coordinate
>>> reg = start.add_position((0,0))
# you may chain add_position calls
>>> reg_plus_two = reg.add_position([(2,2),(5.0, 2.1)])
# you can add variables anywhere a value may be present
>>> reg_with_var = reg_plus_two.add_position(("x", "y"))
# and specify your atom fillings
>>> reg_with_filling = reg_with_var.add_position([(3.1, 0.0), (4.1, 2.2)],
[True, False])
# alternatively you could use one boolean to specify
# all coordinates should be empty/filled
>>> reg_with_more_filling = reg_with_filling.add_positions([(3.1, 2.9),
(5.2, 2.2)], False)
- Next possible steps are:
- Continuing to build your geometry via:- ...add_position(positions).add_position(positions): to add more positions
- ...add_position(positions).apply_defect_count(n_defects): to randomly drop out n_atoms
- ...add_position(positions).apply_defect_density(defect_probability): to drop out atoms with a certain probability
- ...add_position(positions).scale(scale): to scale the geometry
 
- Targeting a level coupling once you're done with the atom geometry:- ...add_position(positions).rydberg: to specify Rydberg coupling
- ...add_position(positions).hyperfine: to specify Hyperfine coupling
 
- Visualizing your atom geometry:- ...add_position(positions).show(): shows your geometry in your web browser
 
Source code in src/bloqade/analog/ir/location/location.py
 apply_defect_count ¶
Drop n_defects atoms from the geometry randomly. Internally this occurs by setting certain sites to have a SiteFilling set to false indicating no atom is present at the coordinate.
A default numpy-based Random Number Generator is used but you can explicitly override this by passing in your own.
Usage Example:¶
>>> from bloqade.analog.atom_arrangement import Chain
>>> import numpy as np
# set a custom seed for a numpy-based RNG
>>> custom_rng = np.random.default_rng(888)
# randomly remove two atoms from the geometry
>>> reg = Chain(11).apply_defect_count(2, custom_rng)
# you may also chain apply_defect_count calls
>>> reg.apply_defect_count(2, custom_rng)
# you can also use apply_defect_count on custom geometries
>>> from bloqade import start
>>> start.add_position([(0,0), (1,1)]).apply_defect_count(1, custom_rng)
- Next possible steps are:
- Continuing to build your geometry via:- ...apply_defect_count(defect_counts).add_position(positions): to add more positions
- ...apply_defect_count(defect_counts) .apply_defect_count(n_defects): to randomly drop out n_atoms
- ...apply_defect_count(defect_counts) .apply_defect_density(defect_probability): to drop out atoms with a certain probability
- ...apply_defect_count(defect_counts).scale(scale): to scale the geometry
 
- Targeting a level coupling once you're done with the atom geometry:- ...apply_defect_count(defect_counts).rydberg: to specify Rydberg coupling
- ...apply_defect_count(defect_counts).hyperfine: to specify Hyperfine coupling
 
- Visualizing your atom geometry:- ...apply_defect_count(defect_counts).show(): shows your geometry in your web browser
 
Source code in src/bloqade/analog/ir/location/location.py
 apply_defect_density ¶
Drop atoms randomly with defect_probability probability (range of 0 to 1). Internally this occurs by setting certain sites to have a SiteFilling set to false indicating no atom is present at the coordinate.
A default numpy-based Random Number Generator is used but you can explicitly override this by passing in your own.
Usage Example:¶
>>> from bloqade.analog.atom_arrangement import Chain
>>> import numpy as np
# set a custom seed for a numpy-based RNG
>>> custom_rng = np.random.default_rng(888)
# randomly remove two atoms from the geometry
>>> reg = Chain(11).apply_defect_density(0.2, custom_rng)
# you may also chain apply_defect_density calls
>>> reg.apply_defect_count(0.1, custom_rng)
# you can also use apply_defect_density on custom geometries
>>> from bloqade import start
>>> start.add_position([(0,0), (1,1)])
.apply_defect_density(0.5, custom_rng)
- Next possible steps are:
- Continuing to build your geometry via:- ...apply_defect_count(defect_counts).add_position(positions): to add more positions
- ...apply_defect_count(defect_counts).apply_defect_count(n_defects): to randomly drop out n_atoms
- ...apply_defect_count(defect_counts) .apply_defect_density(defect_probability): to drop out atoms with a certain probability
- ...apply_defect_count(defect_counts).scale(scale): to scale the geometry
 
- Targeting a level coupling once you're done with the atom geometry:- ...apply_defect_count(defect_counts).rydberg: to specify Rydberg coupling
- ...apply_defect_count(defect_counts).hyperfine: to specify Hyperfine coupling
 
- Visualizing your atom geometry:- ...apply_defect_count(defect_counts).show(): shows your geometry in your web browser
 
Source code in src/bloqade/analog/ir/location/location.py
 enumerate ¶
figure ¶
obtain a figure object from the atom arrangement.
rydberg_interaction ¶
calculate the Rydberg interaction matrix.
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| **assignments | the values to assign to the variables in the register. | {} | 
Returns:
| Name | Type | Description | 
|---|---|---|
| NDArray | NDArray | the Rydberg interaction matrix in the lower triangular form. | 
Source code in src/bloqade/analog/ir/location/location.py
 scale ¶
Scale the geometry of your atoms.
Usage Example:¶
>>> reg = start.add_position([(0,0), (1,1)])
# atom positions are now (0,0), (2,2)
>>> new_reg = reg.scale(2)
# you may also use scale on pre-defined geometries
>>> from bloqade.analog.atom_arrangement import Chain
# atoms in the chain will now be 2 um apart versus
# the default 1 um
>>> Chain(11).scale(2)
- Next possible steps are:
- Continuing to build your geometry via:- ...add_position(positions).add_position(positions): to add more positions
- ...add_position(positions).apply_defect_count(n_defects): to randomly drop out n_atoms
- ...add_position(positions).apply_defect_density(defect_probability): to drop out atoms with a certain probability
- ...add_position(positions).scale(scale): to scale the geometry
 
- Targeting a level coupling once you're done with the atom geometry:- ...add_position(positions).rydberg: to specify Rydberg coupling
- ...add_position(positions).hyperfine: to specify Hyperfine coupling
 
- Visualizing your atom geometry:- ...add_position(positions).show(): shows your geometry in your web browser
 
Source code in src/bloqade/analog/ir/location/location.py
 BoundedBravais ¶
 Bases: AtomArrangement
Source code in src/bloqade/analog/builder/base.py
   __match_args__  class-attribute instance-attribute  ¶
  Base classe for Bravais lattices [AtomArrangement][bloqade.ir.location.base.AtomArrangement].
- [Square][bloqade.ir.location.bravais.Square]
- [Chain][bloqade.ir.location.bravais.Chain]
- [Honeycomb][bloqade.ir.location.bravais.Honeycomb]
- [Triangular][bloqade.ir.location.bravais.Triangular]
- [Lieb][bloqade.ir.location.bravais.Lieb]
- [Kagome][bloqade.ir.location.bravais.Kagome]
- [Rectangular][bloqade.ir.location.bravais.Rectangular]
 n_dims  property  ¶
  dimension of the lattice
Returns:
| Name | Type | Description | 
|---|---|---|
| int | dimension of the lattice | 
coordinates ¶
calculate the coordinates of a cell in the lattice given the cell index.
Source code in src/bloqade/analog/ir/location/bravais.py
 scale ¶
Scale the current location with a factor.
(x,y) -> factor*(x,y)
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| factor | str | Real | Decimal | Scalar | scale factor | required | 
Returns:
| Name | Type | Description | 
|---|---|---|
| BoundedBravais | BoundedBravais | The lattice with the scaled locations | 
Source code in src/bloqade/analog/ir/location/bravais.py
 Chain ¶
 Bases: BoundedBravais
Chain lattice.
- 1D lattice
- primitive (cell) vector(s)- a1 = (1,0).
 
- unit cell (1 atom(s))- loc (0,0)
 
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| L | int | number of sites in the chain | required | 
| lattice_spacing | (Scalar, Real) | lattice spacing. Defaults to 1.0. | 1.0 | 
- Possible Next: continue with .to see possible next step in auto-prompt supported setting (IPython, IDE ...)
Source code in src/bloqade/analog/ir/location/bravais.py
  Constant ¶
 Bases: Instruction
f(t=0:duration) = value
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| value | Scalar | the constant value | required | 
| duration | Scalar | the time span of the constant waveform. | required | 
Source code in src/bloqade/analog/ir/control/waveform.py
  Field ¶
 Bases: FieldExpr
Field node in the IR. Which contains collection(s) of [Waveform][bloqade.ir.control.waveform.Waveform]
show ¶
Interactive visualization of the Field
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| **assignments | assigning the instance value (literal) to the existing variables in the Field | {} | 
Honeycomb ¶
 Bases: BoundedBravais
Honeycomb lattice.
- 2D lattice
- primitive (cell) vector(s)- a1 = (1, 0)
- a2 = (½, sqrt(3)/2)
 
- unit cell (2 atom(s))- loc1 (0, 0)
- loc2 (½, 1/(2*sqrt(3))
 
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| L1 | int | number of unit cells in linear direction. n_atoms = L1 * L1 * 2. | required | 
| L2 | Optional[int] | number of unit cells in direction a2. n_atoms = L1 * L2 * 2, default is L1. | None | 
| lattice_spacing | (Scalar, Real) | lattice spacing. Defaults to 1.0. | 1.0 | 
- Possible Next: continue with .to see possible next step in auto-prompt supported setting (IPython, IDE ...)
Source code in src/bloqade/analog/ir/location/bravais.py
  Kagome ¶
 Bases: BoundedBravais
Kagome lattice.
- 2D lattice
- primitive (cell) vector(s)- a1 = (1, 0)
- a2 = (½, sqrt(3)/2)
 
- unit cell (3 atom(s))- loc1 (0, 0)
- loc2 (0.5, 0)
- loc3 (0.25 ,0.25sqrt(3))
 
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| L1 | int | number of sites in linear direction. n_atoms = 3 * L1 * L1. | required | 
| L2 | Optional[int] | number of unit cells along a2 direction, n_atoms = 3 * L1 * L2, default is L1. | None | 
| lattice_spacing | (Scalar, Real) | lattice spacing. Defaults to 1.0. | 1.0 | 
- Possible Next: continue with .to see possible next step in auto-prompt supported setting (IPython, IDE ...)
Source code in src/bloqade/analog/ir/location/bravais.py
  Lieb ¶
 Bases: BoundedBravais
Lieb lattice.
- 2D lattice
- primitive (cell) vector(s)- a1 = (1, 0)
- a2 = (0, 1)
 
- unit cell (3 atom(s))- loc1 (0, 0)
- loc2 (0.5, 0)
- loc3 (0 ,0.5)
 
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| L1 | int | number of unit cells in linear direction. n_atoms = 3* L1 * L1. | required | 
| L2 | Optional[int] | number of unit cells along a2 direction, n_atoms = 3 * L1 * L2, default is L1. | None | 
| lattice_spacing | (Scalar, Real) | lattice spacing. Defaults to 1.0. | 1.0 | 
- Possible Next: continue with .to see possible next step in auto-prompt supported setting (IPython, IDE ...)
Source code in src/bloqade/analog/ir/location/bravais.py
  Linear ¶
 Bases: Instruction
f(t=0:duration) = start + (stop-start)/duration * t
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| start | Scalar | start value | required | 
| stop | Scalar | stop value | required | 
| duration | Scalar | the time span of the linear waveform. | required | 
Source code in src/bloqade/analog/ir/control/waveform.py
  Literal ¶
 Bases: Real
 value  instance-attribute  ¶
  Scalar Literal, which stores a decimaal value instance.
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| value | Decimal | decimal value instance | required | 
Poly ¶
 Bases: Instruction
f(t=0:duration) = c[0] + c[1]t + c[2]t^2 + ... + c[n-1]t^n-1 + c[n]t^n
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| coeffs | Tuple[Scalar] | the coefficients c[] of the polynomial. | required | 
| duration | Scalar | the time span of the waveform. | required | 
Source code in src/bloqade/analog/ir/control/waveform.py
  Pulse ¶
PythonFn ¶
Rectangular ¶
 Bases: BoundedBravais
Rectangular lattice.
- 2D lattice
- primitive (cell) vector(s)- a1 = (1,0)
- a2 = (0,1)
 
- unit cell (1 atom(s))- loc (0,0)
 
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| width | int | number of sites in x direction. | required | 
| height | int | number of sites in y direction. | required | 
| lattice_spacing_x | (Scalar, Real) | lattice spacing. Defaults to 1.0. | 1.0 | 
| lattice_spacing_y | (Scalar, Real) | lattice spacing in y direction. optional. | 1.0 | 
- Possible Next: continue with .to see possible next step in auto-prompt supported setting (IPython, IDE ...)
Source code in src/bloqade/analog/ir/location/bravais.py
 Scalar ¶
Base class for all scalar expressions.
<scalar> ::= <literal>
| <variable>
| <default>
| <negative>
| <add>
| <mul>
| <min>
| <max>
| <slice>
| <inverval>
<mul> ::= <scalar> '*' <scalar>
<add> ::= <scalar> '+' <scalar>
<min> ::= 'min' <scalar>+
<max> ::= 'max' <scalar>+
<slice> ::= <scalar expr> '[' <interval> ']'
<interval> ::= <scalar expr> '..' <scalar expr>
<real> ::= <literal> | <var>
Sequence ¶
 Bases: SequenceExpr
Sequence of a program, which includes pulses informations.
show ¶
Interactive visualization of the Sequence
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| **assignments | assigning the instance value (literal) to the existing variables in the Sequence | {} | 
Source code in src/bloqade/analog/ir/control/sequence.py
  Square ¶
 Bases: BoundedBravais
Square lattice.
- 2D lattice
- primitive (cell) vector(s)- a1 = (1,0)
- a2 = (0,1)
 
- unit cell (1 atom(s))- loc (0,0)
 
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| L1 | int | number of sites in linear direction. n_atoms = L1 * L1. | required | 
| L2 | Optional[int] | number of sites in direction a2. n_atoms = L1 * L2, default is L1 | None | 
| lattice_spacing | (Scalar, Real) | lattice spacing. Defaults to 1.0. | 1.0 | 
- Possible Next: continue with .to see possible next step in auto-prompt supported setting (IPython, IDE ...)
Source code in src/bloqade/analog/ir/location/bravais.py
  Triangular ¶
 Bases: BoundedBravais
Triangular lattice.
- 2D lattice
- primitive (cell) vector(s)- a1 = (1, 0)
- a2 = (½, sqrt(3)/2)
 
- unit cell (1 atom(s))- loc (0, 0)
 
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| L | int | number of sites in linear direction. n_atoms = L * L. | required | 
| L2 | Optional[int] | number of sites along a2 direction, n_atoms = L1 * L2, default is L1. | None | 
| lattice_spacing | (Scalar, Real) | lattice spacing. Defaults to 1.0. | 1.0 | 
- Possible Next: continue with .to see possible next step in auto-prompt supported setting (IPython, IDE ...)
Source code in src/bloqade/analog/ir/location/bravais.py
  Variable ¶
 Bases: Real
Variable, which stores a variable name.
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| name | str | variable instance. | required | 
Waveform ¶
 Bases: HashTrait, CanonicalizeTrait
Waveform node in the IR.
- [<instruction>][bloqade.ir.control.waveform.Instruction]
- [<smooth>][bloqade.ir.control.waveform.Smooth]
- [<slice>][bloqade.ir.control.waveform.Slice]
- [<apppend>][bloqade.ir.control.waveform.Append]
- [<negative>][bloqade.ir.control.waveform.Negative]
- [<scale>][bloqade.ir.control.waveform.Scale]
- [<add>][bloqade.ir.control.waveform.Add]
- [<record>][bloqade.ir.control.waveform.Record]
- [<sample>][bloqade.ir.control.waveform.Sample]
<waveform> ::= <instruction>
    | <smooth>
    | <slice>
    | <append>
    | <negative>
    | <scale>
    | <add>
    | <record>
    | <sample>
figure ¶
get figure of the plotting the waveform.
Returns:
| Name | Type | Description | 
|---|---|---|
| figure | a bokeh figure | 
cast ¶
-  cast Real number (or list/tuple of Real numbers) to [ Scalar Literal][bloqade.ir.scalar.Literal].
-  cast str (or list/tuple of Real numbers) to [ Scalar Variable][bloqade.ir.scalar.Variable].
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| py | Union[str, Real, Tuple[Real], List[Real]] | python object to cast | required | 
Returns:
| Type | Description | 
|---|---|
| Scalar | Scalar | 
Source code in src/bloqade/analog/ir/scalar.py
 var ¶
cast string (or list/tuple of strings) to [Variable][bloqade.ir.scalar.Variable].
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| py | Union[str, List[str]] | a string or list/tuple of strings | required | 
Returns:
| Type | Description | 
|---|---|
| Variable | Union[Variable] |