Giter VIP home page Giter VIP logo

silq's Introduction

Silq

Silq is a high-level programming language for quantum computing with a strong static type system. More information: https://silq.ethz.ch

Installation

To install via vscode without building from source, see: https://silq.ethz.ch/install

Build Instructions

GNU/Linux and OSX

Quick build

  1. Run dependencies-release.sh to download the LDC D compiler into the local directory.

  2. Run build-release.sh to build Silq.

Additional information

Silq is written in the D programming language. D compilers are available at http://dlang.org/download.html.

FreeBSD

Silq can be built from a port or installed as a binary package on FreeBSD/amd64. Other FreeBSD platforms do currently lack the D language support required by silq.

To install from source, assuming an up-to-date ports tree is available:

$ cd /usr/ports/lang/silq
$ make install

(Or use portmaster or any of the other ports management tools available in FreeBSD ...)

To install from a package:

$ pkg install silq

Other platforms

The build instructions given here are for GNU/Linux and OSX. Silq can also be built on other platforms. Feel free to write a pull request with working build scripts for your favourite platform.

Example

$ ./dependencies-release.sh && ./build-release.sh

Using Silq

Run ./silq example.slq, where example.slq is a Silq source file to type check that source file.

Run ./silq example.slq --run, where example.slq is a Silq source file to type check and simulate the main function in that source file.

Additional command-line options

Run ./silq --help to display information about supported command-line options.

silq's People

Contributors

abeervaishnav13 avatar axrj avatar bvoq avatar hvenev avatar kapf avatar m-baader avatar misailo avatar pedrozudo avatar stesser avatar tgehr avatar thilinarmtb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

silq's Issues

Error upon creating new files in vscode, can't use silq.

As soon as I create a new .slq file, this error pops up in the OUTPUT window:

ERROR:
dyld: lazy symbol binding failed: Symbol not found: _dyld_enumerate_tlv_storage
  Referenced from: /Users/foxtrot/.vscode/extensions/eth-sri.vscode-silq-0.0.28/bin/silq-osx
  Expected in: /usr/lib/libSystem.B.dylib

dyld: Symbol not found: _dyld_enumerate_tlv_storage
  Referenced from: /Users/foxtrot/.vscode/extensions/eth-sri.vscode-silq-0.0.28/bin/silq-osx
  Expected in: /usr/lib/libSystem.B.dylib

I installed these three extensions: eth-sri.vscode-silq (v0.0.28), mamoruds.silqmft-vscode (v0.0.3) and freebroccolo.input-assist (v0.0.7), currently running on Visual Studio Code 1.48.1 on macOS Catalina 10.15.6. I installed Apple's own Command Line tools (xcode-select --install) without downloading Xcode.
This happens every time with any file of this type, thus I've not been able to run any silq code so far. Is there any fix?

Compilation to circuits?

I have been very excited to compile my silq experiments and run on the built-in simulator. In the interest of broadening to other simulators, I wonder if there has been any work on compiling to formats such as QASM or other circuit notation formats?

I think even the ability to compile to a non-standard output format (perhaps just a list of operations) would be extremely cool.

Amazing language!!

Module imports

Hi team!

I'm curious if there has been any discussion about code packaging or library design, or, more generally, file imports:

import foo from "foo.slq"

def main() {
    return foo(...)
}

Right now, I run a simple script that replaces "import X" in my files with the contents of file X in that directory. Hacky, but helps with organization, and centralizing commonly-used util functions. But of course this is a poor substitute for real imports, and means that there's no good type-checking until runtime!

AssertError occured using the phase function and vector

I guess this is an issue of type, but I can't isolate the problem between phase and vector.

Environments

https://github.com/eccyan/silq-example/blob/master/tools/Dockerfile

Test codes

def R (q:B, const k:!N) {
    if q { phase(k * Ο€) }
    return q;
}

def main(){
  qs := vector(2, 0:B);
  qs[0] := H(qs[0]);
  qs[1] := R(qs[1], 1);
  return qs;
}

Error messages

[email protected](442): Assertion failure
----------------
??:? _d_assert [0x7fada01fa73c]
??:? [0x5d3202]
??:? [0x5cd6b0]
??:? [0x5cdc6c]
??:? [0x5cdcf9]
??:? [0x5cef0b]
??:? [0x60d692]
??:? [0x5cc202]
??:? [0x5f01c1]
??:? [0x5f9fc6]
??:? [0x5fd3a6]
??:? [0x60c890]
??:? [0x5cc202]
??:? [0x5ac4ae]
??:? [0x5abedc]
??:? [0x5ac8ce]
??:? void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).runAll() [0x7fada0224eef]
??:? _d_run_main [0x7fada0224d07]
??:? __libc_start_main [0x7fad9fe311a2]
??:? [0x4c3f7d]

