Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    Sarah Kasier
    @crazy4pi314

    Seconded! :sparkling_heart:

    To the bit about not really using circuit representations, that goes to the design goal again where the user shouldn't need to think about specific gate sequences (people building the language and runtime are) to be able to code their quantum program. As a former QC researcher myself who really liked the circuit representations (I was an experimentalist :P ), I have really grown to like not having to use them, and thinking more like I would for writing in any other programming language when I write quantum code (maps/apply/list comprehensions/types etc.).

    Sarah Kasier
    @crazy4pi314
    .m. Me mm
    Amir Ebrahimi
    @amirebrahimi
    Thank you both for this information. Since this is a different approach it might be helpful to call it out from the outset in the documentation for newcomers. I find that "setting the frame" can help to put someone into a specific mindset. Ideally, I'd put this info at every entry point where Q# is mentioned in the docs. I'd be happy to make the PR to the docs assuming this is agreeable, @cgranade. NM, for some reason I thought that the docs were in a github repo. I can create an issue for it though if preferred.
    Sarah Kasier
    @crazy4pi314
    You can find a list of the official repos in the docs or on https://qsharp.community/resources/#
    Amir Ebrahimi
    @amirebrahimi
    Ahh...in that case, I'll just wait to hear from you @cgranade if you like what I'm proposing.
    Amir Ebrahimi
    @amirebrahimi
    @crazy4pi314 - re: your suggestion - would it be something like PrepareArbitraryOperation(unitary : Microsoft.Quantum.Math.Complex[][]) that would then decompose into sequences of instructions?
    Chris Granade
    @cgranade
    @amirebrahimi: I'm not personally in charge of docs (I help out here and there, but my main job is running the Q# libraries), but if you want to file an issue on the docs repo that @crazy4pi314 linked to, or even start a pull request, the docs team can chime in that way. I'm also happy to provide feedback if that'd be helpful.
    Amir Ebrahimi
    @amirebrahimi
    Thanks. Will do. Also in my previous comment I tagged @crazy4pi314, but see that you actually made the suggestion.
    Mridul Sarkar
    @mridulsar
    anyone here have an idea as to why this error is being thrown? I have opened the necessary name space for this. fail: Microsoft.Quantum.IQSharp.Workspace[0]
    QS5022: No identifier with the name "ApplytoEach" exists.
    Sarah Kasier
    @crazy4pi314
    Sometimes that can come up it the version numbers for different components don't match? Without more detail it's hard to diagnose.

    New Show Starting TODAY! πŸŽ‰

    Come join me on #twitchtv and ask me your burning questions about #QSharp, #QuantumComputing more generally, or what its like working in a quantum optics lab or as a quantum software developer!

    πŸ‘€Tuesdays 10am-12pm PDT: twitch.tv/crazy4pi314

    Mridul Sarkar
    @mridulsar
    Thank you for the quick reply! I will post a snippet of code shortly so the question is more clear.
    Sarah Marshall
    @samarsha

    QS5022: No identifier with the name "ApplytoEach" exists.

    Q# is case-sensitive, can you try changing ApplytoEach to ApplyToEach in your code?

    Mridul Sarkar
    @mridulsar
    Oh wow, haha should have got some sleep and worked on it. That did it for me. Thanks for catching that @samarsha
    Sarah Kasier
    @crazy4pi314
    Good catch @samarsha πŸ’—
    Sarah Marshall
    @samarsha
    No problem :) It would be cool if the error message/IDE was more helpful here, there's a feature request for that: microsoft/qsharp-compiler#205
    Chris Granade
    @cgranade
    @samarsha Nice! πŸ’•
    @amirebrahimi: Apologies for missing your message! I guess my suggestion was just that an ApplyUnitaryOperation operation that takes a Complex[][] input to describe a unitary and a LittleEndian register to apply it to would be a nice parallel to the existing PrepareArbitraryState operation.
    Amir Ebrahimi
    @amirebrahimi
    Thanks for confirming, @cgranade. Sounds like something fun to work on. I'll dig around to see how hard it is to convert arbitrary unitaries to gate operations.
    Harshit Garg
    @githg22_gitlab
    Do I need to update my Q# for the codeforces main event?
    I have 2005 one rn
    Just asking in advance
    Since I saw there was a 2006 version release
    Mariia Mykhailova
    @tcNickolas_twitter
    @githg22_gitlab I'm not sure we even have 2005... :-) Codeforces tester uses 0.11.2004.2825, same as in the warmup round
    Harshit Garg
    @githg22_gitlab
    My bad. Must be 2004 then.
    Seems good then, thanks
    Chris Granade
    @cgranade
    You can always see the list of releases for any given package at nuget.org. For instance, the list of versions for the IQ# tool are up at https://www.nuget.org/packages/Microsoft.Quantum.IQSharp. As @tcNickolas_twitter notes, there is no 0.11.2005.* version, as our release for that month came in the early days of June instead.
    Amir Ebrahimi
    @amirebrahimi

    When I have two using blocks one after another, I notice some odd behavior w/ Reset() by looking at the output of DumpRegister(). Ex:

    using (q1 = Qubit()) {
                X(q1);
                Rz(PI() / 2.0, q1);
                DumpRegister((), [q1]);
                let m1 = M(q1);
                Reset(q1);
            }
    using (q1 = Qubit()) {
                ResetAll([q1]);
                DumpRegister((), [q1]);
                Reset(q1);
            }

    Output:

    # wave function for qubits with ids (least to most significant): 0
    ∣0❭:     0.000000 +  0.000000 i  ==                          [ 0.000000 ]
    ∣1❭:     0.707107 +  0.707107 i  ==     ********************* [ 1.000000 ]      /  [  0.78540 rad ]
    # wave function for qubits with ids (least to most significant): 0
    ∣0❭:     0.707107 +  0.707107 i  ==     ********************* [ 1.000000 ]      /  [  0.78540 rad ]
    ∣1❭:     0.000000 +  0.000000 i  ==                          [ 0.000000 ]

    It did reset back to |0>, but looks like the state isn't reflecting that correctly. Any idea why?

    Chris Granade
    @cgranade
    @amirebrahimi The state (1 / √2 + 𝑖 / √2) |0⟩ is identical to |0⟩, up to a global phase, such that the state reported in the last call to DumpRegister((), _) shows that the register is in fact in the |0⟩ state following the call to the ResetAll operation.
    Chris Granade
    @cgranade
    @amirebrahimi Another way to see that is to write out the coefficient of each basis state in what's called phasor notation. For instance, 0 = 𝑒^{𝑖 0 Ο€}, while (1 / √2 + 𝑖 / √2) = 𝑒^{𝑖 Ο€ / 4}, so that you can think of (1 / √2 + 𝑖 / √2) as being a 45Β° phase. If you use IQ# to call DumpMachine, then you can get the rich HTML output, which visualizes that coefficient as an arrow rotated by 45Β°.
    Sarah Kasier
    @crazy4pi314
    Also a heads up, @bettinaheim and I'll will be working on extending the Q# compiler today on stream in about 30min : twitch.tv/crazy4pi314
    Chris Granade
    @cgranade
    @crazy4pi314 πŸ’•
    Amir Ebrahimi
    @amirebrahimi
    Thanks, @cgranade. I suppose it is done this way in the simulator to simulate actual quantum hardware where a Reset() won't guarantee that all global phase will be removed?
    vashisth malik
    @VashisthMalik_twitter
    can i use dumpregister feature somewhere online ?
    Amir Ebrahimi
    @amirebrahimi

    What's the easiest way to create a phased operator (e.g. -XZ)? Ideally, I'd like to make it generic like ApplyPauli, but I haven't figured out the syntax yet. A function doesn't work because it seems I can only return one operation and can't apply many in sequence.

    For example:

    function FixedR(theta : Double, op : ((Double, Qubit) => Unit is Adj+Ctl)) : (Qubit => Unit is Adj+Ctl) {
            return op(theta, _);
    }

    allowed me to create a testing harness for A5 from the Q# challenge.

    Ideally, I'd like to not have to define it explicitly:
    operation negXZ (qubit : Qubit) : Unit is Adj+Ctl {
            body (...) {
                R(PauliI, PI(), qubit);
                X(qubit);
                Z(qubit);
         }
    }
    Amir Ebrahimi
    @amirebrahimi
    Another common thing I run into is needing to convert between an operation with one qubit to an operation that takes multiple qubits (e.g. where I'd essentially call op(qubits[0])). Any helper functions for that?
    Chris Granade
    @cgranade
    @VashisthMalik_twitter: The QDK samples, the katas, and code for the book that @crazy4pi314 and I wrote all can be used online through mybinder.org, so that you can use DumpRegister() and DumpMachine() to explore those samples and tutorials.
    @amirebrahimi The key thing is that global phases have no basis in physical reality, and are effectively an artifact of how we write down vectors (indeed, if you work with density operators instead of state vectors, global phases disappear entirely). From that standpoint, 𝑋𝑍 and βˆ’π‘‹π‘ are two different unitary matrices representing the exact same operation. On the other hand, using the Controlled functor can turn what were global phases into locally observable phases.
    @amirebrahimi For the other part of your question, some of library operations and functions like Bound can be used to return a single operation representing a sequence of operations without needing to wrap them in a new operation. For example, your negXZ could be written as let negXZ = BoundCA([R(PauliI, PI(), _), X, Z]);.
    Chris Granade
    @cgranade
    Similarly, ApplyToEach, ApplyToFirst, and so forth can be really useful operations for cases like op(qubits[0]);. If you want lambda support in Q#, @bettinaheim has been discussing that feature request at microsoft/qsharp-compiler#181.
    Amir Ebrahimi
    @amirebrahimi
    Much apreesh @cgranade
    Chris Granade
    @cgranade
    No worries, @amirebrahimi. Happy to help. Thanks to @crazy4pi314 and the rest of the qsharp.community team for creating and maintaining this space to discuss Q#!
    Mridul Sarkar
    @mridulsar
    Hey all, I was wondering if something like ApplyToEach can be used on a BE or LE. I could not find anything in the docs. I could be misguided in understanding that ApplyToEach cannot be applied to BE or LE registers.
    Also, how can I make ApplyToEach look pretty, ie @cgranade did so earlier
    i guess my larger question is, a data type of 'T[] (= or != ) LE/BE
    Chris Granade
    @cgranade
    @mridulsar: From the perspective of the Q# type system, a value of type LittleEndian is a single atomic value. If you have an array of little-endian registers (that is, LittleEndian[]), then ApplyToEach works great over that array. On the other hand, if you want to apply an operation to each qubit making up a single LittleEndian register, you can unwrap it with the unwrap operator (!) to get an array of type Qubit[].
    @crazy4pi314, do you recall the page reference in the book where we explain that? Also, @mridulsar, you may want to check out this part of the docs: https://docs.microsoft.com/en-us/quantum/user-guide/language/expressions#unwrap-expressions
    Mridul Sarkar
    @mridulsar
    Thank you Chris, I see the hole in my knowledge is understanding how LittleEndian is encoded and for what practical applications this can be used. I am understanding LE/BE encoding takes a singular integer by its binary values, the order of the values respective to the type of Endian encoding. I tried doing a google search for quantum BE papers but could not come up with anything nice to read. If you had suggestions on papers I could read to understand this topic I would greatly appreciate it.