Thanks.

Cann't run silq in vscode

I already installed the two packages that is necessary and add silq in json file but every time i run silq code it says that code language is not supported or defined. plz, Se those picture

pack
json

Adding docker support

Hello everyone πŸ‘‹πŸ»

I really admire your work.

Just having a consideration to add support for distributing silq to docker environments.

Your work is so amazing! Please keep it up, you are inspiring me!

Best regards

Timo Sarkar

Dependency and Build File Error

Problem Statement

Hi Everyone, I am trying to install silq in macOS environment and I am facing issues with running the dependencies.sh and build.sh file.

Environment

  1. zsh shell
  2. bash shell

Error Image

Screen Shot 2020-06-18 at 12 50 39 PM

Please guide me! πŸ™

Function calls omitting variables in square brackets causes errors when reversing

Variables in square brackets can be omitted in function calls if they can be derived from variables in the operation. For example:

def op[n:!N](q:uint[n], anc:B){
  for i in [0..n){
    anc xorb=q[i];
  }
}

n:=5;

def main(){
  q := 0:uint[n];
  anc := op(q, 0:B);
  ...
}

When reversing, omitting the square brackets causes an error:

def main(){
  q := 0:uint[n];
  (q, anc) := op(q, 0:B);
  (q, 0:B) := reverse(op)(q, anc); // Error
  return q;
}

A current workaround is to include the square brackets within the reverse call reverse(op[n])(...), but perhaps there is a way to avoid this.

(I am currently using the vscode extension for Silq but not sure if this error occurs in other builds.)

Having troubles with running shor.slq (VS Code extension)

I was trying to test the script, however, I cannot execute it.

After attempting a run via the terminal, I received the following output:
lq shor.slq --run
object.Exception@ast/declaration.d(106): TODO

??:? D3std9exception__T7bailOutHTC9ExceptionZQwFNaNfAyamMAxaZNn [0x55f6eef3b5ae]
??:? pure @safe bool std.exception.enforce!().enforce!(bool).enforce(bool, lazy const(char)[], immutable(char)[], ulong) [0x55f6eef3b526]
??:? ast.declaration.FunctionDef ast.declaration.FunctionDef.copyImpl(ast.expression.Expression.CopyArgs) [0x55f6eee224a0]
??:? ast.expression.Expression ast.expression.Expression.copy!(ast.expression.Expression).copy(ast.expression.Expression.CopyArgs) [0x55f6eee3e0b4]
??:? ast.expression.Expression ast.expression.CompoundExp.copyImpl(ast.expression.Expression.CopyArgs).lambda2!(ast.expression.Expression).lambda2(ast.expression.Expression) [0x55f6eee3f034]
??:? @Property ast.expression.Expression std.algorithm.iteration.MapResult!(ast.expression.CompoundExp.copyImpl(ast.expression.Expression.CopyArgs).lambda2, ast.expression.Expression[]).MapResult.front() [0x55f6eee3f144]
??:? ast.expression.Expression[] std.array.array!(std.algorithm.iteration.MapResult!(ast.expression.CompoundExp.copyImpl(ast.expression.Expression.CopyArgs).lambda2, ast.expression.Expression[]).MapResult).array(std.algorithm.iteration.MapResult!(ast.expression.CompoundExp.copyImpl(ast.expression.Expression.CopyArgs).lambda2, ast.expression.Expression[]).MapResult) [0x55f6eefdef3a]
??:? ast.expression.CompoundExp ast.expression.CompoundExp.copyImpl(ast.expression.Expression.CopyArgs) [0x55f6eee2d847]
??:? ast.expression.CompoundExp ast.expression.Expression.copy!(ast.expression.CompoundExp).copy(ast.expression.Expression.CopyArgs) [0x55f6eee3e270]
??:? ast.expression.Expression ast.semantic
.statementSemantic(ast.expression.Expression, ast.scope
.Scope) [0x55f6eeef61dc]
??:? ast.expression.CompoundExp ast.semantic
.compoundExpSemantic(ast.expression.CompoundExp, ast.scope
.Scope, ast.type.Annotation) [0x55f6eeef7210]
??:? ast.declaration.FunctionDef ast.semantic
.functionDefSemantic(ast.declaration.FunctionDef, ast.scope
.Scope) [0x55f6eef08e12]
??:? ast.expression.Expression ast.semantic
.typeForDecl(ast.declaration.Declaration) [0x55f6eef0a923]
??:? ast.expression.Expression ast.semantic
.expressionSemantic(ast.expression.Expression, ast.scope
.Scope, ast.semantic
.ConstResult, ast.semantic
.InType) [0x55f6eef00cd6]
??:? ast.expression.Expression ast.semantic_.callSemantic(ast.expression.CallExp, ast.scope_.Scope, ast.semantic_.ConstResult, ast.semantic_.InType) [0x55f6eeefce02]
??:? ast.expression.Expression ast.semantic_.expressionSemantic(ast.expression.Expression, ast.scope_.Scope, ast.semantic_.ConstResult, ast.semantic_.InType) [0x55f6eef0060e]
??:? ast.expression.Expression ast.semantic_.defineSemantic(ast.expression.BinaryExp!(79).BinaryExp, ast.scope_.Scope) [0x55f6eeef7d3c]
??:? ast.expression.Expression ast.semantic_.defineOrAssignSemantic(ast.expression.Expression, ast.scope_.Scope) [0x55f6eeefcc2b]
??:? ast.expression.Expression ast.semantic_.statementSemantic(ast.expression.Expression, ast.scope_.Scope) [0x55f6eeef5997]
??:? ast.expression.CompoundExp ast.semantic_.compoundExpSemantic(ast.expression.CompoundExp, ast.scope_.Scope, ast.type.Annotation) [0x55f6eeef7210]
??:? ast.expression.Expression ast.semantic_.statementSemantic(ast.expression.Expression, ast.scope_.Scope) [0x55f6eeef6224]
??:? ast.expression.CompoundExp ast.semantic_.compoundExpSemantic(ast.expression.CompoundExp, ast.scope_.Scope, ast.type.Annotation) [0x55f6eeef7210]
??:? ast.declaration.FunctionDef ast.semantic_.functionDefSemantic(ast.declaration.FunctionDef, ast.scope_.Scope) [0x55f6eef08e12]
??:? ast.expression.Expression ast.semantic_.typeForDecl(ast.declaration.Declaration) [0x55f6eef0a923]
??:? ast.expression.Expression ast.semantic_.expressionSemantic(ast.expression.Expression, ast.scope_.Scope, ast.semantic_.ConstResult, ast.semantic_.InType) [0x55f6eef00cd6]
??:? ast.expression.Expression ast.semantic_.callSemantic(ast.expression.CallExp, ast.scope_.Scope, ast.semantic_.ConstResult, ast.semantic_.InType) [0x55f6eeefce02]
??:? ast.expression.Expression ast.semantic_.expressionSemantic(ast.expression.Expression, ast.scope_.Scope, ast.semantic_.ConstResult, ast.semantic_.InType) [0x55f6eef0060e]
??:? ast.expression.Expression ast.semantic_.defineSemantic(ast.expression.BinaryExp!(79).BinaryExp, ast.scope_.Scope) [0x55f6eeef7d3c]
??:? ast.expression.Expression ast.semantic_.defineOrAssignSemantic(ast.expression.Expression, ast.scope_.Scope) [0x55f6eeefcc2b]
??:? ast.expression.Expression ast.semantic_.statementSemantic(ast.expression.Expression, ast.scope_.Scope) [0x55f6eeef5997]
??:? ast.expression.CompoundExp ast.semantic_.compoundExpSemantic(ast.expression.CompoundExp, ast.scope_.Scope, ast.type.Annotation) [0x55f6eeef7210]
??:? ast.declaration.FunctionDef ast.semantic_.functionDefSemantic(ast.declaration.FunctionDef, ast.scope_.Scope) [0x55f6eef08e12]
??:? ast.expression.Expression ast.semantic_.toplevelSemantic(ast.expression.Expression, ast.scope_.Scope) [0x55f6eeef4351]
??:? ast.expression.Expression[] ast.semantic_.semantic(ast.expression.Expression[], ast.scope_.Scope) [0x55f6eeef4283]
??:? int ast.semantic_.importModule(immutable(char)[], ast.error.ErrorHandler, out ast.expression.Expression[], out ast.scope_.TopScope, ast.lexer.Location) [0x55f6eeef3322]
??:? int silq.run(immutable(char)[]) [0x55f6eedf84eb]
??:? _Dmain [0x55f6eedf96df]

Building fails

I am having the following error on Ubuntu while trying to build Silq
./build-release.sh: line 18: ldmd2: command not found

Bnf file

Dear Team,

is there a bnf-file (grammar file) for this language?

Would appreciate to get one. Then I can start to write full Semantic IDE support.

Even for 3rd party products like Sublime text. Based on language server.

Best Flo

Quantum Operation works on single qubits, but not on elements of different arrays

I have a quantum gate, W(a:B,b:B), which basically performs a bunch of cnot and controlled-H operations between the qubits. Neither of the variables are constant because they are each a target of some cnot operation.

The following program performs as expected:

x := 0:B;
y := 1:B;
[x, y] := W(x, y);

I would like to generalize this so that x and y are of type uint[n], where I would perform the operation between pairs of qubits that share the same index. The following code, which looks like it could work, produces an error though:

x:=0:uint[n];
\\ Do some stuff to x
y:=0:uint[n];
\\ Do some stuff to y
for i in [0..n){
    [x[i], y[i]] := W(x[i], y[i]); \\Error: only swapping supported in permute statement
}

Is there some functionality to do this already or is this a feature that could be added?
I can work around this by moving the definition of W into the for loop and perform the operation directly, but if I need to perform W multiple times it would be easier to call the function.

Constructing an array of parametrized length

Excited to share what I suspect is my silly mistake with you :)

Background

I want to compute the function ;

in other words, x0 XOR (x1 AND x2 AND ... AND xn)

My approach to do this is to first construct an array of length n-1, and then use something like this function to construct the all of that array.

My challenge:

I am trying to construct an array inside a parametrized function, like so:

def x1_xor_xn[n: !β„•](input: uint[n]) {
    
    xn := 0:𝔹^(n-1);

    ...
}

But it doesn't seem I can construct new primitives with my parameter n even though I define it to be of classical-β„• type:

❌ vector length should be of type !β„•, not !β„€

Likewise, constructing an int array fails:

xn := 0:uint[n-1]; // ❌ expected argument types !β„•, but !β„€ was provided

And so does this silliness:

xn := 0:𝔹^((n-(1 as !β„•)) as !β„•);
// or:
xn := 0:uint[max(1, n-1) as !β„•];

It appears that 1 is interpreted as !β„€ and nothing I do can convince the compiler that I actually mean !β„•, perhaps because β„•-β„•β†’β„€...

What is the correct way to construct something like this? Is this possible in silq right now? (Is there some magical way to parametrize the n type?)

Silq REPL

I think it'd be great to have a repl for the language, for toying with code before writing it down. Shouldn't be too hard to implement (not too sure). Thoughts?

Functions on arrays?

Amazing job guys. Any reason the first snippet can't be written as the second one?

1:

	for k in [0..n) { cand[k] := H(cand[k]);

2:

	cand := H(cand);

It's done in other languages like Python for example. Also your example for Grover's algorithm already does this in the circuit diagram! There's just one wire going into Hⁿ:

Grover's Algorithm from Silq website

So it would only be logical to implement in this language too, as Silq definitely attempts in giving a higher level of abstraction than building circuits and directly manipulating single bit registers. Again, great job on this, and I'll be eagerly waiting for when this language can export to some circuit format so we could play around with it on different systems, even maybe real ones.

fatal: remote error: upload-pack

I can not executate git submodule update in 7331c54.
I'm not sure It seems like https://github.com/tgehr/ast is not recently?

$ git submodule init && git submodule update                                   (1) (5s 921ms) 
fatal: remote error: upload-pack: not our ref cc55a893233c62f4f860127662ecee6d552cf4db
Fetched in submodule path 'ast', but it did not contain cc55a893233c62f4f860127662ecee6d552cf4db. Direct fetching of that commit failed.

Thanks

Method for resetting Quantum State

Is there a method for resetting the global state if there are no quantum variables? I am considering some code that requires a repeat until success loop and the quantum state needs to be reset at the start of the loop.

Example with a minimal program:

def main(){
    loop := true:!B;
    while (loop){
        q := 0:B;
        q := rotY(1,q);
        q := rotZ(0.5,q);
        loop = measure(q);
    }
    return loop;
}

On the first iteration, the quantum state is (1+0i)·|⟩ or (1+0i)·|0⟩ up to the rotation statements.
Once the rotations are done the quantum state is (0.850301-0.217117i)Β·|0βŸ©β‚‚+(0.464521+0.118612i)Β·|1βŸ©β‚‚.
Now if the measurement is 1 the quantum state becomes (0.968912+0.247404i)·|⟩, which leaks into the redefinition of q in the next iteration. The state is therefore (0.968912+0.247404i)·|0⟩ rather than (1+0i)·|0⟩.

Basically, I would be looking for something like:

def main(){
    loop := true:!B;
    while (loop){
        q := 0:B;
        q := rotY(1,q);
        q := rotZ(0.5,q);
        loop = measure(q);
        reset();
    }
    return loop;
}

where reset() changes an empty quantum state back to (1+0i)·|⟩.

Quantum redefinition through quantum control behaviour inconsistent depending on scope

TL;DR: Cannot redefine quantum variable under quantum control in a subroutine, but the quantum variable under quantum control can be redefined in the environment/scope it is defined in

Whilst I have a more complex scenario, the behaviour also occurs in this simple example. Here is a program that takes a variable (q) and based on quantum control, changes the value:

n := 3;

def main(){
    q := 1 :uint[n];
    p := H(0:B);
    if p {
        q = 3:uint[n];
    }
    measure(p);
    return q;
}

This is accepted in Silq and runs as expected (before measurement the state is 1/sqrt(2) * (|1>|0> + |3>|1>)). This is helpful for generating oracles as you can just tell Silq what value you want the variable to take based on classical variables and there is no need to explicitly define all the operations that need to take place for the new value.

In one of my programs, I want to avoid code duplication and would like to put the if statement into a function and replace the if statement in main with q := func(p, q). However, an error occurs when doing so:

def func(const p:B, q:uint[n]){
    if p {
        q = 3:uint[n];  // Error: cannot reassign quantum variable
    }
    return q;
}

I do not think this error should occur.

Is there any way to do actual things besides mathematical computation with silq?

Hello,

Please forgive my foolish title phrasing.

I am inquiring about what I must go through in order to build real world applications with silq (theoretically). Suppose I wanted to implement a library for controlling audio on a device. Hopefully it would both work on my laptop and any theoretical quantum computer supporting the syscalls. I don't see much in terms of a virtual machine with these implemented like with the JVM or anything. I don't know much about quantum computing or the technologies that silq is built upon but am interested to learn more.

Is it at all possible to interact with hardware instead doing computation in a very abstract way?

Sincerely, Walther Green

Unable to run silq after setting $PATH

I tried installing silq from source and it installed just fine. I'm able to run using ./silq when I'm in the corresponding directory. However, I'm facing an issue when addin silq to my $PATH. I did it the way as suggested on the website.

Now when I'm running silq from any directory, I get the following error: (I'm running zsh)

zsh: permission denied: silq

When I switch over to bash, I get the error:

bash: silq: command not found

silq

Linguagem de programação quantica

Cannot install silq on vscode 1.35.0

Message from @sherlockguan, originally posted offtopic in another issue.

dear team
I have some problems when installing silp on my vsocde linux computer .
_

Unable to install 'eth-sri.vscode-silq' extension because it is not compatible with the current version of VS Code (version 1.35.0).

_
Thank you for your efforts to make this new exciting language possible for Quantum computing .
Best Guan

We have not tested the plugin with any version lower than 1.37.0, the current version of VS code is 1.46. Is there a reason why you cannot upgrade?

Error message when I execute this comando ./ dependencies-release and build-release

After running ./dependencies-release.sh , I have this message , why?
fatal: not a git repository (or any of the parent directories): .git
fatal: not a git repository (or any of the parent directories): .git

After running ./build-release.sh , I have this message , why?
Error: module * is in file 'ast/*.d' which cannot be read
import path[0] = /home/user/Downloads/silq-master/ldc2-1.18.0-linux-x86_64/bin/../import

Variable quantum state assignment

Hey again πŸ‘‹πŸ»

Just wanted to ask, how Silq manages to handle Variables. As far as I know, quantum states cannot be stored inside a variable since the measurement will trigger a mirror-state.

Best regards
Timo Sarkar

Zug, Switzerland

Does measurement or consciousness determine quantum state?

I know it is not silq related question. I couldn't find a better place to ask the question. Hopefully, someone can help me with the question. Thanks in advance.

I know quantum states are in super positions. But How do we know it is the measurement determines the quantum state ? Could it be consciousness ? For example, we use tool measure the state of the quantum particle, but no one checked the result.

I cannot prove it. But I have an assumption. The our consciousness might determines the quantum state not the measurement.

This is big different with SchrΓΆdinger's cat experiment.
Case 1: Measurement determines the quantum state.
Then: When the device measures the radioactivity, then the quantum state is determined. So the state of cat is actually determined.
Case 2: Consciousness determines the quantum state.
Then: The measurement of radioactivity cannot determine the quantum state. So the cat is in superposition. The cat is alive and died at the same time.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.