├── .gitignore ├── LICENSE.md ├── Makefile ├── README.md ├── TODO ├── all_examples.sh ├── case-study-examples.txt ├── data_short ├── adp1kxs.csv ├── adp1kys.csv ├── adult_fifty.csv ├── crisis_warning.csv ├── facebook_fifty.csv ├── fbxs.csv ├── fbys.csv ├── ffxs.csv ├── ffys.csv ├── incoming.csv ├── incoming1.csv ├── kddcup99_fifty.csv ├── made_up.csv ├── normal.csv ├── outgoing.csv ├── outgoing1.csv ├── schedule.csv ├── synthetic_fifty.csv ├── xs.csv └── ys.csv ├── duet.cabal ├── examples.sh ├── examples ├── complete │ ├── README.md │ ├── adaptive-clip-eps.zcdp.duet │ ├── adaptive-clip-eps.zcdp.duet.output │ ├── adaptive-clip-zcdp.ed.duet │ ├── adaptive-clip-zcdp.ed.duet.output │ ├── adaptive-clip.ed.duet │ ├── adaptive-clip.ed.duet.output │ ├── baby-map-p.ed.duet │ ├── baby-map-p.ed.duet.output │ ├── baby-map-s.ed.duet │ ├── baby-map-s.ed.duet.output │ ├── baby-papp.ed.duet │ ├── baby-papp.ed.duet.output │ ├── baby-sapp.ed.duet │ ├── baby-sapp.ed.duet.output │ ├── baby.ed.duet │ ├── baby.ed.duet.output │ ├── basic-boxing.ed.duet │ ├── basic-boxing.ed.duet.output │ ├── bolt-on.ed.duet │ ├── bolt-on.ed.duet.output │ ├── bolt-on2.ed.duet │ ├── bolt-on2.ed.duet.output │ ├── boxing.ed.duet │ ├── boxing.ed.duet.output │ ├── derived-map.ed.duet │ ├── derived-map.ed.duet.output │ ├── fw.ed.duet │ ├── fw.ed.duet.output │ ├── gd-pb-mini.ed.duet │ ├── gd-pb-mini.ed.duet.output │ ├── gd-pb-mini.tcdp.duet │ ├── gd-pb-mini.tcdp.duet.output │ ├── gd-pb-parallel.zcdp.duet │ ├── gd-pb-parallel.zcdp.duet.output │ ├── gd-pb-renyi.ed.duet │ ├── gd-pb-renyi.ed.duet.output │ ├── gd-pb-zcdp.ed.duet │ ├── gd-pb-zcdp.ed.duet.output │ ├── gd-pb.ed.duet │ ├── gd-pb.ed.duet.output │ ├── gd-pb.renyi.duet │ ├── gd-pb.renyi.duet.output │ ├── gd-pb.zcdp.duet │ ├── gd-pb.zcdp.duet.output │ ├── gd-tb.ed.duet │ ├── gd-tb.ed.duet.output │ ├── gd-unbounded-pb.ed.duet │ ├── gd-unbounded-pb.ed.duet.output │ ├── hyperparam.ed.duet │ ├── hyperparam.ed.duet.output │ ├── normalize.ed.duet │ ├── normalize.ed.duet.output │ ├── parallel-privacy.ed.duet │ ├── parallel-privacy.ed.duet.output │ ├── parallel-simple.ed.duet │ ├── parallel-simple.ed.duet.output │ ├── plambda.eps.duet │ ├── plambda.eps.duet.output │ ├── presna-crisis.eps.duet │ ├── presna-crisis.eps.duet.output │ ├── presna-normal.ed.duet │ ├── presna-normal.ed.duet.output │ ├── presna-queries.eps.duet │ ├── presna-queries.eps.duet.output │ ├── scheduling.ed.duet │ ├── tiny-map.ed.duet │ └── tiny-map.ed.duet.output └── wip │ ├── apply.ed.duet │ ├── dataframe-schedule.ed.duet │ ├── dataframe-simple.ed.duet │ ├── gd-pb-mini.renyi.duet │ ├── gd-pb-zcdp-tb.ed.duet │ └── olh.ed.duet ├── experiments └── crypt.hs ├── main └── Main.hs ├── package.yaml ├── src ├── Duet.hs └── Duet │ ├── Check.hs │ ├── Interpreter.hs │ ├── Parser.hs │ ├── Pretty.hs │ ├── Quantity.hs │ ├── RNF.hs │ ├── Syntax.hs │ └── UVMHS.hs ├── stack.yaml └── wild_ideas.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | ed-dp-implementation 3 | .stack-work/ 4 | uvmhs 5 | out/ 6 | data_long/ 7 | typecheck-times 8 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 UVM PLAID 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | NAME := duet 2 | 3 | ARGS := run examples/presna-crisis.eps.duet data_short/incoming.csv data_short/outgoing.csv 1.0 4 | ARGS := run examples/presna-crisis.ed.duet data_short/incoming.csv data_short/outgoing.csv 0.05 1.0 5 | ARGS := check examples/gd-pb-mini.tcdp.duet 6 | ARGS := run examples/gd-pb-mini.tcdp.duet data_long/adpxs.csv data_long/adpys.csv 0.05 11 100 1 50 7 | ARGS := check examples/gd-pb-mini.renyi.duet 8 | ARGS := run examples/gd-pb-mini.renyi.duet data_short/ffxs.csv data_short/ffys.csv 0.05 6 100 1 50 9 | ARGS := check examples/plambda-bad.eps.duet 10 | ARGS := run examples/gd-pb-mini.ed.duet data_short/xs.csv data_short/ys.csv 100000 100 0.0001 0.0001 1 50 11 | ARGS := run examples/gd-pb.ed.duet data_short/xs.csv data_short/ys.csv 0.05 100 0.0001 0.0001 1 12 | ARGS := run examples/gd-pb.ed.duet data_long/adpxs.csv data_long/adpys.csv 0.05 100 0.0001 0.0001 1 13 | ARGS := run examples/gd-pb-mini.ed.duet data_long/adpxs.csv data_long/adpys.csv 10000 100 0.0001 0.0001 1 50 14 | ARGS := lr-accuracy data_long/adpxs.csv data_long/adpys.csv out/model.csv 15 | ARGS := check examples/baby-map-s.ed.duet 16 | ARGS := check examples/normalize.ed.duet 17 | ARGS := check examples/gd-pb.ed.duet 18 | ARGS := check examples/bolt-on.ed.duet 19 | ARGS := check examples/fw.ed.duet 20 | ARGS := check examples/gd-pb-mini.ed.duet 21 | ARGS := check examples/parallel-privacy.ed.duet 22 | ARGS := check examples/gd-unbounded-pb.ed.duet 23 | ARGS := check examples/hyperparam.ed.duet 24 | ARGS := check examples/adaptive-clip.ed.duet 25 | ARGS := check examples/normalize.ed.duet 26 | ARGS := run examples/complete/presna-queries.eps.duet 1 data_short/incoming.csv data_short/outgoing.csv data_short/normal.csv data_short/crisis_warning.csv 1.0 27 | ARGS := run examples/complete/scheduling.ed.duet data_short/schedule.csv 100 28 | 29 | # run examples/gd-pb-mini.ed.duet data_short/fbxs.csv data_short/fbys.csv 0.05 100 0.0001 0.0001 1 50 30 | # run examples/parallel-simple.ed.duet data_short/made_up.csv 0.05 0.0001 0 0 0 1 31 | # run examples/basic-boxing.ed.duet 1 32 | # run examples/baby.ed.duet 0.05 0.0001 data_short/made_up.csv 33 | 34 | # Run Using GHCI 35 | # stack ghci 36 | # :set args check "examples/gd-pb.ed.duet" 37 | # main 38 | 39 | default: 40 | ./examples.sh 41 | 42 | all: 43 | ./all_examples.sh 44 | 45 | .PHONY: run 46 | run: $(NAME).cabal 47 | stack run -- $(ARGS) 48 | 49 | .PHONY: run-profile 50 | run-profile: $(NAME).cabal 51 | stack run --profile -- $(ARGS) 52 | 53 | .PHONY: interact 54 | interact: $(NAME).cabal 55 | # echo ":set args $(ARGS)\n:main" | stack ghci $(NAME) 56 | stack ghci $(NAME) 57 | 58 | .PHONY: build 59 | build: $(NAME).cabal 60 | stack build --fast 61 | 62 | .PHONY: build-profile 63 | build-profile: $(NAME).cabal 64 | stack build --profile 65 | 66 | .PHONY: install 67 | install: $(NAME).cabal 68 | stack install 69 | 70 | .PHONY: configure 71 | configure: $(NAME).cabal 72 | 73 | # .PHONY: doc 74 | # doc: 75 | # stack haddock 76 | # cp -r `stack path --local-doc-root` ./ 77 | 78 | .PHONY: clean 79 | clean: 80 | stack clean --full 81 | rm -f $(NAME).cabal 82 | rm -rf doc 83 | 84 | # .PHONY: hoogle 85 | # hoogle: 86 | # stack hoogle -- generate --local 87 | # (sleep 1 && open http://localhost:8080/?scope=package%3A$(NAME)) & 88 | # stack hoogle -- server --local --port=8080 89 | 90 | $(NAME).cabal: package.yaml 91 | hpack --force 92 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Duet is an expressive higher-order language, linear type system 2 | and tool for automatically verifying differential privacy of arbitrary 3 | higher-order programs. In addition to general purpose programming, it 4 | supports encoding machine learning algorithms such as stochastic gradient 5 | descent, as well as common auxiliary data analysis tasks such as 6 | clipping, normalization and hyperparameter tuning. 7 | 8 | ## Installation 9 | 10 | Install Stack: https://docs.haskellstack.org/en/stable/install_and_upgrade/ 11 | 12 | Install hpack: https://github.com/sol/hpack/blob/master/get-hpack.sh 13 | 14 | ## Running 15 | 16 | To typecheck all case studies: run `make`. 17 | 18 | To typecheck all examples: run `make all`. 19 | 20 | To typecheck a specific example: 21 | 22 | ```shell 23 | stack run -- check /path/to/examples/${example-name} 24 | ``` 25 | 26 | For example 27 | 28 | ```shell 29 | stack run -- check examples/complete/gd-pb.ed.duet 30 | ``` 31 | 32 | ## Notes 33 | 34 | * Code, examples, and output use lots of math unicode symbols. 35 | * Some syntax (e.g., for matrix-map) used in examples are slightly different 36 | from those presented in the paper. 37 | -------------------------------------------------------------------------------- /TODO: -------------------------------------------------------------------------------- 1 | ⁃ fix combining constants in type of fw.ed.duet 2 | -------------------------------------------------------------------------------- /all_examples.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | FILES=examples/complete/*.duet 3 | for e in $FILES 4 | do 5 | echo "================================================================================" 6 | echo "Running example:" $e 7 | echo "================================================================================" 8 | stack run -- check $e 9 | done 10 | -------------------------------------------------------------------------------- /case-study-examples.txt: -------------------------------------------------------------------------------- 1 | L-GD 2 | U-GD 3 | Frank Wolfe 4 | L-GD + mini 5 | L-GD + output perturbation 6 | L-GD + hypertuning 7 | L-GD + SVT-adapt-clip 8 | L-GD + normalization 9 | everything in one 10 | -------------------------------------------------------------------------------- /data_short/crisis_warning.csv: -------------------------------------------------------------------------------- 1 | 1,1 2 | -------------------------------------------------------------------------------- /data_short/facebook_fifty.csv: -------------------------------------------------------------------------------- 1 | 0.00,0.00,0.00,0.00,0.30,0.00,0.08,0.00,0.00,0.03,0.00,0.03,0.00,0.00,0.02,0.00,0.08,0.01,0.00,0.02,0.00,0.09,0.00,0.00,0.02,-0.04,0.02,-0.00,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.53,0.00,0.00,0.00,1.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00 2 | 1.00,0.00,0.00,0.01,0.15,0.00,0.44,0.01,0.00,0.16,0.00,0.18,0.00,0.00,0.08,0.00,0.57,0.03,0.00,0.15,0.00,0.42,0.01,0.00,0.15,-0.41,0.13,-0.00,0.00,0.09,0.01,0.01,0.00,0.01,0.01,0.26,0.00,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 3 | 0.00,0.00,0.01,0.00,0.30,0.00,0.01,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,-0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.38,0.02,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00 4 | 1.00,0.00,0.00,0.02,0.04,0.00,1.00,0.04,0.02,0.23,0.00,0.23,0.01,0.00,0.10,0.00,0.21,0.06,0.02,0.09,0.00,1.00,0.04,0.02,0.22,-0.14,0.23,-0.00,-0.00,0.09,0.03,0.00,0.02,0.03,-0.01,0.71,0.00,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 5 | 1.00,0.00,0.00,0.00,0.05,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,-0.00,0.00,-0.00,0.00,0.00,0.00,0.00,0.00,0.00,-0.00,0.67,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00 6 | 1.00,0.00,0.00,0.02,0.08,0.00,0.36,0.03,0.02,0.13,0.00,0.40,0.01,0.00,0.17,0.00,0.22,0.04,0.01,0.08,0.00,0.38,0.03,0.02,0.14,-0.12,0.40,0.00,-0.00,0.12,0.02,0.00,0.03,0.03,-0.03,0.54,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00 7 | 1.00,0.00,0.00,0.00,0.15,0.00,0.31,0.02,0.01,0.10,0.00,0.17,0.01,0.00,0.06,0.00,0.22,0.03,0.00,0.08,0.00,0.32,0.02,0.01,0.10,-0.18,0.17,0.00,-0.00,0.07,0.01,0.01,0.00,0.01,0.01,0.06,0.18,0.00,0.00,1.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00 8 | 1.00,0.00,0.00,0.01,0.23,0.00,0.13,0.03,0.03,0.09,0.00,0.08,0.01,0.01,0.07,0.00,0.16,0.06,0.01,0.08,0.00,0.13,0.03,0.03,0.08,-0.12,0.08,-0.00,-0.00,0.07,0.07,0.00,0.04,0.06,-0.02,0.90,0.00,0.02,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 9 | 0.00,0.00,0.00,0.00,0.04,0.00,0.04,0.01,0.00,0.02,0.00,0.05,0.00,0.00,0.02,0.00,0.03,0.01,0.00,0.02,0.00,0.04,0.01,0.00,0.02,-0.02,0.05,0.00,0.00,0.02,0.00,0.00,0.01,0.00,-0.00,0.61,0.01,0.00,0.00,1.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00 10 | 1.00,0.01,0.66,0.06,0.08,0.00,0.66,0.08,0.05,0.27,0.00,0.62,0.03,0.01,0.24,0.00,0.47,0.12,0.02,0.20,0.00,0.68,0.07,0.05,0.27,-0.35,0.62,0.00,-0.00,0.21,0.04,0.04,0.00,0.04,0.04,0.03,0.01,0.01,0.00,1.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 11 | 0.00,0.00,0.05,0.00,0.25,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,-0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.17,0.01,0.00,0.00,1.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 12 | 1.00,0.00,0.00,0.01,0.17,0.00,0.44,0.03,0.02,0.14,0.00,0.36,0.02,0.00,0.16,0.00,0.18,0.05,0.01,0.09,0.00,0.46,0.03,0.02,0.14,-0.10,0.22,0.01,-0.00,0.09,0.05,0.06,0.00,0.06,0.06,0.08,0.00,0.00,0.00,1.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 13 | 0.00,0.00,0.00,0.00,0.37,0.00,0.15,0.01,0.01,0.04,0.00,0.04,0.00,0.00,0.02,0.00,0.20,0.02,0.00,0.04,0.00,0.14,0.01,0.01,0.04,-0.15,0.04,-0.00,-0.00,0.03,0.00,0.00,0.00,0.00,-0.00,0.71,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 14 | 1.00,0.01,0.00,0.07,0.08,0.00,0.49,0.10,0.07,0.26,0.00,0.54,0.04,0.01,0.33,0.00,0.44,0.13,0.01,0.20,0.00,0.52,0.10,0.07,0.26,-0.33,0.54,0.01,-0.00,0.27,0.08,0.00,0.05,0.08,-0.04,0.71,0.01,0.01,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 15 | 0.00,0.00,0.00,0.00,0.13,0.00,0.01,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,-0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.00,0.00,-0.00,0.61,0.01,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00 16 | 0.00,0.00,0.65,0.02,0.08,0.00,0.09,0.02,0.00,0.07,0.00,0.05,0.00,0.00,0.04,0.00,0.06,0.02,0.00,0.04,0.00,0.09,0.01,0.00,0.07,-0.05,0.05,-0.00,0.00,0.04,0.00,0.00,0.00,0.00,0.00,0.44,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00 17 | 0.00,0.00,0.00,0.00,0.22,0.00,0.03,0.00,0.00,0.01,0.00,0.03,0.00,0.00,0.02,0.00,0.01,0.01,0.00,0.01,0.00,0.03,0.00,0.00,0.01,-0.01,0.03,0.00,0.00,0.01,0.00,0.00,0.00,0.00,-0.00,0.65,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 18 | 0.00,0.00,0.00,0.01,0.08,0.00,0.47,0.05,0.02,0.24,0.00,0.35,0.02,0.00,0.25,0.00,0.58,0.07,0.00,0.20,0.00,0.47,0.05,0.02,0.25,-0.48,0.35,0.01,-0.00,0.22,0.00,0.00,0.00,0.00,0.00,0.85,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 19 | 1.00,0.00,0.00,0.01,0.08,0.00,0.26,0.03,0.01,0.13,0.00,0.12,0.01,0.00,0.08,0.00,0.31,0.06,0.01,0.13,0.00,0.26,0.02,0.01,0.13,-0.23,0.12,-0.00,-0.00,0.08,0.01,0.00,0.01,0.01,-0.00,0.40,0.00,0.00,0.00,0.58,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 20 | 0.00,0.00,0.01,0.00,0.57,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,-0.00,0.00,-0.00,0.00,0.00,0.00,0.00,0.00,0.00,-0.00,0.58,0.00,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 21 | 0.00,0.00,0.00,0.00,0.13,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,-0.00,0.00,-0.00,0.00,0.00,0.00,0.00,0.00,0.00,-0.00,0.49,0.01,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00 22 | 0.00,0.00,0.00,0.00,0.34,0.00,0.06,0.01,0.01,0.03,0.00,0.03,0.00,0.00,0.02,0.00,0.07,0.02,0.01,0.03,0.00,0.06,0.01,0.01,0.02,-0.04,0.03,-0.00,-0.00,0.02,0.01,0.00,0.00,0.01,0.00,0.88,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 23 | 1.00,0.00,0.00,0.00,0.17,0.00,0.11,0.01,0.01,0.03,0.00,0.02,0.00,0.00,0.02,0.00,0.03,0.01,0.00,0.02,0.00,0.11,0.01,0.01,0.03,-0.02,0.02,-0.00,-0.00,0.02,0.01,0.00,0.00,0.01,0.00,0.93,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 24 | 0.00,0.01,0.00,0.02,0.08,0.00,0.36,0.03,0.02,0.13,0.00,0.18,0.01,0.00,0.11,0.00,0.14,0.04,0.01,0.06,0.00,0.36,0.03,0.02,0.12,-0.09,0.18,0.01,-0.00,0.09,0.01,0.00,0.01,0.01,-0.00,0.46,0.01,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 25 | 1.00,0.00,0.00,0.02,0.01,0.00,0.02,0.01,0.00,0.01,0.00,0.02,0.00,0.00,0.01,0.00,0.02,0.01,0.00,0.01,0.00,0.03,0.01,0.00,0.01,-0.02,0.02,0.00,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.18,0.00,0.00,0.00,1.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 26 | 0.00,0.00,0.00,0.00,0.12,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,-0.00,0.00,-0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.94,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 27 | 1.00,0.00,0.00,0.00,0.23,0.00,0.29,0.01,0.00,0.09,0.00,0.14,0.00,0.00,0.07,0.00,0.24,0.02,0.00,0.06,0.00,0.18,0.01,0.00,0.06,-0.04,0.11,0.00,0.00,0.03,0.02,0.01,0.02,0.01,-0.01,0.51,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00 28 | 0.00,0.00,0.00,0.00,0.52,0.00,0.07,0.00,0.00,0.02,0.00,0.02,0.00,0.00,0.01,0.00,0.06,0.01,0.00,0.02,0.00,0.07,0.00,0.00,0.02,-0.04,0.02,-0.00,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.25,0.00,0.00,0.00,1.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 29 | 1.00,0.00,0.00,0.00,0.17,0.00,0.16,0.02,0.02,0.06,0.00,0.04,0.01,0.00,0.04,0.00,0.04,0.03,0.01,0.03,0.00,0.16,0.02,0.02,0.05,-0.03,0.04,-0.00,-0.00,0.04,0.02,0.00,0.02,0.02,-0.01,0.68,0.00,0.00,0.00,1.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00 30 | 0.00,0.00,0.12,0.00,0.30,0.00,0.02,0.00,0.00,0.01,0.00,0.02,0.00,0.00,0.01,0.00,0.03,0.01,0.00,0.01,0.00,0.02,0.00,0.00,0.01,-0.02,0.02,-0.00,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.25,0.01,0.00,0.00,1.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 31 | 0.00,0.01,0.00,0.01,0.23,0.00,0.35,0.05,0.02,0.18,0.00,0.16,0.02,0.00,0.14,0.00,0.43,0.09,0.02,0.16,0.00,0.35,0.05,0.02,0.17,-0.29,0.16,0.00,-0.00,0.12,0.00,0.00,0.00,0.00,0.00,0.22,0.02,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 32 | 1.00,0.00,0.00,0.01,0.17,0.00,0.44,0.03,0.02,0.14,0.00,0.36,0.02,0.00,0.16,0.00,0.18,0.05,0.01,0.09,0.00,0.46,0.03,0.02,0.14,-0.10,0.22,0.01,-0.00,0.09,0.01,0.01,0.00,0.01,0.01,0.03,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00 33 | 1.00,0.00,0.00,0.03,0.08,0.00,0.13,0.02,0.01,0.07,0.00,0.14,0.01,0.00,0.07,0.00,0.09,0.03,0.00,0.04,0.00,0.14,0.02,0.01,0.07,-0.04,0.14,0.00,0.00,0.05,0.12,0.07,0.09,0.12,-0.00,0.39,0.02,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 34 | 1.00,0.00,0.00,0.00,0.23,0.00,0.29,0.01,0.00,0.09,0.00,0.14,0.00,0.00,0.07,0.00,0.24,0.02,0.00,0.06,0.00,0.18,0.01,0.00,0.06,-0.04,0.11,0.00,0.00,0.03,0.00,0.00,0.01,0.01,-0.00,0.44,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00 35 | 0.00,0.00,0.00,0.00,0.34,0.00,0.02,0.00,0.00,0.02,0.00,0.02,0.00,0.00,0.01,0.00,0.01,0.01,0.00,0.01,0.00,0.02,0.00,0.00,0.02,-0.00,0.02,0.00,0.00,0.01,0.02,0.00,0.01,0.02,-0.00,0.88,0.02,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 36 | 1.00,0.00,0.00,0.00,0.08,0.00,0.18,0.02,0.01,0.08,0.00,0.21,0.01,0.00,0.07,0.00,0.21,0.03,0.00,0.07,0.00,0.20,0.02,0.01,0.08,-0.16,0.21,0.00,-0.00,0.07,0.08,0.00,0.12,0.09,-0.08,0.51,0.00,0.00,0.00,1.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00 37 | 0.00,0.00,0.01,0.00,0.57,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,-0.00,0.00,-0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.33,0.00,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 38 | 0.00,0.00,0.00,0.00,0.25,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,-0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.97,0.01,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 39 | 1.00,0.00,0.00,0.01,0.08,0.00,0.09,0.02,0.01,0.05,0.00,0.10,0.01,0.00,0.06,0.00,0.07,0.02,0.00,0.03,0.00,0.09,0.02,0.01,0.05,-0.05,0.10,0.00,-0.00,0.05,0.01,0.01,0.00,0.01,0.01,0.29,0.01,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 40 | 0.00,0.00,0.00,0.02,0.40,0.00,0.07,0.01,0.00,0.04,0.00,0.07,0.00,0.00,0.04,0.00,0.08,0.02,0.00,0.03,0.00,0.07,0.01,0.00,0.04,-0.06,0.07,0.00,0.00,0.03,0.00,0.00,0.00,0.00,-0.00,0.61,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 41 | 1.00,0.00,0.00,0.00,0.02,0.00,0.02,0.01,0.01,0.01,0.00,0.02,0.00,0.00,0.02,0.00,0.02,0.01,0.00,0.01,0.00,0.02,0.01,0.01,0.01,-0.02,0.02,0.00,0.00,0.01,0.00,0.00,0.01,0.00,-0.00,0.60,0.01,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 42 | 0.00,0.00,0.00,0.00,0.34,0.00,0.06,0.01,0.01,0.03,0.00,0.03,0.00,0.00,0.02,0.00,0.07,0.02,0.01,0.03,0.00,0.06,0.01,0.01,0.02,-0.04,0.03,-0.00,-0.00,0.02,0.00,0.00,0.01,0.00,-0.00,0.51,0.01,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00 43 | 1.00,0.00,0.00,0.00,0.08,0.00,0.06,0.01,0.01,0.03,0.00,0.06,0.01,0.00,0.04,0.00,0.05,0.02,0.00,0.03,0.00,0.06,0.01,0.01,0.03,-0.04,0.06,0.00,0.00,0.03,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 44 | 1.00,0.00,0.00,0.00,0.23,0.00,0.02,0.00,0.00,0.01,0.00,0.01,0.00,0.00,0.01,0.00,0.02,0.01,0.00,0.01,0.00,0.02,0.00,0.00,0.01,-0.01,0.01,-0.00,0.00,0.01,0.00,0.01,0.00,0.01,0.01,0.06,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00 45 | 1.00,0.01,0.00,0.03,0.08,0.00,0.51,0.07,0.03,0.28,0.00,0.57,0.03,0.01,0.34,0.00,0.55,0.12,0.02,0.21,0.00,0.54,0.07,0.03,0.29,-0.44,0.57,0.01,-0.00,0.26,0.05,0.06,0.00,0.06,0.06,0.12,0.01,0.00,0.00,1.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 46 | 0.00,0.00,0.00,0.01,0.08,0.01,0.23,0.07,0.05,0.17,0.00,0.26,0.04,0.02,0.28,0.00,0.08,0.05,0.02,0.06,0.01,0.25,0.07,0.04,0.17,-0.05,0.26,0.03,0.00,0.19,0.05,0.00,0.01,0.05,-0.00,0.89,0.01,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 47 | 0.00,0.00,0.01,0.00,0.57,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,-0.00,0.00,-0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.46,0.03,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 48 | 1.00,0.01,0.00,0.04,0.08,0.00,0.85,0.07,0.04,0.28,0.00,0.95,0.03,0.01,0.33,0.00,0.72,0.11,0.03,0.19,0.00,0.90,0.07,0.04,0.28,-0.56,0.95,0.01,-0.00,0.25,0.02,0.00,0.03,0.02,-0.02,0.60,0.02,0.00,0.00,1.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00 49 | 1.00,0.00,0.00,0.01,0.23,0.00,0.13,0.03,0.03,0.09,0.00,0.08,0.01,0.01,0.07,0.00,0.16,0.06,0.01,0.08,0.00,0.13,0.03,0.03,0.08,-0.12,0.08,-0.00,-0.00,0.07,0.00,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00 50 | 1.00,0.06,0.00,0.14,0.58,0.01,0.89,0.10,0.06,0.35,0.00,1.00,0.04,0.01,0.48,0.00,0.47,0.15,0.05,0.22,0.01,0.95,0.09,0.05,0.35,-0.33,1.00,0.01,-0.01,0.35,0.12,0.02,0.15,0.12,-0.10,0.64,0.01,0.02,0.00,1.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00 51 | -------------------------------------------------------------------------------- /data_short/fbxs.csv: -------------------------------------------------------------------------------- 1 | 0.00,0.00,0.00,0.30,0.00,0.08,0.00,0.00,0.03,0.00,0.03,0.00,0.00,0.02,0.00,0.08,0.01,0.00,0.02,0.00,0.09,0.00,0.00,0.02,-0.04,0.02,-0.00,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.53,0.00,0.00,0.00,1.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00 2 | 0.00,0.00,0.01,0.15,0.00,0.44,0.01,0.00,0.16,0.00,0.18,0.00,0.00,0.08,0.00,0.57,0.03,0.00,0.15,0.00,0.42,0.01,0.00,0.15,-0.41,0.13,-0.00,0.00,0.09,0.01,0.01,0.00,0.01,0.01,0.26,0.00,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 3 | 0.00,0.01,0.00,0.30,0.00,0.01,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,-0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.38,0.02,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00 4 | 0.00,0.00,0.02,0.04,0.00,1.00,0.04,0.02,0.23,0.00,0.23,0.01,0.00,0.10,0.00,0.21,0.06,0.02,0.09,0.00,1.00,0.04,0.02,0.22,-0.14,0.23,-0.00,-0.00,0.09,0.03,0.00,0.02,0.03,-0.01,0.71,0.00,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 5 | 0.00,0.00,0.00,0.05,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,-0.00,0.00,-0.00,0.00,0.00,0.00,0.00,0.00,0.00,-0.00,0.67,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00 6 | 0.00,0.00,0.02,0.08,0.00,0.36,0.03,0.02,0.13,0.00,0.40,0.01,0.00,0.17,0.00,0.22,0.04,0.01,0.08,0.00,0.38,0.03,0.02,0.14,-0.12,0.40,0.00,-0.00,0.12,0.02,0.00,0.03,0.03,-0.03,0.54,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00 7 | 0.00,0.00,0.00,0.15,0.00,0.31,0.02,0.01,0.10,0.00,0.17,0.01,0.00,0.06,0.00,0.22,0.03,0.00,0.08,0.00,0.32,0.02,0.01,0.10,-0.18,0.17,0.00,-0.00,0.07,0.01,0.01,0.00,0.01,0.01,0.06,0.18,0.00,0.00,1.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00 8 | 0.00,0.00,0.01,0.23,0.00,0.13,0.03,0.03,0.09,0.00,0.08,0.01,0.01,0.07,0.00,0.16,0.06,0.01,0.08,0.00,0.13,0.03,0.03,0.08,-0.12,0.08,-0.00,-0.00,0.07,0.07,0.00,0.04,0.06,-0.02,0.90,0.00,0.02,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 9 | 0.00,0.00,0.00,0.04,0.00,0.04,0.01,0.00,0.02,0.00,0.05,0.00,0.00,0.02,0.00,0.03,0.01,0.00,0.02,0.00,0.04,0.01,0.00,0.02,-0.02,0.05,0.00,0.00,0.02,0.00,0.00,0.01,0.00,-0.00,0.61,0.01,0.00,0.00,1.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00 10 | 0.01,0.66,0.06,0.08,0.00,0.66,0.08,0.05,0.27,0.00,0.62,0.03,0.01,0.24,0.00,0.47,0.12,0.02,0.20,0.00,0.68,0.07,0.05,0.27,-0.35,0.62,0.00,-0.00,0.21,0.04,0.04,0.00,0.04,0.04,0.03,0.01,0.01,0.00,1.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 11 | 0.00,0.05,0.00,0.25,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,-0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.17,0.01,0.00,0.00,1.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 12 | 0.00,0.00,0.01,0.17,0.00,0.44,0.03,0.02,0.14,0.00,0.36,0.02,0.00,0.16,0.00,0.18,0.05,0.01,0.09,0.00,0.46,0.03,0.02,0.14,-0.10,0.22,0.01,-0.00,0.09,0.05,0.06,0.00,0.06,0.06,0.08,0.00,0.00,0.00,1.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 13 | 0.00,0.00,0.00,0.37,0.00,0.15,0.01,0.01,0.04,0.00,0.04,0.00,0.00,0.02,0.00,0.20,0.02,0.00,0.04,0.00,0.14,0.01,0.01,0.04,-0.15,0.04,-0.00,-0.00,0.03,0.00,0.00,0.00,0.00,-0.00,0.71,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 14 | 0.01,0.00,0.07,0.08,0.00,0.49,0.10,0.07,0.26,0.00,0.54,0.04,0.01,0.33,0.00,0.44,0.13,0.01,0.20,0.00,0.52,0.10,0.07,0.26,-0.33,0.54,0.01,-0.00,0.27,0.08,0.00,0.05,0.08,-0.04,0.71,0.01,0.01,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 15 | 0.00,0.00,0.00,0.13,0.00,0.01,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,-0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.00,0.00,-0.00,0.61,0.01,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00 16 | 0.00,0.65,0.02,0.08,0.00,0.09,0.02,0.00,0.07,0.00,0.05,0.00,0.00,0.04,0.00,0.06,0.02,0.00,0.04,0.00,0.09,0.01,0.00,0.07,-0.05,0.05,-0.00,0.00,0.04,0.00,0.00,0.00,0.00,0.00,0.44,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00 17 | 0.00,0.00,0.00,0.22,0.00,0.03,0.00,0.00,0.01,0.00,0.03,0.00,0.00,0.02,0.00,0.01,0.01,0.00,0.01,0.00,0.03,0.00,0.00,0.01,-0.01,0.03,0.00,0.00,0.01,0.00,0.00,0.00,0.00,-0.00,0.65,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 18 | 0.00,0.00,0.01,0.08,0.00,0.47,0.05,0.02,0.24,0.00,0.35,0.02,0.00,0.25,0.00,0.58,0.07,0.00,0.20,0.00,0.47,0.05,0.02,0.25,-0.48,0.35,0.01,-0.00,0.22,0.00,0.00,0.00,0.00,0.00,0.85,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 19 | 0.00,0.00,0.01,0.08,0.00,0.26,0.03,0.01,0.13,0.00,0.12,0.01,0.00,0.08,0.00,0.31,0.06,0.01,0.13,0.00,0.26,0.02,0.01,0.13,-0.23,0.12,-0.00,-0.00,0.08,0.01,0.00,0.01,0.01,-0.00,0.40,0.00,0.00,0.00,0.58,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 20 | 0.00,0.01,0.00,0.57,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,-0.00,0.00,-0.00,0.00,0.00,0.00,0.00,0.00,0.00,-0.00,0.58,0.00,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 21 | 0.00,0.00,0.00,0.13,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,-0.00,0.00,-0.00,0.00,0.00,0.00,0.00,0.00,0.00,-0.00,0.49,0.01,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00 22 | 0.00,0.00,0.00,0.34,0.00,0.06,0.01,0.01,0.03,0.00,0.03,0.00,0.00,0.02,0.00,0.07,0.02,0.01,0.03,0.00,0.06,0.01,0.01,0.02,-0.04,0.03,-0.00,-0.00,0.02,0.01,0.00,0.00,0.01,0.00,0.88,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 23 | 0.00,0.00,0.00,0.17,0.00,0.11,0.01,0.01,0.03,0.00,0.02,0.00,0.00,0.02,0.00,0.03,0.01,0.00,0.02,0.00,0.11,0.01,0.01,0.03,-0.02,0.02,-0.00,-0.00,0.02,0.01,0.00,0.00,0.01,0.00,0.93,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 24 | 0.01,0.00,0.02,0.08,0.00,0.36,0.03,0.02,0.13,0.00,0.18,0.01,0.00,0.11,0.00,0.14,0.04,0.01,0.06,0.00,0.36,0.03,0.02,0.12,-0.09,0.18,0.01,-0.00,0.09,0.01,0.00,0.01,0.01,-0.00,0.46,0.01,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 25 | 0.00,0.00,0.02,0.01,0.00,0.02,0.01,0.00,0.01,0.00,0.02,0.00,0.00,0.01,0.00,0.02,0.01,0.00,0.01,0.00,0.03,0.01,0.00,0.01,-0.02,0.02,0.00,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.18,0.00,0.00,0.00,1.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 26 | 0.00,0.00,0.00,0.12,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,-0.00,0.00,-0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.94,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 27 | 0.00,0.00,0.00,0.23,0.00,0.29,0.01,0.00,0.09,0.00,0.14,0.00,0.00,0.07,0.00,0.24,0.02,0.00,0.06,0.00,0.18,0.01,0.00,0.06,-0.04,0.11,0.00,0.00,0.03,0.02,0.01,0.02,0.01,-0.01,0.51,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00 28 | 0.00,0.00,0.00,0.52,0.00,0.07,0.00,0.00,0.02,0.00,0.02,0.00,0.00,0.01,0.00,0.06,0.01,0.00,0.02,0.00,0.07,0.00,0.00,0.02,-0.04,0.02,-0.00,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.25,0.00,0.00,0.00,1.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 29 | 0.00,0.00,0.00,0.17,0.00,0.16,0.02,0.02,0.06,0.00,0.04,0.01,0.00,0.04,0.00,0.04,0.03,0.01,0.03,0.00,0.16,0.02,0.02,0.05,-0.03,0.04,-0.00,-0.00,0.04,0.02,0.00,0.02,0.02,-0.01,0.68,0.00,0.00,0.00,1.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00 30 | 0.00,0.12,0.00,0.30,0.00,0.02,0.00,0.00,0.01,0.00,0.02,0.00,0.00,0.01,0.00,0.03,0.01,0.00,0.01,0.00,0.02,0.00,0.00,0.01,-0.02,0.02,-0.00,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.25,0.01,0.00,0.00,1.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 31 | 0.01,0.00,0.01,0.23,0.00,0.35,0.05,0.02,0.18,0.00,0.16,0.02,0.00,0.14,0.00,0.43,0.09,0.02,0.16,0.00,0.35,0.05,0.02,0.17,-0.29,0.16,0.00,-0.00,0.12,0.00,0.00,0.00,0.00,0.00,0.22,0.02,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 32 | 0.00,0.00,0.01,0.17,0.00,0.44,0.03,0.02,0.14,0.00,0.36,0.02,0.00,0.16,0.00,0.18,0.05,0.01,0.09,0.00,0.46,0.03,0.02,0.14,-0.10,0.22,0.01,-0.00,0.09,0.01,0.01,0.00,0.01,0.01,0.03,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00 33 | 0.00,0.00,0.03,0.08,0.00,0.13,0.02,0.01,0.07,0.00,0.14,0.01,0.00,0.07,0.00,0.09,0.03,0.00,0.04,0.00,0.14,0.02,0.01,0.07,-0.04,0.14,0.00,0.00,0.05,0.12,0.07,0.09,0.12,-0.00,0.39,0.02,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 34 | 0.00,0.00,0.00,0.23,0.00,0.29,0.01,0.00,0.09,0.00,0.14,0.00,0.00,0.07,0.00,0.24,0.02,0.00,0.06,0.00,0.18,0.01,0.00,0.06,-0.04,0.11,0.00,0.00,0.03,0.00,0.00,0.01,0.01,-0.00,0.44,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00 35 | 0.00,0.00,0.00,0.34,0.00,0.02,0.00,0.00,0.02,0.00,0.02,0.00,0.00,0.01,0.00,0.01,0.01,0.00,0.01,0.00,0.02,0.00,0.00,0.02,-0.00,0.02,0.00,0.00,0.01,0.02,0.00,0.01,0.02,-0.00,0.88,0.02,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 36 | 0.00,0.00,0.00,0.08,0.00,0.18,0.02,0.01,0.08,0.00,0.21,0.01,0.00,0.07,0.00,0.21,0.03,0.00,0.07,0.00,0.20,0.02,0.01,0.08,-0.16,0.21,0.00,-0.00,0.07,0.08,0.00,0.12,0.09,-0.08,0.51,0.00,0.00,0.00,1.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00 37 | 0.00,0.01,0.00,0.57,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,-0.00,0.00,-0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.33,0.00,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 38 | 0.00,0.00,0.00,0.25,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,-0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.97,0.01,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 39 | 0.00,0.00,0.01,0.08,0.00,0.09,0.02,0.01,0.05,0.00,0.10,0.01,0.00,0.06,0.00,0.07,0.02,0.00,0.03,0.00,0.09,0.02,0.01,0.05,-0.05,0.10,0.00,-0.00,0.05,0.01,0.01,0.00,0.01,0.01,0.29,0.01,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 40 | 0.00,0.00,0.02,0.40,0.00,0.07,0.01,0.00,0.04,0.00,0.07,0.00,0.00,0.04,0.00,0.08,0.02,0.00,0.03,0.00,0.07,0.01,0.00,0.04,-0.06,0.07,0.00,0.00,0.03,0.00,0.00,0.00,0.00,-0.00,0.61,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 41 | 0.00,0.00,0.00,0.02,0.00,0.02,0.01,0.01,0.01,0.00,0.02,0.00,0.00,0.02,0.00,0.02,0.01,0.00,0.01,0.00,0.02,0.01,0.01,0.01,-0.02,0.02,0.00,0.00,0.01,0.00,0.00,0.01,0.00,-0.00,0.60,0.01,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 42 | 0.00,0.00,0.00,0.34,0.00,0.06,0.01,0.01,0.03,0.00,0.03,0.00,0.00,0.02,0.00,0.07,0.02,0.01,0.03,0.00,0.06,0.01,0.01,0.02,-0.04,0.03,-0.00,-0.00,0.02,0.00,0.00,0.01,0.00,-0.00,0.51,0.01,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00 43 | 0.00,0.00,0.00,0.08,0.00,0.06,0.01,0.01,0.03,0.00,0.06,0.01,0.00,0.04,0.00,0.05,0.02,0.00,0.03,0.00,0.06,0.01,0.01,0.03,-0.04,0.06,0.00,0.00,0.03,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 44 | 0.00,0.00,0.00,0.23,0.00,0.02,0.00,0.00,0.01,0.00,0.01,0.00,0.00,0.01,0.00,0.02,0.01,0.00,0.01,0.00,0.02,0.00,0.00,0.01,-0.01,0.01,-0.00,0.00,0.01,0.00,0.01,0.00,0.01,0.01,0.06,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00 45 | 0.01,0.00,0.03,0.08,0.00,0.51,0.07,0.03,0.28,0.00,0.57,0.03,0.01,0.34,0.00,0.55,0.12,0.02,0.21,0.00,0.54,0.07,0.03,0.29,-0.44,0.57,0.01,-0.00,0.26,0.05,0.06,0.00,0.06,0.06,0.12,0.01,0.00,0.00,1.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00 46 | 0.00,0.00,0.01,0.08,0.01,0.23,0.07,0.05,0.17,0.00,0.26,0.04,0.02,0.28,0.00,0.08,0.05,0.02,0.06,0.01,0.25,0.07,0.04,0.17,-0.05,0.26,0.03,0.00,0.19,0.05,0.00,0.01,0.05,-0.00,0.89,0.01,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00 47 | 0.00,0.01,0.00,0.57,0.00,0.01,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,-0.00,0.00,-0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.46,0.03,0.00,0.00,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00 48 | 0.01,0.00,0.04,0.08,0.00,0.85,0.07,0.04,0.28,0.00,0.95,0.03,0.01,0.33,0.00,0.72,0.11,0.03,0.19,0.00,0.90,0.07,0.04,0.28,-0.56,0.95,0.01,-0.00,0.25,0.02,0.00,0.03,0.02,-0.02,0.60,0.02,0.00,0.00,1.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00 49 | 0.00,0.00,0.01,0.23,0.00,0.13,0.03,0.03,0.09,0.00,0.08,0.01,0.01,0.07,0.00,0.16,0.06,0.01,0.08,0.00,0.13,0.03,0.03,0.08,-0.12,0.08,-0.00,-0.00,0.07,0.00,0.00,0.00,0.00,0.00,0.01,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00 50 | 0.06,0.00,0.14,0.58,0.01,0.89,0.10,0.06,0.35,0.00,1.00,0.04,0.01,0.48,0.00,0.47,0.15,0.05,0.22,0.01,0.95,0.09,0.05,0.35,-0.33,1.00,0.01,-0.01,0.35,0.12,0.02,0.15,0.12,-0.10,0.64,0.01,0.02,0.00,1.00,1.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,1.00,0.00,0.00,0.00,0.00 51 | -------------------------------------------------------------------------------- /data_short/fbys.csv: -------------------------------------------------------------------------------- 1 | 0.00 2 | 1.00 3 | 0.00 4 | 1.00 5 | 1.00 6 | 1.00 7 | 1.00 8 | 1.00 9 | 0.00 10 | 1.00 11 | 0.00 12 | 1.00 13 | 0.00 14 | 1.00 15 | 0.00 16 | 0.00 17 | 0.00 18 | 0.00 19 | 1.00 20 | 0.00 21 | 0.00 22 | 0.00 23 | 1.00 24 | 0.00 25 | 1.00 26 | 0.00 27 | 1.00 28 | 0.00 29 | 1.00 30 | 0.00 31 | 0.00 32 | 1.00 33 | 1.00 34 | 1.00 35 | 0.00 36 | 1.00 37 | 0.00 38 | 0.00 39 | 1.00 40 | 0.00 41 | 1.00 42 | 0.00 43 | 1.00 44 | 1.00 45 | 1.00 46 | 0.00 47 | 0.00 48 | 1.00 49 | 1.00 50 | 1.00 51 | -------------------------------------------------------------------------------- /data_short/ffxs.csv: -------------------------------------------------------------------------------- 1 | 0,0,0,0.3,0,0.08,0,0,0.03,0,0.03,0,0,0.02,0,0.08,0.01,0,0.02,0,0.09,0,0,0.02,-0.04,0.02,0,0,0.01,0,0,0,0,0,0.53,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0 2 | 0,0,0.01,0.15,0,0.44,0.01,0,0.16,0,0.18,0,0,0.08,0,0.57,0.03,0,0.15,0,0.42,0.01,0,0.15,-0.41,0.13,0,0,0.09,0.01,0.01,0,0.01,0.01,0.26,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0 3 | 0,0.01,0,0.3,0,0.01,0,0,0,0,0.01,0,0,0,0,0,0,0,0,0,0.01,0,0,0,0,0.01,0,0,0,0,0,0,0,0,0.38,0.02,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0 4 | 0,0,0.02,0.04,0,1,0.04,0.02,0.23,0,0.23,0.01,0,0.1,0,0.21,0.06,0.02,0.09,0,1,0.04,0.02,0.22,-0.14,0.23,0,0,0.09,0.03,0,0.02,0.03,-0.01,0.71,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0 5 | 0,0,0,0.05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.67,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0 6 | 0,0,0.02,0.08,0,0.36,0.03,0.02,0.13,0,0.4,0.01,0,0.17,0,0.22,0.04,0.01,0.08,0,0.38,0.03,0.02,0.14,-0.12,0.4,0,0,0.12,0.02,0,0.03,0.03,-0.03,0.54,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1 7 | 0,0,0,0.15,0,0.31,0.02,0.01,0.1,0,0.17,0.01,0,0.06,0,0.22,0.03,0,0.08,0,0.32,0.02,0.01,0.1,-0.18,0.17,0,0,0.07,0.01,0.01,0,0.01,0.01,0.06,0.18,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0 8 | 0,0,0.01,0.23,0,0.13,0.03,0.03,0.09,0,0.08,0.01,0.01,0.07,0,0.16,0.06,0.01,0.08,0,0.13,0.03,0.03,0.08,-0.12,0.08,0,0,0.07,0.07,0,0.04,0.06,-0.02,0.9,0,0.02,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0 9 | 0,0,0,0.04,0,0.04,0.01,0,0.02,0,0.05,0,0,0.02,0,0.03,0.01,0,0.02,0,0.04,0.01,0,0.02,-0.02,0.05,0,0,0.02,0,0,0.01,0,0,0.61,0.01,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1 10 | 0.01,0.66,0.06,0.08,0,0.66,0.08,0.05,0.27,0,0.62,0.03,0.01,0.24,0,0.47,0.12,0.02,0.2,0,0.68,0.07,0.05,0.27,-0.35,0.62,0,0,0.21,0.04,0.04,0,0.04,0.04,0.03,0.01,0.01,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0 11 | 0,0.05,0,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.17,0.01,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0 12 | 0,0,0.01,0.17,0,0.44,0.03,0.02,0.14,0,0.36,0.02,0,0.16,0,0.18,0.05,0.01,0.09,0,0.46,0.03,0.02,0.14,-0.1,0.22,0.01,0,0.09,0.05,0.06,0,0.06,0.06,0.08,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0 13 | 0,0,0,0.37,0,0.15,0.01,0.01,0.04,0,0.04,0,0,0.02,0,0.2,0.02,0,0.04,0,0.14,0.01,0.01,0.04,-0.15,0.04,0,0,0.03,0,0,0,0,0,0.71,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0 14 | 0.01,0,0.07,0.08,0,0.49,0.1,0.07,0.26,0,0.54,0.04,0.01,0.33,0,0.44,0.13,0.01,0.2,0,0.52,0.1,0.07,0.26,-0.33,0.54,0.01,0,0.27,0.08,0,0.05,0.08,-0.04,0.71,0.01,0.01,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0 15 | 0,0,0,0.13,0,0.01,0,0,0,0,0.01,0,0,0,0,0.01,0,0,0,0,0.01,0,0,0,0,0.01,0,0,0,0,0,0,0,0,0.61,0.01,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0 16 | 0,0.65,0.02,0.08,0,0.09,0.02,0,0.07,0,0.05,0,0,0.04,0,0.06,0.02,0,0.04,0,0.09,0.01,0,0.07,-0.05,0.05,0,0,0.04,0,0,0,0,0,0.44,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0 17 | 0,0,0,0.22,0,0.03,0,0,0.01,0,0.03,0,0,0.02,0,0.01,0.01,0,0.01,0,0.03,0,0,0.01,-0.01,0.03,0,0,0.01,0,0,0,0,0,0.65,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0 18 | 0,0,0.01,0.08,0,0.47,0.05,0.02,0.24,0,0.35,0.02,0,0.25,0,0.58,0.07,0,0.2,0,0.47,0.05,0.02,0.25,-0.48,0.35,0.01,0,0.22,0,0,0,0,0,0.85,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0 19 | 0,0,0.01,0.08,0,0.26,0.03,0.01,0.13,0,0.12,0.01,0,0.08,0,0.31,0.06,0.01,0.13,0,0.26,0.02,0.01,0.13,-0.23,0.12,0,0,0.08,0.01,0,0.01,0.01,0,0.4,0,0,0,0.58,0,0,0,1,0,0,0,0,0,0,0,1,0,0 20 | 0,0.01,0,0.57,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0.58,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0 21 | 0,0,0,0.13,0,0.01,0,0,0,0,0,0,0,0,0,0.01,0,0,0,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0.49,0.01,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0 22 | 0,0,0,0.34,0,0.06,0.01,0.01,0.03,0,0.03,0,0,0.02,0,0.07,0.02,0.01,0.03,0,0.06,0.01,0.01,0.02,-0.04,0.03,0,0,0.02,0.01,0,0,0.01,0,0.88,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0 23 | 0,0,0,0.17,0,0.11,0.01,0.01,0.03,0,0.02,0,0,0.02,0,0.03,0.01,0,0.02,0,0.11,0.01,0.01,0.03,-0.02,0.02,0,0,0.02,0.01,0,0,0.01,0,0.93,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0 24 | 0.01,0,0.02,0.08,0,0.36,0.03,0.02,0.13,0,0.18,0.01,0,0.11,0,0.14,0.04,0.01,0.06,0,0.36,0.03,0.02,0.12,-0.09,0.18,0.01,0,0.09,0.01,0,0.01,0.01,0,0.46,0.01,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0 25 | 0,0,0.02,0.01,0,0.02,0.01,0,0.01,0,0.02,0,0,0.01,0,0.02,0.01,0,0.01,0,0.03,0.01,0,0.01,-0.02,0.02,0,0,0.01,0,0,0,0,0,0.18,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0 26 | 0,0,0,0.12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.94,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0 27 | 0,0,0,0.23,0,0.29,0.01,0,0.09,0,0.14,0,0,0.07,0,0.24,0.02,0,0.06,0,0.18,0.01,0,0.06,-0.04,0.11,0,0,0.03,0.02,0.01,0.02,0.01,-0.01,0.51,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1 28 | 0,0,0,0.52,0,0.07,0,0,0.02,0,0.02,0,0,0.01,0,0.06,0.01,0,0.02,0,0.07,0,0,0.02,-0.04,0.02,0,0,0.01,0,0,0,0,0,0.25,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0 29 | 0,0,0,0.17,0,0.16,0.02,0.02,0.06,0,0.04,0.01,0,0.04,0,0.04,0.03,0.01,0.03,0,0.16,0.02,0.02,0.05,-0.03,0.04,0,0,0.04,0.02,0,0.02,0.02,-0.01,0.68,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0 30 | 0,0.12,0,0.3,0,0.02,0,0,0.01,0,0.02,0,0,0.01,0,0.03,0.01,0,0.01,0,0.02,0,0,0.01,-0.02,0.02,0,0,0.01,0,0,0,0,0,0.25,0.01,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0 31 | 0.01,0,0.01,0.23,0,0.35,0.05,0.02,0.18,0,0.16,0.02,0,0.14,0,0.43,0.09,0.02,0.16,0,0.35,0.05,0.02,0.17,-0.29,0.16,0,0,0.12,0,0,0,0,0,0.22,0.02,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0 32 | 0,0,0.01,0.17,0,0.44,0.03,0.02,0.14,0,0.36,0.02,0,0.16,0,0.18,0.05,0.01,0.09,0,0.46,0.03,0.02,0.14,-0.1,0.22,0.01,0,0.09,0.01,0.01,0,0.01,0.01,0.03,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0 33 | 0,0,0.03,0.08,0,0.13,0.02,0.01,0.07,0,0.14,0.01,0,0.07,0,0.09,0.03,0,0.04,0,0.14,0.02,0.01,0.07,-0.04,0.14,0,0,0.05,0.12,0.07,0.09,0.12,0,0.39,0.02,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0 34 | 0,0,0,0.23,0,0.29,0.01,0,0.09,0,0.14,0,0,0.07,0,0.24,0.02,0,0.06,0,0.18,0.01,0,0.06,-0.04,0.11,0,0,0.03,0,0,0.01,0.01,0,0.44,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1 35 | 0,0,0,0.34,0,0.02,0,0,0.02,0,0.02,0,0,0.01,0,0.01,0.01,0,0.01,0,0.02,0,0,0.02,0,0.02,0,0,0.01,0.02,0,0.01,0.02,0,0.88,0.02,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0 36 | 0,0,0,0.08,0,0.18,0.02,0.01,0.08,0,0.21,0.01,0,0.07,0,0.21,0.03,0,0.07,0,0.2,0.02,0.01,0.08,-0.16,0.21,0,0,0.07,0.08,0,0.12,0.09,-0.08,0.51,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0 37 | 0,0.01,0,0.57,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0.33,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0 38 | 0,0,0,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.97,0.01,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0 39 | 0,0,0.01,0.08,0,0.09,0.02,0.01,0.05,0,0.1,0.01,0,0.06,0,0.07,0.02,0,0.03,0,0.09,0.02,0.01,0.05,-0.05,0.1,0,0,0.05,0.01,0.01,0,0.01,0.01,0.29,0.01,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0 40 | 0,0,0.02,0.4,0,0.07,0.01,0,0.04,0,0.07,0,0,0.04,0,0.08,0.02,0,0.03,0,0.07,0.01,0,0.04,-0.06,0.07,0,0,0.03,0,0,0,0,0,0.61,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0 41 | 0,0,0,0.02,0,0.02,0.01,0.01,0.01,0,0.02,0,0,0.02,0,0.02,0.01,0,0.01,0,0.02,0.01,0.01,0.01,-0.02,0.02,0,0,0.01,0,0,0.01,0,0,0.6,0.01,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0 42 | 0,0,0,0.34,0,0.06,0.01,0.01,0.03,0,0.03,0,0,0.02,0,0.07,0.02,0.01,0.03,0,0.06,0.01,0.01,0.02,-0.04,0.03,0,0,0.02,0,0,0.01,0,0,0.51,0.01,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0 43 | 0,0,0,0.08,0,0.06,0.01,0.01,0.03,0,0.06,0.01,0,0.04,0,0.05,0.02,0,0.03,0,0.06,0.01,0.01,0.03,-0.04,0.06,0,0,0.03,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0 44 | 0,0,0,0.23,0,0.02,0,0,0.01,0,0.01,0,0,0.01,0,0.02,0.01,0,0.01,0,0.02,0,0,0.01,-0.01,0.01,0,0,0.01,0,0.01,0,0.01,0.01,0.06,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1 45 | 0.01,0,0.03,0.08,0,0.51,0.07,0.03,0.28,0,0.57,0.03,0.01,0.34,0,0.55,0.12,0.02,0.21,0,0.54,0.07,0.03,0.29,-0.44,0.57,0.01,0,0.26,0.05,0.06,0,0.06,0.06,0.12,0.01,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0 46 | 0,0,0.01,0.08,0.01,0.23,0.07,0.05,0.17,0,0.26,0.04,0.02,0.28,0,0.08,0.05,0.02,0.06,0.01,0.25,0.07,0.04,0.17,-0.05,0.26,0.03,0,0.19,0.05,0,0.01,0.05,0,0.89,0.01,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0 47 | 0,0.01,0,0.57,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0.46,0.03,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0 48 | 0.01,0,0.04,0.08,0,0.85,0.07,0.04,0.28,0,0.95,0.03,0.01,0.33,0,0.72,0.11,0.03,0.19,0,0.9,0.07,0.04,0.28,-0.56,0.95,0.01,0,0.25,0.02,0,0.03,0.02,-0.02,0.6,0.02,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0 49 | 0,0,0.01,0.23,0,0.13,0.03,0.03,0.09,0,0.08,0.01,0.01,0.07,0,0.16,0.06,0.01,0.08,0,0.13,0.03,0.03,0.08,-0.12,0.08,0,0,0.07,0,0,0,0,0,0.01,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0 50 | 0.06,0,0.14,0.58,0.01,0.89,0.1,0.06,0.35,0,1,0.04,0.01,0.48,0,0.47,0.15,0.05,0.22,0.01,0.95,0.09,0.05,0.35,-0.33,1,0.01,-0.01,0.35,0.12,0.02,0.15,0.12,-0.1,0.64,0.01,0.02,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0 -------------------------------------------------------------------------------- /data_short/ffys.csv: -------------------------------------------------------------------------------- 1 | 0 2 | 1 3 | 0 4 | 1 5 | 1 6 | 1 7 | 1 8 | 1 9 | 0 10 | 1 11 | 0 12 | 1 13 | 0 14 | 1 15 | 0 16 | 0 17 | 0 18 | 0 19 | 1 20 | 0 21 | 0 22 | 0 23 | 1 24 | 0 25 | 1 26 | 0 27 | 1 28 | 0 29 | 1 30 | 0 31 | 0 32 | 1 33 | 1 34 | 1 35 | 0 36 | 1 37 | 0 38 | 0 39 | 1 40 | 0 41 | 1 42 | 0 43 | 1 44 | 1 45 | 1 46 | 0 47 | 0 48 | 1 49 | 1 50 | 1 51 | -------------------------------------------------------------------------------- /data_short/incoming.csv: -------------------------------------------------------------------------------- 1 | 0,1,1,1,"4 - 1" 2 | 0,26,0,0,"189 - 26" 3 | 0,216,0,1,"216 - 110" 4 | 0,62,1,1,"76 - 62" 5 | 0,200,0,1,"200 - 193" 6 | 1,1,1,1,"4 - 1" 7 | 1,26,0,0,"189 - 26" 8 | 1,128,1,0,"157 - 128" 9 | 1,62,1,1,"76 - 62" 10 | 1,65,1,1,"65 - 25" 11 | 1,158,1,1,"158 - 98" 12 | 2,97,0,0,"97 - 36" 13 | 2,7,1,1,"212 - 7" 14 | 2,96,0,0,"96 - 74" 15 | 2,208,0,0,"208 - 77" 16 | 2,52,1,1,"122 - 52" 17 | 2,191,1,0,"235 - 191" 18 | 2,185,1,0,"185 - 40" 19 | 2,152,1,1,"165 - 152" 20 | 2,90,1,1,"90 - 51" 21 | 2,3,0,0,"19 - 3" 22 | 2,193,0,0,"193 - 64" 23 | 2,192,1,1,"197 - 192" 24 | 2,44,0,1,"44 - 16" 25 | 2,243,1,0,"243 - 46" 26 | 2,30,0,1,"184 - 30" 27 | 2,131,0,0,"131 - 69" 28 | 2,133,0,0,"133 - 14" 29 | 2,244,1,1,"244 - 105" 30 | 2,116,0,0,"182 - 116" 31 | 2,128,1,0,"157 - 128" 32 | 2,38,0,1,"38 - 24" 33 | 2,112,0,1,"143 - 112" 34 | 2,13,0,0,"214 - 13" 35 | 2,107,0,1,"220 - 107" 36 | 2,203,0,1,"203 - 130" 37 | 2,89,0,0,"226 - 89" 38 | 2,200,0,1,"200 - 93" 39 | 2,172,0,1,"172 - 107" 40 | 2,173,0,0,"173 - 171" 41 | 2,99,0,1,"99 - 53" 42 | 2,211,0,0,"211 - 35" 43 | 2,239,1,0,"239 - 104" 44 | 2,213,0,1,"213 - 151" 45 | 2,65,1,1,"135 - 65" 46 | 2,164,1,0,"245 - 164" 47 | 3,97,0,0,"97 - 36" 48 | 3,6,0,0,"203 - 6" 49 | 3,7,1,1,"212 - 7" 50 | 3,96,0,0,"96 - 74" 51 | 3,140,1,0,"140 - 57" 52 | 3,208,0,0,"208 - 77" 53 | 3,80,0,0,"213 - 80" 54 | 3,95,0,0,"95 - 41" 55 | 3,81,1,1,"81 - 9" 56 | 3,52,1,1,"122 - 52" 57 | 3,191,1,0,"235 - 191" 58 | 3,185,1,0,"185 - 40" 59 | 3,152,1,1,"165 - 152" 60 | 3,90,1,1,"90 - 51" 61 | 3,3,0,0,"19 - 3" 62 | 3,193,0,0,"193 - 64" 63 | 3,192,1,1,"197 - 192" 64 | 3,44,0,1,"44 - 16" 65 | 3,87,0,1,"204 - 87" 66 | 3,36,0,1,"97 - 36" 67 | 3,243,1,0,"243 - 46" 68 | 3,134,1,0,"134 - 85" 69 | 3,30,0,1,"184 - 30" 70 | 3,131,0,0,"131 - 69" 71 | 3,131,0,0,"188 - 131" 72 | 3,119,0,1,"119 - 29" 73 | 3,119,0,1,"147 - 119" 74 | 3,133,0,0,"133 - 14" 75 | 3,126,0,0,"126 - 53" 76 | 3,244,1,1,"244 - 105" 77 | 3,244,1,1,"244 - 176" 78 | 3,103,0,1,"111 - 103" 79 | 3,116,0,0,"182 - 116" 80 | 3,248,0,0,"248 - 231" 81 | 3,128,1,0,"157 - 128" 82 | 3,112,0,1,"143 - 112" 83 | 3,13,0,0,"214 - 13" 84 | 3,107,0,1,"220 - 107" 85 | 3,107,0,1,"172 - 107" 86 | 3,89,0,0,"226 - 89" 87 | 3,8,0,1,"38 - 8" 88 | 3,66,0,0,"205 - 66" 89 | 3,173,0,0,"173 - 171" 90 | 3,211,0,0,"211 - 35" 91 | 3,211,0,0,"211 - 151" 92 | 3,239,1,0,"239 - 104" 93 | 3,58,1,0,"183 - 58" 94 | 3,65,1,1,"135 - 65" 95 | 3,164,1,0,"245 - 164" 96 | 4,169,1,1,"169 - 113" 97 | 4,6,0,0,"203 - 6" 98 | 4,54,0,1,"111 - 54" 99 | 4,140,1,0,"140 - 57" 100 | 4,208,0,0,"208 - 77" 101 | 4,80,0,0,"213 - 80" 102 | 4,56,0,0,"90 - 56" 103 | 4,95,0,0,"95 - 41" 104 | 4,81,1,1,"81 - 9" 105 | 4,81,1,1,"81 - 30" 106 | 4,191,1,0,"191 - 130" 107 | 4,191,1,0,"235 - 191" 108 | 4,185,1,0,"185 - 40" 109 | 4,152,1,1,"165 - 152" 110 | 4,146,1,1,"221 - 146" 111 | 4,44,0,1,"44 - 16" 112 | 4,87,0,1,"204 - 87" 113 | 4,87,0,1,"204 - 87" 114 | 4,36,0,1,"97 - 36" 115 | 4,36,0,1,"226 - 36" 116 | 4,137,0,1,"137 - 67" 117 | 4,243,1,0,"243 - 197" 118 | 4,134,1,0,"134 - 85" 119 | 4,25,0,0,"65 - 25" 120 | 4,131,0,0,"188 - 131" 121 | 4,119,0,1,"147 - 119" 122 | 4,119,0,1,"182 - 119" 123 | 4,26,0,0,"173 - 26" 124 | 4,126,0,0,"126 - 53" 125 | 4,103,0,1,"111 - 103" 126 | 4,248,0,0,"248 - 231" 127 | 4,128,1,0,"157 - 128" 128 | 4,28,0,0,"101 - 28" 129 | 4,105,0,1,"105 - 7" 130 | 4,112,0,1,"112 - 15" 131 | 4,107,0,1,"172 - 107" 132 | 4,107,0,1,"220 - 107" 133 | 4,216,0,1,"216 - 3" 134 | 4,200,0,1,"200 - 93" 135 | 4,8,0,1,"38 - 8" 136 | 4,66,0,0,"205 - 66" 137 | 4,211,0,0,"211 - 151" 138 | 4,213,0,1,"233 - 213" 139 | 4,70,0,0,"135 - 70" 140 | 4,58,1,0,"183 - 58" 141 | 5,182,0,1,"182 - 169" 142 | 5,54,0,1,"111 - 54" 143 | 5,40,0,1,"185 - 40" 144 | 5,7,1,1,"105 - 7" 145 | 5,208,0,0,"208 - 77" 146 | 5,80,0,0,"80 - 22" 147 | 5,56,0,0,"90 - 56" 148 | 5,81,1,1,"81 - 30" 149 | 5,52,1,1,"239 - 52" 150 | 5,191,1,0,"235 - 191" 151 | 5,185,1,0,"185 - 40" 152 | 5,152,1,1,"165 - 152" 153 | 5,146,1,1,"221 - 146" 154 | 5,193,0,0,"193 - 46" 155 | 5,192,1,1,"192 - 64" 156 | 5,2,0,1,"145 - 2" 157 | 5,87,0,1,"204 - 87" 158 | 5,36,0,1,"226 - 36" 159 | 5,36,0,1,"226 - 36" 160 | 5,243,1,0,"243 - 197" 161 | 5,134,1,0,"134 - 55" 162 | 5,25,0,0,"65 - 25" 163 | 5,119,0,1,"182 - 119" 164 | 5,26,0,0,"173 - 26" 165 | 5,27,1,1,"188 - 27" 166 | 5,132,0,1,"132 - 14" 167 | 5,28,0,0,"101 - 28" 168 | 5,39,1,1,"78 - 39" 169 | 5,107,0,1,"220 - 107" 170 | 5,107,0,1,"220 - 107" 171 | 5,216,0,1,"216 - 110" 172 | 5,238,1,1,"238 - 172" 173 | 5,66,0,0,"215 - 66" 174 | 5,205,0,1,"205 - 143" 175 | 5,211,0,0,"211 - 151" 176 | 5,213,0,1,"233 - 213" 177 | 5,165,0,1,"228 - 165" 178 | 5,70,0,0,"135 - 70" 179 | 5,59,0,0,"74 - 59" 180 | -------------------------------------------------------------------------------- /data_short/incoming1.csv: -------------------------------------------------------------------------------- 1 | 1,1,1,1,"1" 2 | 1,1,1,1,"1" 3 | 1,1,1,1,"1" 4 | 1,2,2,1,"1" 5 | 1,2,2,1,"1" 6 | 1,2,2,1,"1" 7 | 1,2,2,1,"1" 8 | -------------------------------------------------------------------------------- /data_short/made_up.csv: -------------------------------------------------------------------------------- 1 | 1,2.00 2 | 3,4.00 3 | 5,6.00 4 | -------------------------------------------------------------------------------- /data_short/normal.csv: -------------------------------------------------------------------------------- 1 | 0,0 2 | 0,1 3 | 1,0 4 | 1,1 5 | 2,0 6 | 7 | -------------------------------------------------------------------------------- /data_short/outgoing.csv: -------------------------------------------------------------------------------- 1 | 0,4,1,1,"4 - 1" 2 | 0,185,1,0,"232 - 185" 3 | 0,193,0,0,"200 - 193" 4 | 0,76,1,1,"76 - 62" 5 | 1,4,1,1,"4 - 1" 6 | 1,36,0,1,"147 - 36" 7 | 1,120,0,0,"226 - 120" 8 | 1,25,0,0,"65 - 25" 9 | 1,101,1,1,"101 - 17" 10 | 1,76,1,1,"76 - 62" 11 | 2,182,0,1,"182 - 116" 12 | 2,54,0,1,"75 - 54" 13 | 2,40,0,1,"185 - 40" 14 | 2,221,0,1,"221 - 198" 15 | 2,218,1,1,"218 - 24" 16 | 2,50,0,1,"196 - 50" 17 | 2,2,0,1,"145 - 2" 18 | 2,87,0,1,"139 - 87" 19 | 2,36,0,1,"97 - 36" 20 | 2,137,0,1,"137 - 113" 21 | 2,19,0,1,"19 - 3" 22 | 2,119,0,1,"147 - 119" 23 | 2,103,0,1,"136 - 103" 24 | 2,101,1,1,"101 - 17" 25 | 2,101,1,1,"101 - 17" 26 | 2,105,0,1,"244 - 105" 27 | 2,10,0,1,"57 - 10" 28 | 2,107,0,1,"172 - 107" 29 | 2,216,0,1,"216 - 110" 30 | 2,149,1,0,"149 - 123" 31 | 2,89,0,0,"178 - 89" 32 | 2,8,0,1,"8 - EM911" 33 | 2,165,0,1,"165 - 152" 34 | 2,206,0,1,"206 - 148" 35 | 3,97,0,0,"97 - 36" 36 | 3,182,0,1,"182 - 116" 37 | 3,54,0,1,"75 - 54" 38 | 3,40,0,1,"185 - 40" 39 | 3,221,0,1,"221 - 198" 40 | 3,221,0,1,"221 - 199" 41 | 3,90,1,1,"90 - 51" 42 | 3,218,1,1,"218 - 24" 43 | 3,193,0,0,"193 - 64" 44 | 3,50,0,1,"196 - 50" 45 | 3,2,0,1,"145 - 2" 46 | 3,87,0,1,"139 - 87" 47 | 3,36,0,1,"97 - 36" 48 | 3,137,0,1,"137 - 113" 49 | 3,243,1,0,"243 - 46" 50 | 3,19,0,1,"19 - 3" 51 | 3,133,0,0,"133 - 83" 52 | 3,132,0,1,"132 - 20" 53 | 3,103,0,1,"136 - 103" 54 | 3,101,1,1,"101 - 17" 55 | 3,101,1,1,"101 - 17" 56 | 3,105,0,1,"244 - 105" 57 | 3,10,0,1,"125 - 10" 58 | 3,38,0,1,"38 - 8" 59 | 3,216,0,1,"216 - 110" 60 | 3,149,1,0,"149 - 123" 61 | 3,203,0,1,"203 - 6" 62 | 3,204,1,1,"204 - 87" 63 | 3,172,0,1,"172 - 107" 64 | 3,8,0,1,"8 - EM911" 65 | 3,99,0,1,"190 - 99" 66 | 3,205,0,1,"205 - 66" 67 | 3,213,0,1,"213 - 80" 68 | 3,165,0,1,"165 - 152" 69 | 3,206,0,1,"206 - 148" 70 | 4,97,0,0,"97 - 36" 71 | 4,182,0,1,"182 - 119" 72 | 4,54,0,1,"104 - 54" 73 | 4,40,0,1,"185 - 40" 74 | 4,7,1,1,"105 - 7" 75 | 4,140,1,0,"140 - 57" 76 | 4,95,0,0,"95 - 41" 77 | 4,221,0,1,"221 - 199" 78 | 4,221,0,1,"221 - 146" 79 | 4,52,1,1,"122 - 52" 80 | 4,90,1,1,"90 - 51" 81 | 4,90,1,1,"90 - 56" 82 | 4,218,1,1,"218 - 162" 83 | 4,3,0,0,"216 - 3" 84 | 4,193,0,0,"193 - 64" 85 | 4,50,0,1,"124 - 50" 86 | 4,2,0,1,"139 - 2" 87 | 4,243,1,0,"243 - 46" 88 | 4,19,0,1,"110 - 19" 89 | 4,30,0,1,"81 - 30" 90 | 4,133,0,0,"133 - 83" 91 | 4,133,0,0,"153 - 133" 92 | 4,126,0,0,"126 - 17" 93 | 4,132,0,1,"132 - 20" 94 | 4,244,1,1,"244 - 84" 95 | 4,101,1,1,"101 - 17" 96 | 4,101,1,1,"101 - 28" 97 | 4,10,0,1,"125 - 10" 98 | 4,38,0,1,"38 - 8" 99 | 4,38,0,1,"38 - 24" 100 | 4,203,0,1,"203 - 6" 101 | 4,204,1,1,"204 - 87" 102 | 4,204,1,1,"204 - 87" 103 | 4,172,0,1,"172 - 107" 104 | 4,173,0,0,"173 - 26" 105 | 4,99,0,1,"190 - 99" 106 | 4,205,0,1,"205 - 66" 107 | 4,239,1,0,"239 - 104" 108 | 4,213,0,1,"213 - 80" 109 | 4,165,0,1,"165 - 152" 110 | 4,65,1,1,"65 - 25" 111 | 5,169,1,1,"182 - 169" 112 | 5,182,0,1,"182 - 119" 113 | 5,40,0,1,"185 - 40" 114 | 5,140,1,0,"140 - 57" 115 | 5,208,0,0,"208 - 77" 116 | 5,95,0,0,"95 - 41" 117 | 5,95,0,0,"95 - 29" 118 | 5,221,0,1,"221 - 146" 119 | 5,52,1,1,"122 - 52" 120 | 5,185,1,0,"185 - 40" 121 | 5,90,1,1,"90 - 56" 122 | 5,90,1,1,"90 - EM911" 123 | 5,218,1,1,"218 - 162" 124 | 5,218,1,1,"218 - 162" 125 | 5,44,0,1,"201 - 44" 126 | 5,50,0,1,"196 - 50" 127 | 5,2,0,1,"139 - 2" 128 | 5,137,0,1,"137 - 41" 129 | 5,19,0,1,"110 - 19" 130 | 5,30,0,1,"81 - 30" 131 | 5,133,0,0,"153 - 133" 132 | 5,126,0,0,"126 - 17" 133 | 5,244,1,1,"244 - 84" 134 | 5,103,0,1,"136 - 103" 135 | 5,128,1,0,"157 - 128" 136 | 5,101,1,1,"101 - 28" 137 | 5,101,1,1,"101 - 53" 138 | 5,105,0,1,"105 - 7" 139 | 5,10,0,1,"42 - 10" 140 | 5,38,0,1,"38 - 24" 141 | 5,38,0,1,"38 - 24" 142 | 5,112,0,1,"227 - 112" 143 | 5,13,0,0,"214 - 13" 144 | 5,200,0,1,"200 - 93" 145 | 5,204,1,1,"204 - 87" 146 | 5,172,0,1,"238 - 172" 147 | 5,8,0,1,"186 - 8" 148 | 5,173,0,0,"173 - 26" 149 | 5,173,0,0,"202 - 173" 150 | 5,99,0,1,"99 - 17" 151 | 5,239,1,0,"239 - 104" 152 | 5,239,1,0,"239 - 52" 153 | 5,165,0,1,"165 - 152" 154 | 5,58,1,0,"183 - 58" 155 | 5,65,1,1,"65 - 25" 156 | 5,71,0,0,"139 - 71" 157 | 5,206,0,1,"206 - 72" 158 | -------------------------------------------------------------------------------- /data_short/outgoing1.csv: -------------------------------------------------------------------------------- 1 | 1,1,1,1,"1" 2 | 1,1,1,1,"1" 3 | 1,1,1,1,"1" 4 | 1,2,2,1,"1" 5 | 1,2,2,1,"1" 6 | 1,2,2,1,"1" 7 | 1,2,2,1,"1" 8 | -------------------------------------------------------------------------------- /data_short/schedule.csv: -------------------------------------------------------------------------------- 1 | 0,0,1,0,0,0 2 | 0,0,1,0,0,0 3 | 0,0,1,0,0,0 4 | 0,0,1,0,0,0 5 | 0,0,1,0,0,0 6 | 1,1,1,1,1,1 7 | 0,0,1,0,0,0 8 | 0,0,1,0,0,0 9 | 0,0,1,0,0,0 10 | 0,0,1,0,0,0 11 | 0,0,1,0,0,0 12 | 1,1,1,1,1,1 13 | -------------------------------------------------------------------------------- /data_short/ys.csv: -------------------------------------------------------------------------------- 1 | -1.000000000000000000e+00 2 | -1.000000000000000000e+00 3 | 1.000000000000000000e+00 4 | -1.000000000000000000e+00 5 | -1.000000000000000000e+00 6 | -1.000000000000000000e+00 7 | 1.000000000000000000e+00 8 | -1.000000000000000000e+00 9 | -1.000000000000000000e+00 10 | -1.000000000000000000e+00 11 | 1.000000000000000000e+00 12 | 1.000000000000000000e+00 13 | 1.000000000000000000e+00 14 | -1.000000000000000000e+00 15 | -1.000000000000000000e+00 16 | -1.000000000000000000e+00 17 | -1.000000000000000000e+00 18 | -1.000000000000000000e+00 19 | 1.000000000000000000e+00 20 | -1.000000000000000000e+00 21 | 1.000000000000000000e+00 22 | 1.000000000000000000e+00 23 | -1.000000000000000000e+00 24 | -1.000000000000000000e+00 25 | -1.000000000000000000e+00 26 | -1.000000000000000000e+00 27 | -1.000000000000000000e+00 28 | -1.000000000000000000e+00 29 | -1.000000000000000000e+00 30 | -1.000000000000000000e+00 31 | -1.000000000000000000e+00 32 | -1.000000000000000000e+00 33 | 1.000000000000000000e+00 34 | -1.000000000000000000e+00 35 | -1.000000000000000000e+00 36 | -1.000000000000000000e+00 37 | 1.000000000000000000e+00 38 | 1.000000000000000000e+00 39 | -1.000000000000000000e+00 40 | -1.000000000000000000e+00 41 | -1.000000000000000000e+00 42 | 1.000000000000000000e+00 43 | -1.000000000000000000e+00 44 | -1.000000000000000000e+00 45 | -1.000000000000000000e+00 46 | 1.000000000000000000e+00 47 | -1.000000000000000000e+00 48 | -1.000000000000000000e+00 49 | -1.000000000000000000e+00 50 | -1.000000000000000000e+00 51 | -1.000000000000000000e+00 52 | -1.000000000000000000e+00 53 | -1.000000000000000000e+00 54 | 1.000000000000000000e+00 55 | 1.000000000000000000e+00 56 | 1.000000000000000000e+00 57 | -1.000000000000000000e+00 58 | 1.000000000000000000e+00 59 | -1.000000000000000000e+00 60 | 1.000000000000000000e+00 61 | -1.000000000000000000e+00 62 | -1.000000000000000000e+00 63 | -1.000000000000000000e+00 64 | -1.000000000000000000e+00 65 | 1.000000000000000000e+00 66 | -1.000000000000000000e+00 67 | -1.000000000000000000e+00 68 | 1.000000000000000000e+00 69 | -1.000000000000000000e+00 70 | -1.000000000000000000e+00 71 | -1.000000000000000000e+00 72 | -1.000000000000000000e+00 73 | -1.000000000000000000e+00 74 | -1.000000000000000000e+00 75 | -1.000000000000000000e+00 76 | -1.000000000000000000e+00 77 | -1.000000000000000000e+00 78 | -1.000000000000000000e+00 79 | 1.000000000000000000e+00 80 | 1.000000000000000000e+00 81 | -1.000000000000000000e+00 82 | -1.000000000000000000e+00 83 | 1.000000000000000000e+00 84 | -1.000000000000000000e+00 85 | -1.000000000000000000e+00 86 | -1.000000000000000000e+00 87 | -1.000000000000000000e+00 88 | -1.000000000000000000e+00 89 | -1.000000000000000000e+00 90 | -1.000000000000000000e+00 91 | 1.000000000000000000e+00 92 | -1.000000000000000000e+00 93 | -1.000000000000000000e+00 94 | 1.000000000000000000e+00 95 | -1.000000000000000000e+00 96 | 1.000000000000000000e+00 97 | -1.000000000000000000e+00 98 | 1.000000000000000000e+00 99 | -1.000000000000000000e+00 100 | -1.000000000000000000e+00 101 | -------------------------------------------------------------------------------- /duet.cabal: -------------------------------------------------------------------------------- 1 | cabal-version: 2.2 2 | 3 | -- This file has been generated from package.yaml by hpack version 0.31.1. 4 | -- 5 | -- see: https://github.com/sol/hpack 6 | -- 7 | -- hash: 6766d24c3f9745b959cac010036671b3157c536ca762ff56966225333661f963 8 | 9 | name: duet 10 | version: 0.0.0.0 11 | build-type: Simple 12 | 13 | executable duet 14 | main-is: Main.hs 15 | other-modules: 16 | Duet 17 | Duet.Check 18 | Duet.Interpreter 19 | Duet.Parser 20 | Duet.Pretty 21 | Duet.Quantity 22 | Duet.RNF 23 | Duet.Syntax 24 | Duet.UVMHS 25 | Paths_duet 26 | hs-source-dirs: 27 | src 28 | main 29 | default-extensions: ConstraintKinds DataKinds ExplicitNamespaces FlexibleContexts FlexibleInstances FunctionalDependencies GADTs GeneralizedNewtypeDeriving InstanceSigs KindSignatures LambdaCase MonadComprehensions MultiParamTypeClasses NoImplicitPrelude OverloadedStrings PatternSynonyms PolyKinds QuantifiedConstraints RankNTypes RebindableSyntax ScopedTypeVariables StandaloneDeriving Strict StrictData TemplateHaskell TypeApplications TypeFamilies TypeOperators UndecidableInstances UndecidableSuperClasses UnicodeSyntax ViewPatterns 30 | ghc-options: -Wall -Wno-orphans -Wno-partial-type-signatures -j -O0 -threaded -rtsopts -with-rtsopts=-N 31 | build-depends: 32 | base 33 | , mwc-random 34 | , normaldistribution >=1.1.0.3 35 | , random 36 | , time 37 | , uvmhs 38 | default-language: Haskell2010 39 | -------------------------------------------------------------------------------- /examples.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | for e in gd-pb.ed.duet bolt-on.ed.duet fw.ed.duet gd-pb-mini.ed.duet parallel-privacy.ed.duet gd-unbounded-pb.ed.duet hyperparam.ed.duet adaptive-clip.ed.duet normalize.ed.duet; do 4 | echo "================================================================================" 5 | echo "Running example:" $e 6 | echo "================================================================================" 7 | stack run -- check examples/complete/${e} 8 | done 9 | -------------------------------------------------------------------------------- /examples/complete/README.md: -------------------------------------------------------------------------------- 1 | Included in this directory are example input/output for several programming 2 | running through our tool. .ed.duet is an example input program, and 3 | .ed.duet.output shows the running time of various phases of our type 4 | checker, including the final inferred type of the program, which includes 5 | privacy bounds. 6 | 7 | Our input programs and output results uses several unicode characters. If you 8 | cannot see some symbols, try viewing the files using Deja Vu Sans Mono or Deja 9 | Vu Sans fonts. 10 | 11 | The source code for our tool could not be anonymized for double-blind 12 | submission. We intend on releasing our tool as open source via GitHub after 13 | review, as well as submitting our tool for artifact evaluation. We would be 14 | happy to provide a zip archive of the tool to reviewers after authors have been 15 | identified–we did not see any option to submit non-anonymized supplemental 16 | material at submission time. 17 | -------------------------------------------------------------------------------- /examples/complete/adaptive-clip-eps.zcdp.duet: -------------------------------------------------------------------------------- 1 | let query = sλ . 2 | b: 𝔻 3 | ⇒ 4 | sλ m : ℕ, 5 | n : ℕ 6 | . 7 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] 8 | ⇒ 9 | let scaled = mmap xs { x ⇒ b ⋅ x } in 10 | let clipped = mmap (mclip[L2] scaled) { x ⇒ x } in 11 | let filtered = mfilter zip[clipped, xs] { row ⇒ 12 | let ⟨clipped, orig⟩ = row#[ℕ[0], ℕ[0]] in 13 | clipped ≡ orig } in 14 | ℝ⁺[0.5] ⋅ real (rows filtered) 15 | in 16 | 17 | 18 | let pick = pλ m : ℕ, 19 | n : ℕ, 20 | ε : ℝ⁺, 21 | k : ℕ 22 | . 23 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 24 | ε : ℝ⁺[ε], 25 | bs : 𝕄 [L1, U|1, k⋅𝔻 ] 26 | ⇒ 27 | let target = 0.9 ⋅ real (rows xs) in 28 | let fs = mmap bs { b ⇒ query b } in 29 | EPSDP { AboveThreshold [ ε, fs, target ] { xs } } 30 | in 31 | 32 | let scaleAndClip = sλ m : ℕ, 33 | n : ℕ 34 | . 35 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ], 36 | b: 𝔻 37 | ⇒ 38 | let scaled = mmap xs { x ⇒ b ⋅ x } in 39 | let clipped = mclip[L2] scaled in 40 | clipped 41 | in 42 | 43 | let main = pλ m : ℕ, 44 | n : ℕ, 45 | ε : ℝ⁺, 46 | k : ℕ, 47 | δ : ℝ⁺, 48 | ρ : ℝ⁺, 49 | k : ℕ 50 | . 51 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 52 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 53 | ε : ℝ⁺[ε], 54 | k : ℕ[k], 55 | δ : ℝ⁺[δ], 56 | ρ : ℝ⁺[ρ], 57 | η : ℝ, 58 | bs : 𝕄 [L1, U|1, k⋅𝔻 ] 59 | ⇒ 60 | let m₀ = mcreate[ L∞ | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 61 | b ← pick@[m, n, ε, k. xs, ε, bs]; 62 | let c = box (scaleAndClip@[m,n] xs (bs#[idx ℕ[0], b])) in 63 | 64 | loop k on m₀ { a, θ ⇒ 65 | let s = ℝ⁺[1.0] / real (rows xs) in 66 | g ← mgauss[ s , ρ ] { ∇[ LR | θ ; unbox c , ys ] } ; 67 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 68 | } 69 | 70 | in main 71 | 72 | -------------------------------------------------------------------------------- /examples/complete/adaptive-clip-eps.zcdp.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/adaptive-clip-eps.zcdp.duet 3 | ================================================================================ 4 | READING 5 | (2.81e-4s) 6 | TOKENIZING 7 | (6.085386s) 8 | PARSING 9 | (0.683565s) 10 | TYPE CHECKING 11 | (1.109e-3s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ m:ℕ , n:ℕ , ε:ℝ⁺ , k:ℕ , δ:ℝ⁺ , ρ:ℝ⁺ , k:ℕ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@0.5ε^2+kρ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@kρ 18 | , ℝ⁺[ε]@⊤ 19 | , ℕ[k]@⊤ 20 | , ℝ⁺[δ]@⊥ 21 | , ℝ⁺[ρ]@⊤ 22 | , ℝ@⊤ 23 | , 𝕄 [L1,U|1,(k ⋅ 𝔻 )]@⊤ 24 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 25 | ⟩ 26 | -------------------------------------------------------------------------------- /examples/complete/adaptive-clip-zcdp.ed.duet: -------------------------------------------------------------------------------- 1 | let query = sλ . 2 | b: 𝔻 3 | ⇒ 4 | sλ m : ℕ, 5 | n : ℕ 6 | . 7 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] 8 | ⇒ 9 | let scaled = mmap xs { x ⇒ b ⋅ x } in 10 | let clipped = mmap (mclip[L2] scaled) { x ⇒ x } in 11 | let filtered = mfilter zip[clipped, xs] { row ⇒ 12 | let ⟨clipped, orig⟩ = row#[ℕ[0], ℕ[0]] in 13 | clipped ≡ orig } in 14 | ℝ⁺[0.5] ⋅ real (rows filtered) 15 | in 16 | 17 | 18 | let pick = pλ m : ℕ, 19 | n : ℕ, 20 | ε : ℝ⁺, 21 | k : ℕ 22 | . 23 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 24 | ε : ℝ⁺[ε], 25 | bs : 𝕄 [L1, U|1, k⋅𝔻 ] 26 | ⇒ 27 | let target = 0.9 ⋅ real (rows xs) in 28 | let fs = mmap bs { b ⇒ query b } in 29 | AboveThreshold [ ε, fs, target ] { xs } 30 | in 31 | 32 | let scaleAndClip = sλ m : ℕ, 33 | n : ℕ 34 | . 35 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ], 36 | b: 𝔻 37 | ⇒ 38 | let scaled = mmap xs { x ⇒ b ⋅ x } in 39 | let clipped = mclip[L2] scaled in 40 | clipped 41 | in 42 | 43 | let main = pλ m : ℕ, 44 | n : ℕ, 45 | ε : ℝ⁺, 46 | k : ℕ, 47 | δ : ℝ⁺, 48 | ρ : ℝ⁺, 49 | k : ℕ 50 | . 51 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 52 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 53 | ε : ℝ⁺[ε], 54 | k : ℕ[k], 55 | δ : ℝ⁺[δ], 56 | ρ : ℝ⁺[ρ], 57 | η : ℝ, 58 | bs : 𝕄 [L1, U|1, k⋅𝔻 ] 59 | ⇒ 60 | let m₀ = mcreate[ L∞ | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 61 | b ← pick@[m, n, ε, k. xs, ε, bs]; 62 | let c = box (scaleAndClip@[m,n] xs (bs#[idx ℕ[0], b])) in 63 | ZCDP[ δ ] { 64 | loop k on m₀ { a, θ ⇒ 65 | let s = ℝ⁺[1.0] / real (rows xs) in 66 | g ← mgauss[ s , ρ ] { ∇[ LR | θ ; unbox c , ys ] } ; 67 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 68 | } 69 | } 70 | 71 | in main 72 | 73 | -------------------------------------------------------------------------------- /examples/complete/adaptive-clip-zcdp.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/adaptive-clip-zcdp.ed.duet 3 | ================================================================================ 4 | READING 5 | (3.12e-4s) 6 | TOKENIZING 7 | (6.082847s) 8 | PARSING 9 | (0.657431s) 10 | TYPE CHECKING 11 | (1.014e-3s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ m:ℕ , n:ℕ , ε:ℝ⁺ , k:ℕ , δ:ℝ⁺ , ρ:ℝ⁺ , k:ℕ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@⟨kρ+ε+2√(kρ㏒1/δ),δ⟩ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@⟨kρ+2√(kρ㏒1/δ),δ⟩ 18 | , ℝ⁺[ε]@⊤ 19 | , ℕ[k]@⊤ 20 | , ℝ⁺[δ]@⊤ 21 | , ℝ⁺[ρ]@⊤ 22 | , ℝ@⊤ 23 | , 𝕄 [L1,U|1,(k ⋅ 𝔻 )]@⊤ 24 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 25 | ⟩ 26 | -------------------------------------------------------------------------------- /examples/complete/adaptive-clip.ed.duet: -------------------------------------------------------------------------------- 1 | let query = sλ . 2 | b: 𝔻 3 | ⇒ 4 | sλ m : ℕ, 5 | n : ℕ 6 | . 7 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] 8 | ⇒ 9 | let scaled = mmap xs { x ⇒ b ⋅ x } in 10 | let clipped = mmap (mclip[L2] scaled) { x ⇒ x } in 11 | let filtered = mfilter zip[clipped, xs] { row ⇒ 12 | let ⟨clipped, orig⟩ = row#[ℕ[0], ℕ[0]] in 13 | clipped ≡ orig } in 14 | ℝ⁺[0.5] ⋅ real (rows filtered) 15 | in 16 | 17 | let pick = pλ m : ℕ, 18 | n : ℕ, 19 | ε : ℝ⁺, 20 | k : ℕ 21 | . 22 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 23 | ε : ℝ⁺[ε], 24 | bs : 𝕄 [L1, U|1, k⋅𝔻 ] 25 | ⇒ 26 | let target = 0.9 ⋅ real (rows xs) in 27 | let fs = mmap bs { b ⇒ query b } in 28 | AboveThreshold [ ε, fs, target ] { xs } 29 | in 30 | 31 | let scaleAndClip = sλ m : ℕ, 32 | n : ℕ 33 | . 34 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ], 35 | b: 𝔻 36 | ⇒ 37 | let scaled = mmap xs { x ⇒ b ⋅ x } in 38 | let clipped = mclip[L2] scaled in 39 | clipped 40 | in 41 | 42 | let main = pλ m : ℕ, 43 | n : ℕ, 44 | ε : ℝ⁺, 45 | k : ℕ, 46 | δ : ℝ⁺, 47 | δ′ : ℝ⁺, 48 | k : ℕ 49 | . 50 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 51 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 52 | ε : ℝ⁺[ε], 53 | k : ℕ[k], 54 | δ : ℝ⁺[δ], 55 | δ′ : ℝ⁺[δ′], 56 | η : ℝ, 57 | bs : 𝕄 [L1, U|1, k⋅𝔻 ] 58 | ⇒ 59 | let m₀ = mcreate[ L∞ | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 60 | b ← pick@[m, n, ε, k. xs, ε, bs]; 61 | let c = box (scaleAndClip@[m,n] xs (bs#[idx ℕ[0], b])) in 62 | aloop[ δ′ ] k on m₀ { a, θ ⇒ 63 | let s = ℝ⁺[1.0] / real (rows xs) in 64 | g ← mgauss[ s , ε , δ ] { ∇[ LR | θ ; unbox c , ys ] } ; 65 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 66 | } 67 | 68 | in main 69 | -------------------------------------------------------------------------------- /examples/complete/adaptive-clip.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/adaptive-clip.ed.duet 3 | ================================================================================ 4 | READING 5 | (3.06e-4s) 6 | TOKENIZING 7 | (6.388087s) 8 | PARSING 9 | (0.792566s) 10 | TYPE CHECKING 11 | (1.028e-3s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ m:ℕ , n:ℕ , ε:ℝ⁺ , k:ℕ , δ:ℝ⁺ , δ′:ℝ⁺ , k:ℕ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@⟨ε+2ε√(2k㏒1/δ′),kδ+δ′⟩ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@⟨2ε√(2k㏒1/δ′),kδ+δ′⟩ 18 | , ℝ⁺[ε]@⊤ 19 | , ℕ[k]@⊤ 20 | , ℝ⁺[δ]@⊤ 21 | , ℝ⁺[δ′]@⊤ 22 | , ℝ@⊤ 23 | , 𝕄 [L1,U|1,(k ⋅ 𝔻 )]@⊤ 24 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 25 | ⟩ 26 | -------------------------------------------------------------------------------- /examples/complete/baby-map-p.ed.duet: -------------------------------------------------------------------------------- 1 | (pλ c : ℝ⁺ . c : ℝ⁺[ c ] ⇒ 2 | return (pλ m : ℕ , n : ℕ . xs : 𝕄 [L∞,U | m , n⋅ℝ] ⇒ 3 | return mmap xs { x ⇒ c ⋅ x })) 4 | -------------------------------------------------------------------------------- /examples/complete/baby-map-p.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/baby-map-p.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.75e-4s) 6 | TOKENIZING 7 | (0.666765s) 8 | PARSING 9 | (4.9528e-2s) 10 | TYPE CHECKING 11 | (1.79e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ c:ℝ⁺ . ℝ⁺[c]@⊤ ⇒ ∀ m:ℕ , n:ℕ . 𝕄 [L∞,U|m,(n ⋅ ℝ)]@⊤ ⇒ 𝕄 [L∞,U|m,(n ⋅ ℝ)] 16 | ⟩ 17 | -------------------------------------------------------------------------------- /examples/complete/baby-map-s.ed.duet: -------------------------------------------------------------------------------- 1 | 2 | sλ c : ℝ⁺ . c : ℝ⁺[ c ] ⇒ 3 | sλ m : ℕ , n : ℕ . xs : 𝕄 [L∞,U | m , n⋅ℝ] ⇒ 4 | mmap xs { x ⇒ c ⋅ x } 5 | -------------------------------------------------------------------------------- /examples/complete/baby-map-s.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/baby-map-s.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.67e-4s) 6 | TOKENIZING 7 | (0.484968s) 8 | PARSING 9 | (2.8085e-2s) 10 | TYPE CHECKING 11 | (1.41e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ c:ℝ⁺ . ℝ⁺[c] ⊸[mn] ∀ m:ℕ , n:ℕ . 𝕄 [L∞,U|m,(n ⋅ ℝ)] ⊸[c] 𝕄 [L∞,U|m,(n ⋅ ℝ)] 16 | ⟩ 17 | -------------------------------------------------------------------------------- /examples/complete/baby-papp.ed.duet: -------------------------------------------------------------------------------- 1 | let f = 2 | pλ m : ℕ . m : ℕ[ m ] ⇒ 3 | return pλ n : ℕ . n : ℕ[ n ] ⇒ 4 | return (m + n) 5 | in pλ . x : ℕ ⇒ 6 | f' ← f@[1.ℕ[1]] ; 7 | f'@[2.ℕ[2]] 8 | -------------------------------------------------------------------------------- /examples/complete/baby-papp.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/baby-papp.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.77e-4s) 6 | TOKENIZING 7 | (0.482565s) 8 | PARSING 9 | (7.617e-2s) 10 | TYPE CHECKING 11 | (2.82e-4s) 12 | DONE 13 | Inr ⟨{},∀ . ℕ@⊥ ⇒ ℕ[3]⟩ 14 | -------------------------------------------------------------------------------- /examples/complete/baby-sapp.ed.duet: -------------------------------------------------------------------------------- 1 | let f = 2 | sλ m : ℕ . m : ℕ[ m ] ⇒ 3 | sλ n : ℕ . n : ℕ[ n ] ⇒ 4 | m + n 5 | in (f@[1] ℕ[ 1 ])@[2] ℕ[ 2 ] 6 | -------------------------------------------------------------------------------- /examples/complete/baby-sapp.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/baby-sapp.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.72e-4s) 6 | TOKENIZING 7 | (0.364555s) 8 | PARSING 9 | (2.9797e-2s) 10 | TYPE CHECKING 11 | (2.23e-4s) 12 | DONE 13 | Inr ⟨{},ℕ[3]⟩ 14 | -------------------------------------------------------------------------------- /examples/complete/baby.ed.duet: -------------------------------------------------------------------------------- 1 | let main = pλ ε : ℝ⁺, 2 | δ : ℝ⁺ 3 | . 4 | ε : ℝ⁺[ε], 5 | δ : ℝ⁺[δ], 6 | df : 𝕄 [L∞ , U | ★ , 𝐝 ℕ ∷ 𝐝 ℝ ∷ [] ] 7 | ⇒ 8 | result ← gauss[ℝ⁺[1.0], ε, δ] { real (rows df) }; 9 | return result 10 | in main 11 | 12 | -- Γ ⊢ e : 𝐝 τ , Σ 13 | -- ------------------ 14 | -- Γ ⊢ clip e : τ , Σ 15 | 16 | -- Γ ⊢ e : 𝐝 τ , Σ 17 | -- ------------------- 18 | -- Γ ⊢ conv e : τ , ⌉Σ⌈⸢∞⸣ 19 | 20 | -- Γ ⊢ e : τ , Σ 21 | -- ------------------- 22 | -- Γ ⊢ disc e : 𝐝 τ , ⌉Σ⌈¹ 23 | 24 | -- old clip becomes mclip 25 | -- old conv vecomes mconv 26 | -- 𝔻 becomes 𝐝 ℝ 27 | 28 | -- bad kinding example 29 | -- let main = pλ ε : ℝ⁺, 30 | -- δ : ℝ⁺ 31 | -- . 32 | -- ε : ℝ⁺[ε], 33 | -- δ : ℝ⁺[blah], 34 | -- df : 𝕄 [L∞ , U | ★ , ℕ ∷ ℝ ∷ [] ] 35 | -- ⇒ 36 | -- let f = sλ x : ℝ⁺[blahblah] ⇒ x 37 | -- in 38 | -- result ← gauss[ℝ⁺[1.0], ε, δ] { real (rows df) }; 39 | -- return result 40 | -- in 41 | -- main 42 | -------------------------------------------------------------------------------- /examples/complete/baby.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/baby.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.69e-4s) 6 | TOKENIZING 7 | (0.806207s) 8 | PARSING 9 | (6.1947e-2s) 10 | TYPE CHECKING 11 | (1.8e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ ε:ℝ⁺ , δ:ℝ⁺ . ℝ⁺[ε]@⊤ , ℝ⁺[δ]@⊤ , 𝕄 [L∞,U|★,((𝐝 ℕ) ∷ 𝔻 ∷ [])]@⟨ε,δ⟩ ⇒ ℝ 16 | ⟩ 17 | -------------------------------------------------------------------------------- /examples/complete/basic-boxing.ed.duet: -------------------------------------------------------------------------------- 1 | let main = pλ . x : ℕ ⇒ 2 | let y = box (x + x) 3 | -- this should fail 4 | -- in return y 5 | -- this should work 6 | in return unbox (y) 7 | in main 8 | -------------------------------------------------------------------------------- /examples/complete/basic-boxing.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/basic-boxing.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.62e-4s) 6 | TOKENIZING 7 | (0.230332s) 8 | PARSING 9 | (4.5994e-2s) 10 | TYPE CHECKING 11 | (1.4e-4s) 12 | DONE 13 | Inr ⟨{},∀ . ℕ@⊤ ⇒ ℕ⟩ 14 | -------------------------------------------------------------------------------- /examples/complete/bolt-on.ed.duet: -------------------------------------------------------------------------------- 1 | -- gradient descent 2 | -- output perturbation 3 | -- a la Wu et al. 4 | -- per-iteration bound 5 | -- https://arxiv.org/abs/1606.04722 6 | 7 | let main = pλ m : ℕ, 8 | n : ℕ, 9 | ε : ℝ⁺, 10 | k : ℕ, 11 | δ : ℝ⁺, 12 | δ′ : ℝ⁺ 13 | . 14 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 15 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 16 | ε : ℝ⁺[ε], 17 | k : ℕ[k], 18 | δ : ℝ⁺[δ], 19 | δ′ : ℝ⁺[δ′], 20 | η : ℝ 21 | ⇒ 22 | let m₀ = mcreate[ L2 | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 23 | let c = box (mclip[L2] xs) in 24 | let s = (real k) / real (rows xs) in 25 | g ← mgauss[ s , ε , δ ] { 26 | loop k on m₀ { a, θ ⇒ 27 | let g = ∇[ LR | θ ; unbox c , ys ] in 28 | mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 29 | } }; 30 | return g 31 | 32 | in main 33 | -------------------------------------------------------------------------------- /examples/complete/bolt-on.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/bolt-on.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.65e-4s) 6 | TOKENIZING 7 | (2.178101s) 8 | PARSING 9 | (0.360323s) 10 | TYPE CHECKING 11 | (4.24e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ m:ℕ , n:ℕ , ε:ℝ⁺ , k:ℕ , δ:ℝ⁺ , δ′:ℝ⁺ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@⟨ε,δ⟩ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@⟨ε,δ⟩ 18 | , ℝ⁺[ε]@⊤ 19 | , ℕ[k]@⊤ 20 | , ℝ⁺[δ]@⊤ 21 | , ℝ⁺[δ′]@⊥ 22 | , ℝ@⊤ 23 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 24 | ⟩ 25 | -------------------------------------------------------------------------------- /examples/complete/bolt-on2.ed.duet: -------------------------------------------------------------------------------- 1 | -- gradient descent 2 | -- output perturbation 3 | -- a la Wu et al. 4 | -- per-iteration bound 5 | -- https://arxiv.org/abs/1606.04722 6 | 7 | let main = pλ m : ℕ, 8 | n : ℕ, 9 | ε : ℝ⁺, 10 | k : ℕ, 11 | δ : ℝ⁺, 12 | b : ℕ 13 | . 14 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 15 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 16 | ε : ℝ⁺[ε], 17 | k : ℕ[k], 18 | δ : ℝ⁺[δ], 19 | η : ℝ, 20 | b : ℕ[b] 21 | ⇒ 22 | let m₀ = mcreate[ L2 | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 23 | let c = box (mclip[L2] xs) in 24 | let s = real k / real b in 25 | g ← mgauss[ s , ε , δ ] { 26 | loop k on m₀ { a, θ ⇒ 27 | let batches = chunks[b, unbox c, ys] in 28 | mfold-row θ, batches { θ, p ⇒ 29 | let ⟨xs, ys⟩ = p#[ℕ[0],ℕ[0]] in 30 | let g = ∇[ LR | θ ; xs , ys ] in 31 | mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 32 | } 33 | } 34 | }; 35 | return g 36 | 37 | in main 38 | 39 | -- Γ₁ ⊢ b ⦂ ℕ[b] 40 | -- Γ₂ ⊢ e ⦂ 𝕄 [ℓ, c|m, n⋅𝔻 ] 41 | -- ------------------------------------- 42 | -- ⊢ chunks[b, e] ⦂ 𝕄 [L∞, U|⸤m/b⸥, 𝕄 [ℓ, c|b, n⋅𝔻 ] ] 43 | -------------------------------------------------------------------------------- /examples/complete/bolt-on2.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/bolt-on2.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.78e-4s) 6 | TOKENIZING 7 | (2.675727s) 8 | PARSING 9 | (0.451603s) 10 | TYPE CHECKING 11 | (4.66e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ m:ℕ , n:ℕ , ε:ℝ⁺ , k:ℕ , δ:ℝ⁺ , b:ℕ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@⟨ε,δ⟩ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@⟨ε,δ⟩ 18 | , ℝ⁺[ε]@⊤ 19 | , ℕ[k]@⊤ 20 | , ℝ⁺[δ]@⊤ 21 | , ℝ@⊤ 22 | , ℕ[b]@⊤ 23 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 24 | ⟩ 25 | -------------------------------------------------------------------------------- /examples/complete/boxing.ed.duet: -------------------------------------------------------------------------------- 1 | let main = pλ . x : ℕ, z : ℕ ⇒ 2 | let y = box (x + x + z + z + z) in 3 | r ← gauss[ℝ⁺[2.0],ℝ⁺[1.0],ℝ⁺[0.0001]] { real (unbox y) }; 4 | -- r ← gauss[ℝ⁺[1.0],ℝ⁺[1.0],ℝ⁺[0.0001]] { real (unbox y) }; -- fails to check, sensitivity claim too small 5 | -- r ← return (unbox y); -- works, gives infinite privacy cost 6 | return r 7 | in main 8 | 9 | -- Questions 10 | -- why do we need x in the list of variables for gauss above? we would prefer to just have y 11 | -- confirm: we don't need shrug in the typechecker 12 | -- TODO: do we need to change the λ rule? 13 | -------------------------------------------------------------------------------- /examples/complete/boxing.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/boxing.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.58e-4s) 6 | TOKENIZING 7 | (1.162587s) 8 | PARSING 9 | (0.148214s) 10 | TYPE CHECKING 11 | (1.89e-4s) 12 | DONE 13 | Inr ⟨{},∀ . ℕ@⟨1.0,1.0e-4⟩ , ℕ@⊤ ⇒ ℝ⟩ 14 | -------------------------------------------------------------------------------- /examples/complete/derived-map.ed.duet: -------------------------------------------------------------------------------- 1 | let derived-map = sλ . f : (∀ . ℝ ⊸[ 2.0 ] ℝ), 2 | X : 𝕄 [ L1 , U | 100 , 200 ⋅ ℝ ] 3 | ⇒ 4 | mcreate[ L1 | ℕ[100] , ℕ[200] ] { i , j ⇒ f (X #[i,j]) } 5 | in derived-map 6 | -------------------------------------------------------------------------------- /examples/complete/derived-map.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/derived-map.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.7e-4s) 6 | TOKENIZING 7 | (0.69773s) 8 | PARSING 9 | (7.1823e-2s) 10 | TYPE CHECKING 11 | (1.56e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ 16 | . 17 | (∀ . ℝ ⊸[2.0] ℝ) 18 | ⊸[20000] 19 | ∀ . 𝕄 [L1,U|100,(200 ⋅ ℝ)] ⊸[40000.0] 𝕄 [L1,U|100,(200 ⋅ ℝ)] 20 | ⟩ 21 | -------------------------------------------------------------------------------- /examples/complete/fw.ed.duet: -------------------------------------------------------------------------------- 1 | 2 | let main = pλ m : ℕ, 3 | n : ℕ, 4 | ε : ℝ⁺, 5 | δ : ℝ⁺, 6 | k : ℕ 7 | . 8 | -- xs : 𝕄 [L∞ L∞|m,n] 𝔻, 9 | -- ys : 𝕄 [L∞ U|m,1] 𝔻, 10 | xs : 𝕄 [L∞, L∞|m, n⋅𝔻 ] , 11 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 12 | ε : ℝ⁺[ε], 13 | δ : ℝ⁺[δ], 14 | k : ℕ[k] 15 | ⇒ 16 | let d = cols xs in 17 | let m₀ = mcreate[ L∞ | ℕ[1] , d ] { i , j ⇒ 0.0 } in 18 | let indexes = mcreate[ L∞ | ℕ[1] , ℕ[1]⋅d ] { i , j ⇒ 19 | ⟨ j % dyn d, sign (real (dyn j - dyn d)) ⟩ } in 20 | 21 | aloop[ δ ] k on m₀ { t , θ ⇒ 22 | let μ = 1.0 / ((real t)+2.0) in 23 | let s = ℝ⁺[1.0] / real (rows xs) in 24 | p ← exponential[s, ε] indexes { x ⇒ 25 | let ⟨c, s⟩ = x in let g = ∇[ LR | θ ; xs , ys ] in g#[idx ℕ[0], c] } ; 26 | let g₀ = mcreate[ L∞ | ℕ[1] , d ] { i , j ⇒ 0.0 } in 27 | let gₚ = (let ⟨i, s⟩ = indexes#[idx ℕ[0], p] in g₀#[idx ℕ[0],i ↦ s ⋅ real 100]) in 28 | 29 | let θ' = mmap θ { x ⇒ (1.0-μ) ⋅ x } in 30 | let gₚ' = mmap gₚ { x ⇒ μ ⋅ (100.0 ⋅ x) } in 31 | return mmap θ', gₚ' { x, y ⇒ x + y } 32 | } 33 | in main 34 | -------------------------------------------------------------------------------- /examples/complete/fw.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/fw.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.73e-4s) 6 | TOKENIZING 7 | (4.805188s) 8 | PARSING 9 | (1.040897s) 10 | TYPE CHECKING 11 | (5.93e-4s) 12 | DONE 13 | Inr 14 | ⟨ {sign↦⊤} 15 | , ∀ m:ℕ , n:ℕ , ε:ℝ⁺ , δ:ℝ⁺ , k:ℕ 16 | . 𝕄 [L∞,L∞|m,(n ⋅ 𝔻 )]@⟨2ε√(2k㏒1/δ),δ⟩ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@⟨2ε√(2k㏒1/δ),δ⟩ 18 | , ℝ⁺[ε]@⊤ 19 | , ℝ⁺[δ]@⊤ 20 | , ℕ[k]@⊤ 21 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 22 | ⟩ 23 | -------------------------------------------------------------------------------- /examples/complete/gd-pb-mini.ed.duet: -------------------------------------------------------------------------------- 1 | -- gradient descent 2 | -- per-iteration bound 3 | -- with minibatching 4 | let main = pλ m : ℕ, 5 | n : ℕ, 6 | ε : ℝ⁺, 7 | k : ℕ, 8 | δ : ℝ⁺, 9 | δ′ : ℝ⁺, 10 | b : ℕ 11 | . 12 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 13 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 14 | ε : ℝ⁺[ε], 15 | k : ℕ[k], 16 | δ : ℝ⁺[δ], 17 | δ′ : ℝ⁺[δ′], 18 | η : ℝ, 19 | b : ℕ[b] 20 | ⇒ 21 | let m₀ = mcreate[ L∞ | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 22 | -- let b = ℕ[50] in 23 | let c = box (mclip[L2] xs) in 24 | aloop[ δ′ ] k on m₀ { t , θ ⇒ 25 | g ← sample[ b ] (unbox c), ys {xs', ys' ⇒ 26 | let s = ℝ⁺[1.0] / real (rows xs') in 27 | mgauss[ s , ε , δ ] { ∇[ LR | θ ; xs' , ys' ] } }; 28 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 29 | } 30 | in main 31 | -------------------------------------------------------------------------------- /examples/complete/gd-pb-mini.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/gd-pb-mini.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.77e-4s) 6 | TOKENIZING 7 | (2.593704s) 8 | PARSING 9 | (0.314189s) 10 | TYPE CHECKING 11 | (5.35e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ m:ℕ , n:ℕ , ε:ℝ⁺ , k:ℕ , δ:ℝ⁺ , δ′:ℝ⁺ , b:ℕ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@⟨4bε1/m√(2k㏒1/δ′),bkδ1/m+δ′⟩ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@⟨4bε1/m√(2k㏒1/δ′),bkδ1/m+δ′⟩ 18 | , ℝ⁺[ε]@⊤ 19 | , ℕ[k]@⊤ 20 | , ℝ⁺[δ]@⊤ 21 | , ℝ⁺[δ′]@⊤ 22 | , ℝ@⊤ 23 | , ℕ[b]@⊥ 24 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 25 | ⟩ 26 | -------------------------------------------------------------------------------- /examples/complete/gd-pb-mini.tcdp.duet: -------------------------------------------------------------------------------- 1 | -- gradient descent 2 | -- per-iteration bound 3 | -- with minibatching 4 | let main = pλ m : ℕ, 5 | n : ℕ, 6 | ρ : ℝ⁺, 7 | ω : ℕ, 8 | k : ℕ, 9 | b : ℕ 10 | . 11 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 12 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 13 | ρ : ℝ⁺[ρ], 14 | ω : ℕ[ω], 15 | k : ℕ[k], 16 | η : ℝ, 17 | b : ℕ[b] 18 | ⇒ 19 | let m₀ = mcreate[ L∞ | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 20 | loop k on m₀ { t , θ ⇒ 21 | g ← sample[ b ] xs, ys {xs', ys' ⇒ 22 | let s = ℝ⁺[1.0] / real (rows xs') in 23 | mgauss[ s, ρ, ω ] { ∇[ LR | θ ; mclip[L2] xs' , ys' ] } }; 24 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 25 | } 26 | in main 27 | -------------------------------------------------------------------------------- /examples/complete/gd-pb-mini.tcdp.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/gd-pb-mini.tcdp.duet 3 | ================================================================================ 4 | READING 5 | (1.93e-4s) 6 | TOKENIZING 7 | (2.385233s) 8 | PARSING 9 | (0.278761s) 10 | TYPE CHECKING 11 | (5.04e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ m:ℕ , n:ℕ , ρ:ℝ⁺ , ω:ℕ , k:ℕ , b:ℕ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@⟨13.0b^2kρ1/m^2,1/(4.0ρ)㏒1/(b1/m)⟩ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@⟨13.0b^2kρ1/m^2,1/(4.0ρ)㏒1/(b1/m)⟩ 18 | , ℝ⁺[ρ]@⊤ 19 | , ℕ[ω]@⊤ 20 | , ℕ[k]@⊤ 21 | , ℝ@⊤ 22 | , ℕ[b]@⊥ 23 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 24 | ⟩ 25 | -------------------------------------------------------------------------------- /examples/complete/gd-pb-parallel.zcdp.duet: -------------------------------------------------------------------------------- 1 | -- gradient descent 2 | -- per-iteration bound 3 | -- minibatching via parallel composition 4 | let epoch = sλ n : ℕ, 5 | ρ : ℝ⁺, 6 | b : ℕ 7 | . 8 | b : ℕ[b], 9 | ρ : ℝ⁺[ρ], 10 | η : ℝ 11 | ⇒ 12 | pλ . 13 | xs : 𝕄 [L∞, L2|b, n⋅𝔻 ], 14 | ys : 𝕄 [L∞, U|b, 1⋅𝔻 ], 15 | θ : 𝕄 [L∞, U|1, n⋅ℝ ] 16 | ⇒ 17 | let s = ℝ⁺[1.0] / real b in 18 | g ← mgauss[ s , ρ ] { 19 | ∇[ LR | θ ; xs , ys ] 20 | } ; 21 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 22 | in 23 | 24 | let main = pλ m : ℕ, 25 | n : ℕ, 26 | ρ : ℝ⁺, 27 | k : ℕ, 28 | b : ℕ 29 | . 30 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 31 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 32 | ρ : ℝ⁺[ρ], 33 | η : ℝ, 34 | k : ℕ[k], 35 | b : ℕ[b] 36 | ⇒ 37 | let m₀ = mcreate[ L2 | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 38 | loop k on m₀ { a, θ ⇒ 39 | pfld-rows [b, θ, mclip[L2] xs, ys, epoch@[n, ρ, b] b ρ η] 40 | } 41 | in main 42 | 43 | -------------------------------------------------------------------------------- /examples/complete/gd-pb-parallel.zcdp.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/gd-pb-parallel.zcdp.duet 3 | ================================================================================ 4 | READING 5 | (1.82e-4s) 6 | TOKENIZING 7 | (2.547165s) 8 | PARSING 9 | (0.345932s) 10 | TYPE CHECKING 11 | (5.91e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ m:ℕ , n:ℕ , ρ:ℝ⁺ , k:ℕ , b:ℕ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@kρ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@kρ 18 | , ℝ⁺[ρ]@⊤ 19 | , ℝ@⊤ 20 | , ℕ[k]@⊤ 21 | , ℕ[b]@⊤ 22 | ⇒ 𝕄 [L2,U|1,(n ⋅ ℝ)] 23 | ⟩ 24 | -------------------------------------------------------------------------------- /examples/complete/gd-pb-renyi.ed.duet: -------------------------------------------------------------------------------- 1 | -- gradient descent 2 | let main = pλ m : ℕ, 3 | n : ℕ, 4 | ε : ℝ⁺, 5 | α : ℝ⁺, 6 | k : ℕ, 7 | δ : ℝ⁺ 8 | . 9 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 10 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 11 | α : ℝ⁺[α], 12 | ε : ℝ⁺[ε], 13 | k : ℕ[k], 14 | δ : ℝ⁺[δ], 15 | η : ℝ 16 | ⇒ 17 | let m₀ = mcreate[ L∞ | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 18 | RENYI[ δ ] { 19 | loop k on m₀ { a, θ ⇒ 20 | let s = ℝ⁺[1.0] / real (rows xs) in 21 | g ← mgauss[ s , α, ε ] { ∇[ LR | θ ; mclip[L2] xs, ys ] } ; 22 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 23 | } 24 | } 25 | in main 26 | -------------------------------------------------------------------------------- /examples/complete/gd-pb-renyi.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/gd-pb-renyi.ed.duet 3 | ================================================================================ 4 | READING 5 | (2.45e-4s) 6 | TOKENIZING 7 | (2.434355s) 8 | PARSING 9 | (0.374885s) 10 | TYPE CHECKING 11 | (4.38e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ m:ℕ , n:ℕ , ε:ℝ⁺ , α:ℝ⁺ , k:ℕ , δ:ℝ⁺ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@⟨kε+1/(α-1)㏒1/δ,δ⟩ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@⟨kε+1/(α-1)㏒1/δ,δ⟩ 18 | , ℝ⁺[α]@⊤ 19 | , ℝ⁺[ε]@⊤ 20 | , ℕ[k]@⊤ 21 | , ℝ⁺[δ]@⊤ 22 | , ℝ@⊤ 23 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 24 | ⟩ 25 | -------------------------------------------------------------------------------- /examples/complete/gd-pb-zcdp.ed.duet: -------------------------------------------------------------------------------- 1 | -- gradient descent 2 | -- per-iteration bound 3 | let main = pλ m : ℕ, 4 | n : ℕ, 5 | ρ : ℝ⁺, 6 | k : ℕ, 7 | δ : ℝ⁺ 8 | . 9 | xs : 𝕄 [L∞,U|m,n⋅𝔻] , 10 | ys : 𝕄 [L∞,U|m,1⋅𝔻] , 11 | ρ : ℝ⁺[ρ], 12 | k : ℕ[k], 13 | δ : ℝ⁺[δ], 14 | η : ℝ 15 | ⇒ 16 | let m₀ = mcreate[ L∞ | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 17 | ZCDP[ δ ] { 18 | loop k on m₀ { a, θ ⇒ 19 | let s = ℝ⁺[1.0] / real (rows xs) in 20 | g ← mgauss[ s , ρ ] { ∇[ LR | θ ; mclip[L2] xs, ys ] } ; 21 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 22 | } 23 | } 24 | in main 25 | -------------------------------------------------------------------------------- /examples/complete/gd-pb-zcdp.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/gd-pb-zcdp.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.91e-4s) 6 | TOKENIZING 7 | (2.340762s) 8 | PARSING 9 | (0.25199s) 10 | TYPE CHECKING 11 | (4.07e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ m:ℕ , n:ℕ , ρ:ℝ⁺ , k:ℕ , δ:ℝ⁺ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@⟨kρ+2√(kρ㏒1/δ),δ⟩ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@⟨kρ+2√(kρ㏒1/δ),δ⟩ 18 | , ℝ⁺[ρ]@⊤ 19 | , ℕ[k]@⊤ 20 | , ℝ⁺[δ]@⊤ 21 | , ℝ@⊤ 22 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 23 | ⟩ 24 | -------------------------------------------------------------------------------- /examples/complete/gd-pb.ed.duet: -------------------------------------------------------------------------------- 1 | -- the command line interface we want 2 | -- 3 | -- `duet run "data.csv" "labels.csv" 0.05 100 0.0001 0.0001 1` 4 | -- 5 | -- gradient descent 6 | -- per-iteration bound 7 | let main = pλ m : ℕ, 8 | n : ℕ, 9 | ε : ℝ⁺, 10 | k : ℕ, 11 | δ : ℝ⁺, 12 | δ′ : ℝ⁺ 13 | . 14 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 15 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 16 | ε : ℝ⁺[ε], 17 | k : ℕ[k], 18 | δ : ℝ⁺[δ], 19 | δ′ : ℝ⁺[δ′], 20 | η : ℝ 21 | ⇒ 22 | let m₀ = mcreate[ L∞ | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 23 | let c = box (mclip[L2] xs) in 24 | aloop[ δ′ ] k on m₀ { a, θ ⇒ 25 | let s = ℝ⁺[1.0] / real (rows xs) in 26 | g ← mgauss[ s , ε , δ ] { ∇[ LR | θ ; unbox c , ys ] } ; 27 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 28 | } 29 | -- in main 30 | in main 31 | -- in return (pλ . 32 | -- xs : 𝕄 [L∞, U|1000, 10⋅𝔻 ] , 33 | -- ys : 𝕄 [L∞, U|1000, 10⋅𝔻 ] , 34 | -- ε : ℝ⁺[0.001], 35 | -- k : ℕ[100], 36 | -- δ : ℝ⁺[0.0001], 37 | -- δ′ : ℝ⁺[0.0001], 38 | -- η : ℝ ⇒ 39 | -- main@[ 1000 , 10 , 0.001 , 100 , 0.0001 , 0.0001 ](xs, ys, ε, k, δ, δ′, η)) 40 | 41 | -- fold [1, 2, 3, ... k] m₀ (λ i, a → ) 42 | -------------------------------------------------------------------------------- /examples/complete/gd-pb.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/gd-pb.ed.duet 3 | ================================================================================ 4 | READING 5 | (2.82e-4s) 6 | TOKENIZING 7 | (2.666085s) 8 | PARSING 9 | (0.343344s) 10 | TYPE CHECKING 11 | (5.08e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ m:ℕ , n:ℕ , ε:ℝ⁺ , k:ℕ , δ:ℝ⁺ , δ′:ℝ⁺ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@⟨2ε√(2k㏒1/δ′),kδ+δ′⟩ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@⟨2ε√(2k㏒1/δ′),kδ+δ′⟩ 18 | , ℝ⁺[ε]@⊤ 19 | , ℕ[k]@⊤ 20 | , ℝ⁺[δ]@⊤ 21 | , ℝ⁺[δ′]@⊤ 22 | , ℝ@⊤ 23 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 24 | ⟩ 25 | -------------------------------------------------------------------------------- /examples/complete/gd-pb.renyi.duet: -------------------------------------------------------------------------------- 1 | -- gradient descent 2 | let main = pλ m : ℕ, 3 | n : ℕ, 4 | ε : ℝ⁺, 5 | α : ℝ⁺, 6 | k : ℕ 7 | . 8 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 9 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 10 | α : ℝ⁺[α], 11 | ε : ℝ⁺[ε], 12 | k : ℕ[k], 13 | η : ℝ 14 | ⇒ 15 | -- let k = ℕ[1000] in 16 | -- let δ = ℝ⁺[0.000001] in 17 | -- let δ′ = ℝ⁺[0.000001] in 18 | -- let η = ℝ⁺[0.1] in 19 | let m₀ = mcreate[ L∞ | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 20 | loop k on m₀ { a, θ ⇒ 21 | let s = ℝ⁺[1.0] / real (rows xs) in 22 | g ← mgauss[ s , α, ε ] { ∇[ LR | θ ; mclip[L2] xs, ys ] } ; 23 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 24 | } 25 | in main 26 | -------------------------------------------------------------------------------- /examples/complete/gd-pb.renyi.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/gd-pb.renyi.duet 3 | ================================================================================ 4 | READING 5 | (1.82e-4s) 6 | TOKENIZING 7 | (2.205664s) 8 | PARSING 9 | (0.286682s) 10 | TYPE CHECKING 11 | (4.18e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ m:ℕ , n:ℕ , ε:ℝ⁺ , α:ℝ⁺ , k:ℕ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@⟨α,kε⟩ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@⟨α,kε⟩ 18 | , ℝ⁺[α]@⊤ 19 | , ℝ⁺[ε]@⊤ 20 | , ℕ[k]@⊤ 21 | , ℝ@⊤ 22 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 23 | ⟩ 24 | -------------------------------------------------------------------------------- /examples/complete/gd-pb.zcdp.duet: -------------------------------------------------------------------------------- 1 | -- gradient descent 2 | -- per-iteration bound 3 | let main = pλ m : ℕ, 4 | n : ℕ, 5 | ρ : ℝ⁺, 6 | k : ℕ 7 | . 8 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 9 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 10 | ρ : ℝ⁺[ρ], 11 | k : ℕ[k], 12 | η : ℝ 13 | ⇒ 14 | let m₀ = mcreate[ L∞ | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 15 | loop k on m₀ { a, θ ⇒ 16 | let s = ℝ⁺[1.0] / real (rows xs) in 17 | g ← mgauss[ s , ρ ] { ∇[ LR | θ ; mclip[L2] xs, ys ] } ; 18 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 19 | } 20 | in main 21 | -------------------------------------------------------------------------------- /examples/complete/gd-pb.zcdp.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/gd-pb.zcdp.duet 3 | ================================================================================ 4 | READING 5 | (1.73e-4s) 6 | TOKENIZING 7 | (2.185755s) 8 | PARSING 9 | (0.309916s) 10 | TYPE CHECKING 11 | (5.28e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ m:ℕ , n:ℕ , ρ:ℝ⁺ , k:ℕ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@kρ , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@kρ , ℝ⁺[ρ]@⊤ , ℕ[k]@⊤ , ℝ@⊤ 17 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 18 | ⟩ 19 | -------------------------------------------------------------------------------- /examples/complete/gd-tb.ed.duet: -------------------------------------------------------------------------------- 1 | -- gradient descent 2 | -- total bound 3 | let main = pλ m : ℕ, 4 | n : ℕ, 5 | ε : ℝ⁺, 6 | k : ℕ, 7 | δ : ℝ⁺, 8 | η : ℝ⁺ 9 | . 10 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 11 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 12 | ε : ℝ⁺[ε], 13 | k : ℕ[k], 14 | δ : ℝ⁺[δ], 15 | η : ℝ⁺[η] 16 | ⇒ 17 | let εᵢ = ε / (ℝ⁺[2.0] ⋅ √ (ℝ⁺[2.0] ⋅ real k ⋅ (㏒ (ℝ⁺[2.0]/δ)))) in 18 | let δᵢ = δ / (ℝ⁺[2.0] ⋅ real k) in 19 | let m₀ = mcreate[ L∞ | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 20 | aloop[ δ / ℝ⁺[2.0] ] k on m₀ { a, θ ⇒ 21 | let s = ℝ⁺[1.0] / real (rows xs) in 22 | g ← mgauss[ s , εᵢ , δᵢ ] { ∇[ LR | θ ; mclip[L2] xs, ys ] } ; 23 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 24 | } 25 | in main 26 | -------------------------------------------------------------------------------- /examples/complete/gd-tb.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/gd-tb.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.94e-4s) 6 | TOKENIZING 7 | (3.339202s) 8 | PARSING 9 | (0.557673s) 10 | TYPE CHECKING 11 | (3.732e-3s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ m:ℕ , n:ℕ , ε:ℝ⁺ , k:ℕ , δ:ℝ⁺ , η:ℝ⁺ 16 | . 17 | 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@⟨ 2ε1/(2.0√(2.0k㏒(2.01/δ)))√(2k㏒1/(0.5δ)) 18 | , 0.5δ+kδ1/(2.0k) 19 | ⟩ 20 | , 21 | 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@⟨ 2ε1/(2.0√(2.0k㏒(2.01/δ)))√(2k㏒1/(0.5δ)) 22 | , 0.5δ+kδ1/(2.0k) 23 | ⟩ 24 | , ℝ⁺[ε]@⊤ 25 | , ℕ[k]@⊤ 26 | , ℝ⁺[δ]@⊤ 27 | , ℝ⁺[η]@⊤ 28 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 29 | ⟩ 30 | -------------------------------------------------------------------------------- /examples/complete/gd-unbounded-pb.ed.duet: -------------------------------------------------------------------------------- 1 | -- gradient descent 2 | -- unbounded gradient 3 | -- per-iteration bound 4 | let main = pλ m : ℕ, 5 | n : ℕ, 6 | ε : ℝ⁺, 7 | k : ℕ, 8 | δ : ℝ⁺, 9 | δ′ : ℝ⁺ 10 | . 11 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 12 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 13 | ε : ℝ⁺[ε], 14 | k : ℕ[k], 15 | δ : ℝ⁺[δ], 16 | δ′ : ℝ⁺[δ′], 17 | η : ℝ 18 | ⇒ 19 | let m₀ = mcreate[ L∞ | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 20 | aloop[ δ′ ] k on m₀ { a, θ ⇒ 21 | let s = ℝ⁺[1.0] / real (rows xs) in 22 | g ← mgauss[ s , ε , δ ] { mconv (mclip[L2] U∇[ LR | θ ; xs , ys ]) } ; 23 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 24 | } 25 | in main 26 | -------------------------------------------------------------------------------- /examples/complete/gd-unbounded-pb.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/gd-unbounded-pb.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.74e-4s) 6 | TOKENIZING 7 | (2.397035s) 8 | PARSING 9 | (0.367707s) 10 | TYPE CHECKING 11 | (4.53e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ m:ℕ , n:ℕ , ε:ℝ⁺ , k:ℕ , δ:ℝ⁺ , δ′:ℝ⁺ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@⟨2ε√(2k㏒1/δ′),kδ+δ′⟩ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@⟨2ε√(2k㏒1/δ′),kδ+δ′⟩ 18 | , ℝ⁺[ε]@⊤ 19 | , ℕ[k]@⊤ 20 | , ℝ⁺[δ]@⊤ 21 | , ℝ⁺[δ′]@⊤ 22 | , ℝ@⊤ 23 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 24 | ⟩ 25 | -------------------------------------------------------------------------------- /examples/complete/hyperparam.ed.duet: -------------------------------------------------------------------------------- 1 | -- hyperparameter tuning 2 | let mscale = sλ m : ℕ, 3 | n : ℕ 4 | . 5 | s : ℝ, 6 | mat : 𝕄 [L∞, U|1, n⋅ℝ ] 7 | ⇒ 8 | mmap mat { x ⇒ s ⋅ x } 9 | in 10 | 11 | let msub = sλ m : ℕ, 12 | n : ℕ 13 | . 14 | m1 : 𝕄 [L∞, U|1, n⋅ℝ ], 15 | m2 : 𝕄 [L∞, U|1, n⋅ℝ ] 16 | ⇒ 17 | mmap m1, m2 { x , y ⇒ x - y } 18 | in 19 | 20 | let mzeros = sλ m : ℕ, 21 | n : ℕ 22 | . 23 | nr : ℕ[m], 24 | nc : ℕ[n] 25 | ⇒ 26 | mcreate[ L∞ | nr , nc ] { i , j ⇒ 0.0 } 27 | in 28 | 29 | let predictOne = sλ n : ℕ . 30 | θ : 𝕄 [L∞, U|1, n⋅ℝ] 31 | ⇒ 32 | sλ . 33 | x : 𝕄 [L∞, U|1, n⋅𝔻] 34 | ⇒ 35 | let prediction = (mmap x { e ⇒ conv e }) × (tr θ) in 36 | sign (prediction#[idx ℕ[0], idx ℕ[0]]) 37 | in 38 | 39 | let predict = sλ m : ℕ, n : ℕ . 40 | xs : 𝕄 [L∞, U|m, n⋅𝔻], 41 | θ : 𝕄 [L∞, U|1, n⋅ℝ] 42 | ⇒ 43 | -- 44 | let po = discf (predictOne@[n] θ) in 45 | mmap-row xs { row ⇒ po row } 46 | in 47 | 48 | let correct = sλ m : ℕ, n : ℕ . 49 | xs : 𝕄 [L∞, U|m, n⋅𝔻], 50 | ys : 𝕄 [L∞, U|m, 1⋅𝔻], 51 | θ : 𝕄 [L∞, U|1, n⋅ℝ] 52 | ⇒ 53 | count (mmap ys, (predict@[m, n] xs θ) { y₁, y₂ ⇒ y₁ ≡ y₂ }) 54 | in 55 | 56 | let noisy_sgd = pλ m : ℕ, 57 | n : ℕ, 58 | o : ℕ, 59 | k : ℕ, 60 | ε : ℝ⁺, 61 | δ : ℝ⁺ 62 | . 63 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 64 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 65 | k : ℕ[k], 66 | ε : ℝ⁺[ε], 67 | δ : ℝ⁺[δ], 68 | η : ℝ 69 | ⇒ 70 | let m₀ = mzeros@[1, n] ℕ[1] (cols xs) in 71 | let c = box (mclip[L2] xs) in 72 | aloop[ δ ] k on m₀ { a, θ ⇒ 73 | let s = ℝ⁺[1.0] / real (rows xs) in 74 | g ← mgauss[ s , ε , δ ] { ∇[ LR | θ ; unbox c , ys ] } ; 75 | return msub@[m, n] θ (mscale@[m, n] η g) 76 | } 77 | in 78 | 79 | let pick_η = pλ m : ℕ, 80 | n : ℕ, 81 | o : ℕ, 82 | k : ℕ, 83 | ε : ℝ⁺, 84 | δ : ℝ⁺ 85 | . 86 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 87 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 88 | k : ℕ[k], 89 | ε : ℝ⁺[ε], 90 | δ : ℝ⁺[δ], 91 | ηs : 𝕄 [L∞, U|1, o⋅ℝ ] 92 | ⇒ 93 | -- let m₀ = mcreate [1, o] in 94 | -- loop { a, m ⇒ 95 | -- m#[1, a ↦ noisy_sgd@[η, xs]] 96 | -- } 97 | θs ← mmapp ηs { η ⇒ noisy_sgd@[m, n, o, k, ε, δ. xs, ys, k, ε, δ, η] }; 98 | η ← exponential[ℝ⁺[1.0], ε] θs { θ ⇒ 99 | correct@[m, n] xs ys θ 100 | }; 101 | return ηs#[idx ℕ[0], η] 102 | 103 | in 104 | 105 | 106 | let main = pλ m : ℕ, 107 | n : ℕ, 108 | o : ℕ, 109 | k : ℕ, 110 | ε : ℝ⁺, 111 | δ : ℝ⁺ 112 | . 113 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 114 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 115 | k : ℕ[k], 116 | ε : ℝ⁺[ε], 117 | δ : ℝ⁺[δ], 118 | ηs : 𝕄 [L∞, U|1, o⋅ℝ ] 119 | ⇒ 120 | -- η ← pick_η@[m, n, o, k, ε/o, δ/o. xs, ys, k, ε/(real (cols ηs)), δ/(real (cols ηs)), ηs]; 121 | η ← pick_η@[m, n, o, k, ε, δ. xs, ys, k, ε, δ, ηs]; 122 | θ ← noisy_sgd@[m, n, o, k, ε, δ. xs, ys, k, ε, δ, η]; 123 | return θ 124 | 125 | in main 126 | -------------------------------------------------------------------------------- /examples/complete/hyperparam.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/hyperparam.ed.duet 3 | ================================================================================ 4 | READING 5 | (2.2e-4s) 6 | TOKENIZING 7 | (10.062842s) 8 | PARSING 9 | (1.013821s) 10 | TYPE CHECKING 11 | (6.86e-3s) 12 | DONE 13 | Inr 14 | ⟨ {sign↦⊤,η↦⊤} 15 | , ∀ m:ℕ , n:ℕ , o:ℕ , k:ℕ , ε:ℝ⁺ , δ:ℝ⁺ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@⟨2oε√(2k㏒1/δ)+ε+2ε√(2k㏒1/δ),koδ+kδ+oδ+δ⟩ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@⟨2oε√(2k㏒1/δ)+ε+2ε√(2k㏒1/δ),koδ+kδ+oδ+δ⟩ 18 | , ℕ[k]@⊤ 19 | , ℝ⁺[ε]@⊤ 20 | , ℝ⁺[δ]@⊤ 21 | , 𝕄 [L∞,U|1,(o ⋅ ℝ)]@⊤ 22 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 23 | ⟩ 24 | -------------------------------------------------------------------------------- /examples/complete/normalize.ed.duet: -------------------------------------------------------------------------------- 1 | 2 | -- evaluate a clipping parameter: return how many 3 | -- rows would be clipped by using that parameter 4 | let evalClippingParam = 5 | sλ . 6 | b: 𝔻 7 | ⇒ 8 | sλ m : ℕ 9 | . 10 | xs : 𝕄 [L∞, U|m, 1⋅𝔻 ] 11 | ⇒ 12 | let scaled = mmap xs { x ⇒ b ⋅ x } in 13 | let clipped = mmap (mclip[L2] scaled) { x ⇒ x } in 14 | let filtered = mfilter zip[clipped, xs] { row ⇒ 15 | let ⟨clipped, orig⟩ = row#[ℕ[0], ℕ[0]] in 16 | clipped ≡ orig } in 17 | ℝ⁺[0.5] ⋅ real (rows filtered) 18 | in 19 | 20 | -- determine the scale of a matrix (i.e. best clipping parameter) 21 | let selectClippingParam = 22 | pλ m : ℕ, 23 | ε : ℝ⁺, 24 | k : ℕ 25 | . 26 | xs : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 27 | ε : ℝ⁺[ε], 28 | bs : 𝕄 [L∞, U|1, k⋅𝔻 ] 29 | ⇒ 30 | let target = 0.9 ⋅ real (rows xs) in 31 | let fs = mmap bs { b ⇒ evalClippingParam b } in 32 | bIdx ← AboveThreshold [ ε, fs, target ] { xs }; 33 | return bs#[idx ℕ[0], bIdx] 34 | in 35 | 36 | -- determine the mean of a single column matrix 37 | let colMean = pλ m : ℕ, 38 | k : ℕ, 39 | ε : ℝ⁺, 40 | δ : ℝ⁺ 41 | . 42 | mat : 𝕄 [L∞, U|m, 1⋅𝔻 ], 43 | ε : ℝ⁺[ε], 44 | δ : ℝ⁺[δ], 45 | bs : 𝕄 [L∞, U|1, k⋅𝔻 ] 46 | ⇒ 47 | b ← selectClippingParam@[m, ε, k. mat, ε, bs]; 48 | mean ← gauss [ℝ⁺[1.0] / (real (rows mat)), ε, δ] { 49 | let scaled = mmap mat { x ⇒ b ⋅ x } in 50 | let clipped = mconv (mclip[L1] scaled) in 51 | let sum = mfold-row 0.0, clipped { a, r ⇒ 52 | a + r#[idx ℕ[0], idx ℕ[0]] } in 53 | sum / (real (rows mat)) 54 | }; 55 | return (disc mean) 56 | in 57 | 58 | -- determine the mean of each column in the given matrix 59 | let colMeans = pλ m : ℕ, n : ℕ, k : ℕ, ε : ℝ⁺, δ : ℝ⁺ 60 | . 61 | mat : 𝕄 [L∞, U|m, n⋅𝔻 ], 62 | ε : ℝ⁺[ε], 63 | δ : ℝ⁺[δ], 64 | bs : 𝕄 [L∞, U|1, k⋅𝔻 ] 65 | ⇒ 66 | pmap-col mat { col ⇒ colMean@[m, k, ε, δ. col, ε, δ, bs] } 67 | in 68 | 69 | 70 | let center = 71 | sλ m : ℕ, n : ℕ 72 | . 73 | mat : 𝕄 [L∞, U|m, n⋅𝔻 ], 74 | means : 𝕄 [L∞, U|1, n⋅𝔻 ] 75 | ⇒ 76 | -- center the values using the column mean 77 | mmap-col mat, means { col, mean ⇒ 78 | mmap col { x ⇒ 79 | x - mean#[idx ℕ[0], idx ℕ[0]] 80 | } 81 | } 82 | in 83 | 84 | -- determine the scale of each column in the given matrix 85 | let colScaleParams = 86 | pλ m : ℕ, n : ℕ, ε : ℝ⁺, δ : ℝ⁺, k : ℕ 87 | . 88 | mat : 𝕄 [L∞, U|m, n⋅𝔻 ], 89 | ε : ℝ⁺[ε], 90 | δ : ℝ⁺[δ], 91 | bs : 𝕄 [L∞, U|1, k⋅𝔻 ], 92 | means : 𝕄 [L∞, U|1, n⋅𝔻 ] 93 | ⇒ 94 | pmap-col (center@[m,n] mat means) { col ⇒ selectClippingParam@[m, ε, k. col, ε, bs] } 95 | -- return center@[m,n] mat means 96 | in 97 | 98 | -- given a mean and scale for each column, prepare 99 | -- the given matrix for clipping 100 | let normalize = 101 | sλ m : ℕ, n : ℕ 102 | . 103 | means : 𝕄 [L∞, U|1, n⋅𝔻 ], 104 | scales : 𝕄 [L∞, U|1, n⋅𝔻 ], 105 | mat : 𝕄 [L∞, U|m, n⋅𝔻 ] 106 | ⇒ 107 | -- center the values using the column mean 108 | let centered = center@[m,n] mat means in 109 | 110 | -- scale the values using the clipping parameters 111 | mmap-col centered, scales { col, scale ⇒ 112 | mmap col { x ⇒ 113 | x / (scale#[idx ℕ[0], idx ℕ[0]]) 114 | } 115 | } 116 | in 117 | 118 | let noisySGD = 119 | pλ m : ℕ, n : ℕ, ε : ℝ⁺, k : ℕ, δ : ℝ⁺, δ′ : ℝ⁺ 120 | . 121 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 122 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 123 | ε : ℝ⁺[ε], 124 | k : ℕ[k], 125 | δ : ℝ⁺[δ], 126 | δ′ : ℝ⁺[δ′], 127 | η : ℝ 128 | ⇒ 129 | let m₀ = mcreate[ L∞ | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 130 | let c = box (mclip[L2] xs) in 131 | aloop[ δ′ ] k on m₀ { a, θ ⇒ 132 | let s = ℝ⁺[1.0] / real (rows xs) in 133 | g ← mgauss[ s , ε , δ ] { ∇[ LR | θ ; unbox c , ys ] } ; 134 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 135 | } 136 | in 137 | 138 | let main = 139 | pλ m : ℕ, n : ℕ, k : ℕ, ε : ℝ⁺, δ : ℝ⁺, δ′ : ℝ⁺ 140 | . 141 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 142 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 143 | ε : ℝ⁺[ε], 144 | k : ℕ[k], 145 | δ : ℝ⁺[δ], 146 | δ′ : ℝ⁺[δ′], 147 | η : ℝ, 148 | bs : 𝕄 [L∞, U|1, k⋅𝔻 ] 149 | ⇒ 150 | means ← colMeans@[m,n,k,ε,δ. xs, ε, δ, bs]; 151 | scales ← colScaleParams@[m,n,ε,δ,k. xs, ε, δ, bs, means]; 152 | let normalizeF = normalize@[m,n] means scales in 153 | noisySGD@[m,n,ε,k,δ,δ′ . normalizeF xs, ys, ε, k, δ, δ′, η] 154 | -- return (unbox xs′) 155 | 156 | in main 157 | 158 | -------------------------------------------------------------------------------- /examples/complete/normalize.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/normalize.ed.duet 3 | ================================================================================ 4 | READING 5 | (2.36e-4s) 6 | TOKENIZING 7 | (13.690753s) 8 | PARSING 9 | (1.275586s) 10 | TYPE CHECKING 11 | (6.908e-3s) 12 | DONE 13 | Inr 14 | ⟨ {col↦⊤} 15 | , ∀ m:ℕ , n:ℕ , k:ℕ , ε:ℝ⁺ , δ:ℝ⁺ , δ′:ℝ⁺ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@⟨3nε+2ε√(2k㏒1/δ′),kδ+nδ+δ′⟩ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@⟨2ε√(2k㏒1/δ′),kδ+δ′⟩ 18 | , ℝ⁺[ε]@⊤ 19 | , ℕ[k]@⊤ 20 | , ℝ⁺[δ]@⊤ 21 | , ℝ⁺[δ′]@⊤ 22 | , ℝ@⊤ 23 | , 𝕄 [L∞,U|1,(k ⋅ 𝔻 )]@⊤ 24 | ⇒ 𝕄 [L∞,U|1,(n ⋅ ℝ)] 25 | ⟩ 26 | -------------------------------------------------------------------------------- /examples/complete/parallel-privacy.ed.duet: -------------------------------------------------------------------------------- 1 | let iter = sλ n : ℕ, 2 | ε : ℝ⁺, 3 | δ : ℝ⁺, 4 | b : ℕ 5 | . 6 | b : ℕ[b], 7 | ε : ℝ⁺[ε], 8 | δ : ℝ⁺[δ], 9 | η : ℝ 10 | ⇒ 11 | pλ . 12 | xs : 𝕄 [L∞, L2|b, n⋅𝔻 ], 13 | ys : 𝕄 [L∞, U|b, 1⋅𝔻 ], 14 | θ : 𝕄 [L∞, U|1, n⋅ℝ ] 15 | ⇒ 16 | let s = ℝ⁺[1.0] / real b in 17 | g ← mgauss[ s , ε , δ ] { 18 | ∇[ LR | θ ; xs , ys ] 19 | } ; 20 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 21 | in 22 | 23 | let main = pλ m : ℕ, 24 | n : ℕ, 25 | ε : ℝ⁺, 26 | k : ℕ, 27 | δ : ℝ⁺, 28 | b : ℕ 29 | . 30 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 31 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 32 | ε : ℝ⁺[ε], 33 | k : ℕ[k], 34 | δ : ℝ⁺[δ], 35 | η : ℝ, 36 | b : ℕ[b] 37 | ⇒ 38 | let m₀ = mcreate[ L2 | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 39 | let c = box (mclip[L2] xs) in 40 | let s = real k / real b in 41 | pfld-rows [b, m₀, mclip[L2] xs, ys, iter@[n, ε, δ, b] b ε δ η] 42 | in main 43 | 44 | -- let f = pλ b : box stuff 45 | -- ⇒ 46 | -- gauss[] {unbox b} 47 | -- in 48 | -- let g = pλ x : ℝ 49 | -- ⇒ 50 | -- let b = box x in 51 | -- f@[.b] 52 | -- in g 53 | -------------------------------------------------------------------------------- /examples/complete/parallel-privacy.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/parallel-privacy.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.81e-4s) 6 | TOKENIZING 7 | (2.916079s) 8 | PARSING 9 | (0.451154s) 10 | TYPE CHECKING 11 | (6.73e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ m:ℕ , n:ℕ , ε:ℝ⁺ , k:ℕ , δ:ℝ⁺ , b:ℕ 16 | . 𝕄 [L∞,U|m,(n ⋅ 𝔻 )]@⟨ε,δ⟩ 17 | , 𝕄 [L∞,U|m,(1 ⋅ 𝔻 )]@⟨ε,δ⟩ 18 | , ℝ⁺[ε]@⊤ 19 | , ℕ[k]@⊤ 20 | , ℝ⁺[δ]@⊤ 21 | , ℝ@⊤ 22 | , ℕ[b]@⊤ 23 | ⇒ 𝕄 [L2,U|1,(n ⋅ ℝ)] 24 | ⟩ 25 | -------------------------------------------------------------------------------- /examples/complete/parallel-simple.ed.duet: -------------------------------------------------------------------------------- 1 | -- Presna algorithm 2 | let main = pλ ε : ℝ⁺, 3 | δ : ℝ⁺ 4 | . 5 | df : 𝕄 [L∞ , U | ★ , 𝐝 ℕ ∷ 𝐝 ℝ ∷ [] ], 6 | ε : ℝ⁺[ε], 7 | δ : ℝ⁺[δ], 8 | q : ℕ[0], 9 | r : ℕ[0], 10 | s : ℕ[0], 11 | t : ℕ[1] 12 | ⇒ 13 | 14 | -- must be 1-sens in row 15 | -- ↓ 16 | parallel[ df, ℘ {true, false} ] {row ⇒ (clip (row#[q,r])) ≡ 1} { b, p ⇒ 17 | -- ↑ 18 | -- this is the only variable that gets a non-∞ privacy cost when referenced 19 | x ← gauss[ℝ⁺[1.0], ε, δ]

{ clip(p#[s,t]) }; 20 | return ⟨b, x⟩ 21 | } 22 | in main 23 | 24 | 25 | -- Γ , ⌉Σᴳ₀⌈⸢1⸣ ⊢ eᴳ₀ : 𝕄 [ ℓ , c | ★ , s ] 26 | -- Γ , Σᴳ₁ ⊢ eᴳ₁ : ℘ τ₁ 27 | -- Γ ⊎ {x₂ : 𝕄 [ ℓ , c | 1 , s ]} , Σᴳ₂ ⊎ {x₂ @ᴳ 1} ⊢ eᴳ₂ : τ₁ 28 | -- Γ ⊎ {x₃ : τ₁ , x₄ : 𝕄 [ ℓ , c | ★ , s ]} , Σᴿ₃ ⊎ {x₃ @ᴿ ∞, x₄ @ᴿ ⟨ε,δ⟩} ⊢ eᴿ₃ : τ₂ 29 | -- -------------------------------------------------------------------------------------- 30 | -- Γ 31 | -- , ⌉Σᴳ₁ + Σᴳ₂⌈⸢∞ᴿ⸣ + ⌉Σᴿ₃⌈⸢∞ᴿ⸣ + ⌉Σᴳ₀⌈⸢⟨ε,δ⟩⸣ 32 | -- ⊢ parallel[ eᴳ₀ , eᴳ₁ ] { x₂ ⇒ eᴳ₂ } { x₃ , x₄ ⇒ eᴿ₃ } 33 | -- : ℘ τ₂ 34 | 35 | 36 | -- Σᴳ₀ = { a @ 1 , b @ 0.5 , c @ ⊥ , d @ ⊥ } -- sensitivities 37 | -- ⌉Σᴳ₀⌈⸢⟨ε,δ⟩⸣ = { a @ ⟨ε,δ⟩ , b @ ⟨ε,δ⟩ , c @ ⊥ , d @ ⊥ } -- privacies 38 | -------------------------------------------------------------------------------- /examples/complete/parallel-simple.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/plambda-bad.eps.duet 3 | ================================================================================ 4 | READING 5 | (1.68e-4s) 6 | TOKENIZING 7 | (0.726477s) 8 | PARSING 9 | (9.3922e-2s) 10 | TYPE CHECKING 11 | (2.98e-4s) 12 | DONE 13 | Inr ⟨{},∀ ε:ℝ⁺ . 𝕄 [L∞,U|★,((𝐝 ℕ) ∷ [])]@ε , ℝ⁺[ε]@⊤ ⇒ ℝ⟩ 14 | -------------------------------------------------------------------------------- /examples/complete/plambda.eps.duet: -------------------------------------------------------------------------------- 1 | let main = pλ ε : ℝ⁺ 2 | . 3 | m : 𝕄 [L∞ , U | ★ , 𝐝 ℕ ∷ [] ], 4 | ε : ℝ⁺[ε] 5 | ⇒ 6 | let query01 = pλ ε : ℝ⁺ 7 | . 8 | m : 𝕄 [L∞ , U | ★ , 𝐝 ℕ ∷ [] ], 9 | ε : ℝ⁺[ε] 10 | ⇒ 11 | laplace[ℝ⁺[1.0], ε] { real (rows m) } 12 | in 13 | query01@[ε . m, ε] 14 | in main 15 | -------------------------------------------------------------------------------- /examples/complete/plambda.eps.duet.output: -------------------------------------------------------------------------------- 1 | let main = pλ ε : ℝ⁺ 2 | . 3 | m : 𝕄 [L∞ , U | ★ , 𝐝 ℕ ∷ [] ], 4 | ε : ℝ⁺[ε] 5 | ⇒ 6 | let query01 = pλ ε : ℝ⁺ 7 | . 8 | m : 𝕄 [L∞ , U | ★ , 𝐝 ℕ ∷ [] ], 9 | ε : ℝ⁺[ε] 10 | ⇒ 11 | laplace[ℝ⁺[1.0], ε] { real (rows m) } 12 | in 13 | query01@[ε . m, ε] 14 | in main 15 | -------------------------------------------------------------------------------- /examples/complete/presna-crisis.eps.duet: -------------------------------------------------------------------------------- 1 | -- `duet run "incoming1.csv" "outgoing1.csv" "blocks1.csv" "crisis1.cs" 0.05 0.0001 > output.csv` 2 | -- Presna algorithm 3 | let main = pλ ε : ℝ⁺ 4 | . 5 | -- interval:ℕ,phone_id:ℕ,x:ℕ,y:ℕ,hash:𝕊 6 | incoming : 𝕄 [L∞ , U | ★ , 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ [] ], 7 | outgoing : 𝕄 [L∞ , U | ★ , 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ [] ], 8 | -- blocks : ℘ (𝐝 ℕ × 𝐝 ℕ), -- set of all the blocks of interest 9 | -- crisis : ℘ (𝐝 ℕ × 𝐝 ℕ), -- set of blocks in crisis 10 | ε : ℝ⁺[ε] 11 | ⇒ 12 | 13 | let getXY = sλ . row : 𝕄 [L∞ , U | 1 , 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ [] ] ⇒ 14 | ⟨ clip (row#[ℕ[0],ℕ[2]]), clip (row#[ℕ[0],ℕ[3]]) ⟩ 15 | in 16 | let getXYsnd = sλ . row : 𝕄 [L∞ , U | 1 , 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ [] ] ⇒ 17 | ⟨ clip (row#[ℕ[0],ℕ[7]]), clip (row#[ℕ[0],ℕ[8]]) ⟩ 18 | in 19 | let blocks = ℘ {⟨0,0⟩,⟨0,1⟩,⟨1,0⟩,⟨1,1⟩} in 20 | let crisis = ℘ {⟨1,1⟩} in 21 | -- CRISIS mode 22 | -- result of the join is a ℕ ∷ ℕ ∷ ℕ ∷ ℕ ∷ 𝕊 ∷ ℕ ∷ ℕ ∷ ℕ ∷ ℕ ∷ 𝕊 ∷ [] 23 | -- | INCOMING | OUTGOING | 24 | -- eventually we want a list of variables here, do not worry about this for now 25 | -- ⌄ 26 | -- parallel <> [ join₁[outgoing, embed x + embed y, incoming, 4] , ℘ { true, false } ] { row ⇒ (getXY row) ∈ crisis } 27 | parallel [ join₁[outgoing, ℕ[4], incoming, ℕ[4]] , ℘ { true, false } ] { row ⇒ (getXY row) ∈ crisis } 28 | { n, pb ⇒ 29 | if n then { 30 | r ← parallel [pb, blocks] { row ⇒ getXY row } 31 | { b₁, p₁ ⇒ parallel [p₁, blocks] { row ⇒ getXYsnd row } 32 | { b₂, p₂ ⇒ noisyCount ← laplace[ℝ⁺[1.0], ε] { real (rows p₂) }; 33 | return ⟨⟨b₁, b₂⟩, noisyCount⟩ } }; 34 | return ⟨n, unionAll r⟩ 35 | } else { 36 | r ← parallel [pb, blocks] { row ⇒ getXY row } 37 | { b, p ⇒ noisyCount ← laplace[ℝ⁺[1.0], ε]

{ real (rows p) }; 38 | return ⟨⟨b, b⟩, noisyCount⟩ }; 39 | return ⟨n, r⟩ 40 | } 41 | } 42 | in main 43 | 44 | -- Γ₁ ⊢ e₁ : 𝔹 45 | -- Γ₂ ⊢ e₂ : τ 46 | -- Γ₂ ⊢ e₃ : τ 47 | -- ------------------------------------------- 48 | -- ∞Γ₁ + Γ₂ ⊢ if e₁ then { e₂ } else { e₃ } : τ 49 | 50 | -- We use Γ₂ for both e₂ and e₃; by weakening this means you get the 51 | -- max privacy cost between the two 52 | -------------------------------------------------------------------------------- /examples/complete/presna-crisis.eps.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/presna-crisis.eps.duet 3 | ================================================================================ 4 | READING 5 | (1.98e-4s) 6 | TOKENIZING 7 | (7.50485s) 8 | PARSING 9 | (1.193073s) 10 | TYPE CHECKING 11 | (5.04e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ ε:ℝ⁺ 16 | . 𝕄 [L∞,U|★,((𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 𝕊) ∷ [])]@ε 17 | , 𝕄 [L∞,U|★,((𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 𝕊) ∷ [])]@ε 18 | , ℝ⁺[ε]@⊤ 19 | ⇒ ℘ { 𝔹 × (℘ { ℕ × ℕ × (ℕ × ℕ) × ℝ }) } 20 | ⟩ 21 | -------------------------------------------------------------------------------- /examples/complete/presna-normal.ed.duet: -------------------------------------------------------------------------------- 1 | -- Presna algorithms 2 | let main = pλ ε : ℝ⁺, 3 | δ : ℝ⁺ 4 | . 5 | -- interval:ℕ,phone_id:ℕ,x:ℕ,y:ℕ,hash:𝕊 6 | incoming : 𝕄 [L∞ , U | ★ , 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ [] ], 7 | outgoing : 𝕄 [L∞ , U | ★ , 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ [] ], 8 | blocks : ℘ (𝐝 ℕ × 𝐝 ℕ), -- set of all the blocks of interest 9 | ε : ℝ⁺[ε], 10 | δ : ℝ⁺[δ] 11 | ⇒ 12 | -- NORMAL mode 13 | let getXY = sλ . row : 𝕄 [L∞ , U | 1 , 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ [] ] ⇒ 14 | ⟨ row#[ℕ[0],ℕ[2]], row#[ℕ[0],ℕ[3]] ⟩ 15 | in 16 | parallel[ outgoing , blocks ] { row ⇒ getXY row } { b, p ⇒ 17 | noisyCount ← gauss[ℝ⁺[1.0], ε, δ]

{ real (rows p) }; 18 | return ⟨b, noisyCount⟩ 19 | } 20 | in main 21 | -------------------------------------------------------------------------------- /examples/complete/presna-normal.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/presna-normal.ed.duet 3 | ================================================================================ 4 | READING 5 | (1.92e-4s) 6 | TOKENIZING 7 | (2.953577s) 8 | PARSING 9 | (0.239626s) 10 | TYPE CHECKING 11 | (3.19e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ ε:ℝ⁺ , δ:ℝ⁺ 16 | . 𝕄 [L∞,U|★,((𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 𝕊) ∷ [])]@⊥ 17 | , 𝕄 [L∞,U|★,((𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 𝕊) ∷ [])]@⟨ε,δ⟩ 18 | , ℘ { (𝐝 ℕ) × (𝐝 ℕ) }@⊤ 19 | , ℝ⁺[ε]@⊤ 20 | , ℝ⁺[δ]@⊤ 21 | ⇒ ℘ { (𝐝 ℕ) × (𝐝 ℕ) × ℝ } 22 | ⟩ 23 | -------------------------------------------------------------------------------- /examples/complete/presna-queries.eps.duet: -------------------------------------------------------------------------------- 1 | -- `duet run "incoming1.csv" "outgoing1.csv" "blocks1.csv" "crisis1.cs" 0.05 0.0001 > output.csv` 2 | -- Presna algorithm 3 | let main = pλ ε : ℝ⁺ 4 | . 5 | interval : ℕ, 6 | incoming : 𝕄 [L∞ , U | ★ , 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ [] ], 7 | outgoing : 𝕄 [L∞ , U | ★ , 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ [] ], 8 | blocks : ℘ (𝐝 ℕ × 𝐝 ℕ), -- set of all the blocks of interest 9 | crisis : ℘ (𝐝 ℕ × 𝐝 ℕ), -- set of blocks in crisis 10 | ε : ℝ⁺[ε] 11 | ⇒ 12 | 13 | let getXYone = sλ . row : 𝕄 [L∞ , U | 1 , 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊∷ [] ] ⇒ 14 | ⟨ (row#[ℕ[0],ℕ[2]]), (row#[ℕ[0],ℕ[3]]) ⟩ 15 | in 16 | let getXY = sλ . row : 𝕄 [L∞ , U | 1 , 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ [] ] ⇒ 17 | ⟨ (row#[ℕ[0],ℕ[2]]), (row#[ℕ[0],ℕ[3]]) ⟩ 18 | in 19 | let getXYsnd = sλ . row : 𝕄 [L∞ , U | 1 , 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ [] ] ⇒ 20 | ⟨ (row#[ℕ[0],ℕ[7]]), (row#[ℕ[0],ℕ[8]]) ⟩ 21 | in 22 | -- let blocks = ℘ {⟨0,0⟩,⟨0,1⟩,⟨1,0⟩,⟨1,1⟩} in 23 | -- let crisis = ℘ {⟨1,1⟩} in 24 | let query01 = pλ ε : ℝ⁺ 25 | . 26 | -- interval:ℕ,phone_id:ℕ,x:ℕ,y:ℕ,hash:𝕊 27 | interval : 𝐝 ℕ, 28 | incoming : 𝕄 [L∞ , U | ★ , 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ [] ], 29 | outgoing : 𝕄 [L∞ , U | ★ , 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ [] ], 30 | ε : ℝ⁺[ε] 31 | ⇒ 32 | parallel [ outgoing , ℘ { true, false } ] { row ⇒ (getXYone row) ∈ crisis } 33 | { n, pb ⇒ 34 | if n then { 35 | r ← parallel [ join₁[pb, ℕ[4], incoming, ℕ[4]] , blocks] { row ⇒ getXY row } 36 | { b₁, p₁ ⇒ parallel [p₁, blocks] { row ⇒ getXYsnd row } 37 | { b₂, p₂ ⇒ noisyCount ← laplace[ℝ⁺[1.0], ε] { real (rows (mfilter p₂ { x ⇒ x#[ℕ[0], ℕ[0]] ≡ interval })) }; 38 | return ⟨⟨b₁, b₂⟩, noisyCount⟩ } }; 39 | return ⟨n, unionAll r⟩ 40 | } else { 41 | r ← parallel [pb, blocks] { row ⇒ getXYone row } 42 | { b, p ⇒ noisyCount ← laplace[ℝ⁺[1.0], ε]

{ real (rows (mfilter p { x ⇒ x#[ℕ[0], ℕ[0]] ≡ interval })) }; 43 | return ⟨⟨b, b⟩, noisyCount⟩ }; 44 | return ⟨n, r⟩ 45 | } 46 | } 47 | in 48 | let query2 = pλ ε : ℝ⁺ 49 | . 50 | -- interval:ℕ,phone_id:ℕ,x:ℕ,y:ℕ,hash:𝕊 51 | interval : 𝐝 ℕ, 52 | incoming : 𝕄 [L∞ , U | ★ , 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 ℕ ∷ 𝐝 𝕊 ∷ [] ], 53 | ε : ℝ⁺[ε] 54 | ⇒ 55 | parallel [ incoming , blocks ] { row ⇒ getXYone row } 56 | { b, p ⇒ noisyCount ← laplace[ℝ⁺[1.0], ε]

{ real (rows (mfilter p { x ⇒ x#[ℕ[0], ℕ[0]] ≡ interval })) }; 57 | return ⟨b, noisyCount⟩ } 58 | in 59 | --let incomingF = box (mfilter incoming { x ⇒ x#[ℕ[0], ℕ[0]] ≡ interval }) in 60 | --let outgoingF = box (mfilter outgoing { x ⇒ x#[ℕ[0], ℕ[0]] ≡ interval }) in 61 | -- intv ← return interval; 62 | r₁ ← query01@[ε . disc interval, incoming, outgoing, ε]; 63 | r₂ ← query2@[ε . disc interval, incoming, ε]; 64 | return ⟨r₁, r₂⟩ 65 | 66 | in main 67 | -------------------------------------------------------------------------------- /examples/complete/presna-queries.eps.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/presna-queries.eps.duet 3 | ================================================================================ 4 | READING 5 | (2.12e-4s) 6 | TOKENIZING 7 | (10.978794s) 8 | PARSING 9 | (4.677615s) 10 | TYPE CHECKING 11 | (8.17e-4s) 12 | DONE 13 | Inr 14 | ⟨ {} 15 | , ∀ ε:ℝ⁺ 16 | . 𝕄 [L∞,U|★,((𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 𝕊) ∷ [])]@⊤ 17 | , 𝕄 [L∞,U|★,((𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 ℕ) ∷ (𝐝 𝕊) ∷ [])]@ε 18 | , ℝ⁺[ε]@⊤ 19 | ⇒ (℘ { 𝔹 × (℘ { ℕ × ℕ × (ℕ × ℕ) × ℝ }) }) × (℘ { ℕ × ℕ × ℝ }) 20 | ⟩ 21 | -------------------------------------------------------------------------------- /examples/complete/scheduling.ed.duet: -------------------------------------------------------------------------------- 1 | -- `duet run "incoming1.csv" "outgoing1.csv" "blocks1.csv" "crisis1.cs" 0.05 0.0001 > output.csv` 2 | -- scheduling (no privacy) 3 | let hist = sλ m : ℕ, 4 | n : ℕ 5 | . 6 | availabilities : 𝕄 [L∞ , U | m , n ⋅ 𝐝 ℕ ] 7 | ⇒ 8 | mmap-col availabilities { col ⇒ 9 | mfold-row 0.0, col { a, r ⇒ 10 | a + (real (conv (r#[idx ℕ[0], idx ℕ[0]]))) 11 | } 12 | -- rows (mfilter col { r ⇒ 13 | -- r#[idx ℕ[0], idx ℕ[0]] ≡ (disc 1) 14 | -- }) 15 | } 16 | in 17 | 18 | let main = pλ ε : ℝ⁺, 19 | m : ℕ, 20 | n : ℕ 21 | . 22 | availabilities : 𝕄 [L∞ , U | m , n ⋅ 𝐝 ℕ ], 23 | ε : ℝ⁺[ε] 24 | ⇒ 25 | let availableHist = hist@[m,n] availabilities in 26 | let indexes = mcreate[ L∞ | ℕ[1] , cols availabilities ] { i , j ⇒ j } in 27 | exponential[ℝ⁺[1.0], ε] indexes { i ⇒ availableHist#[idx ℕ[0], i] } 28 | in main 29 | -------------------------------------------------------------------------------- /examples/complete/tiny-map.ed.duet: -------------------------------------------------------------------------------- 1 | let tiny-map = 2 | sλ m : ℕ , n : ℕ . X : 𝕄 [ L1 , U | m , n ⋅ ℝ ] ⇒ 3 | mmap X { x ⇒ x + 1.0 } 4 | in 5 | 6 | -- (1) 7 | -- in the paper 8 | -- X :₁ list(ℝ) ⊢ map (λ x ⇒ x + 1.0) X : list(ℝ) 9 | -- { X :: list(ℝ) | X<1> - X<2> ≤ s } ⊢ map (λ x ⇒ x + 1.0 X) :: { R :: list(ℝ) | R<1> - R<2> ≤ s } 10 | 11 | let one-sens = 12 | pλ ε : ℝ⁺ , δ : ℝ⁺ . ε : ℝ⁺[ε] , δ : ℝ⁺[δ] , y : ℝ ⇒ 13 | (pλ . x : ℝ ⇒ gauss[ℝ⁺[1.0],ε,δ] {x})@[.y] 14 | in 15 | 16 | -- let two-sens = 17 | -- pλ ε : ℝ⁺ , δ : ℝ⁺ . ε : ℝ⁺[ε] , δ : ℝ⁺[δ] , y : ℝ ⇒ 18 | -- let z = box (y+y) in 19 | -- -- gauss[ℝ⁺[2.0],ε,δ] {unbox z} 20 | -- return (pλ . x : box[y@2.0] ℝ ⇒ 21 | -- gauss[ℝ⁺[2.0],ε,δ] {unbox x} 22 | -- ) -- @[.z] -- (pλ . x : box[y@2.0] ℝ ⇒ gauss[ℝ⁺[2.0],ε,δ] {unbox x})@[.z] 23 | -- in 24 | 25 | let two-args = 26 | pλ ε : ℝ⁺ , δ : ℝ⁺ . ε : ℝ⁺[ε] , δ : ℝ⁺[δ] , x : ℝ , y : ℝ ⇒ 27 | g₁ ← gauss[ℝ⁺[1.0],ε,δ] {x} ; 28 | g₂ ← gauss[ℝ⁺[1.0],ε,δ] {y} ; 29 | return g₁ + g₂ 30 | in 31 | 32 | two-args 33 | 34 | -- (2) 35 | -- in the paper 36 | -- Arthur's 37 | -- y :₂ ℝ 38 | -- 39 | -- (λ (x :₁ ℝ) ⇒ gauss[1.0,ε,δ] x) (y + y) : ○⸤kε,ke⸢(k-1)ε⸣δ⸥ (for k = 2 in this example) 40 | -- (λ (x :₁ ℝ) ⇒ gauss[1.0,ε,δ] x) (y + y) : ○⸤2ε,2eᵋδ⸥ (for k = 2 in this example) 41 | -- 42 | -- Relational work 43 | -- (λ (x :: {x :: ℝ | x<1> - x<2> | ≤ 1.0}) ⇒ gauss[1.0,ε,δ] x) (y + y) ∶✗ 44 | -- (λ (x :: {x :: ℝ | x<1> - x<2> | ≤ s}) ⇒ gauss[s,ε,δ] x) (y + y) ∶ M⸤ε,δ⸥ (better) 45 | -- 46 | -- Our work 47 | -- 48 | -- (pλ (x :⸤ε,δ⸥ ℝ) ⇒ gauss[1.0,ε,δ] x) (y + y) :✗ 49 | 50 | -- y :⸤ε,δ⸥ ℝ 51 | -- ⊢ 52 | -- gauss[2.0,ε,δ] (y + y) : 53 | -- 54 | 55 | -- (3) 56 | -- Arthur 57 | -- (X :₁ ℝ) (Y :₁ ℝ) 58 | -- 59 | -- g₁ ← guass[1.0,ε,δ] x 60 | -- g₂ ← gauss[1.0,ε,δ] y 61 | -- return (g₁ + g₂) 62 | -- 63 | -- : ○⸤2ε,2δ⸥ 64 | 65 | -- Relational 66 | -- (X :: ℝ | distance ≤ 1) (Y ∷ ℝ | distance ≤ 1) 67 | 68 | -- g₁ ← guass[1.0,ε,δ] x 69 | -- g₂ ← gauss[1.0,ε,δ] y 70 | -- return (g₁ + g₂) 71 | -- 72 | -- : M⸤2ε,2δ⸥ ℝ 73 | 74 | -- us 75 | -- (X :⸤ε,δ⸥) (Y :⸤ε,δ⸥) 76 | -- g₁ ← guass[1.0,ε,δ] x 77 | -- g₂ ← gauss[1.0,ε,δ] y 78 | -- return (g₁ + g₂) 79 | -- 80 | -- : ℝ@⟨ε,δ⟩ , ℝ@⟨ε,δ⟩ ⇒ ℝ 81 | -- 82 | -- (4) 83 | -- let x' = expensive x in 84 | -- gauss [1.0,ε,δ] {x'} 85 | -- 86 | -- let x' = box (expensive x) in 87 | -- gauss [1.0,ε,δ] {unbox x'} 88 | -------------------------------------------------------------------------------- /examples/complete/tiny-map.ed.duet.output: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | Running example: examples/complete/tiny-map.ed.duet 3 | ================================================================================ 4 | READING 5 | (2.89e-4s) 6 | TOKENIZING 7 | (2.601812s) 8 | PARSING 9 | (0.150281s) 10 | TYPE CHECKING 11 | (3.22e-4s) 12 | DONE 13 | Inr ⟨{},∀ ε:ℝ⁺ , δ:ℝ⁺ . ℝ⁺[ε]@⊤ , ℝ⁺[δ]@⊤ , ℝ@⟨ε,δ⟩ , ℝ@⟨ε,δ⟩ ⇒ ℝ⟩ 14 | -------------------------------------------------------------------------------- /examples/wip/apply.ed.duet: -------------------------------------------------------------------------------- 1 | let apply = sλ τ₁ : ☆K, 2 | τ₂ : ☆K, 3 | s : ℝ⁺ 4 | . 5 | f : (∀ . τ₁ ⊸[ s ] τ₂), 6 | x : τ₁ 7 | ⇒ 8 | f x 9 | in apply 10 | -------------------------------------------------------------------------------- /examples/wip/dataframe-schedule.ed.duet: -------------------------------------------------------------------------------- 1 | -- scheduling dataframe example 2 | let main = pλ ε : ℝ⁺ 3 | . 4 | p₁ : 𝔻𝔽[time:ℕ, busy₁:𝔹], 5 | p₂ : 𝔻𝔽[time:ℕ, busy₂:𝔹] 6 | ⇒ 7 | return (firstDF ⧼time⧽ 8 | (filterDF (join[time] p₁ p₂) 9 | { x ⇒ (x⧼busy₁⧽ ≡ 𝔹[False] ∧ x⧼busy₂⧽ ≡ 𝔹[False]) })) 10 | in main 11 | -------------------------------------------------------------------------------- /examples/wip/dataframe-simple.ed.duet: -------------------------------------------------------------------------------- 1 | -- simple dataframe example 2 | let main = pλ ε : ℝ⁺, 3 | δ : ℝ⁺ 4 | . 5 | ε : ℝ⁺[ε], 6 | δ : ℝ⁺[δ], 7 | df₁ : 𝕄[L∞, U | ★, [ℕ, ℝ]], 8 | df₂ : bag record[id:ℕ, salary:ℝ], -- 𝕄[L∞, U | ☆, [ℕ, ℝ]] 9 | b : bag ℕ, -- 𝕄[L∞, U | ☆, ℕ[1] . ℕ] 10 | s : set ℕ 11 | ⇒ 12 | aaaa ← gauss[ℝ⁺[2.0], ε, δ] { ℝ⁺[2.0]⋅ real (countBag (filterBag df₁ {x ⇒ x⧼id⧽ ≡ 1})) }; 13 | bbbb ← gauss[ℝ⁺[2.0], ε, δ] { ℝ⁺[2.0]⋅ real (countBag (filterBag df₂ {x ⇒ x⧼id⧽ ≡ 1})) }; 14 | cccc ← gauss[ℝ⁺[1.0], ε, δ] { real (countBag b) }; 15 | dddd ← bgauss[ℝ⁺[1.0], ε, δ] { bmap partitionDF[df₂, id, s] { r ⇒ real (countBag r) } }; 16 | return dddd 17 | in main 18 | 19 | -- TODOS: 20 | -- bgauss (like mgauss; will need parser & syntax & typechecker) 21 | -- bmap (like mmap; will need parser & syntax & typechecker) 22 | -- partitionDF (just fix typechecker) 23 | 24 | -- Typing rule for partition 25 | -- Γ₁ ⊢ e₁ : bag record[a₁: τ₁ ... aₙ : τₙ] 26 | -- Γ₂ ⊢ e₂ : set τᵢ 27 | -- -------------------------- 28 | -- Γ₁ + ∞Γ₂ ⊢ partition[e₁, aᵢ, e₂] : 𝕄[ℕ, ℕ[1]] bag record[a₁: τ₁ ... aₙ : τₙ] 29 | 30 | 31 | -- example w/ matrix: mgauss { mmap m { r ⇒ countBag r } } 32 | 33 | -- rows[istrue, b]: 34 | -- ( 35 | -- true, 2 36 | -- true, 3 37 | -- false, 2 38 | -- ) 39 | 40 | -- set: 41 | -- {true, false} 42 | 43 | -- partition rows⧼istrue⧽ set = 44 | -- ( 45 | -- ( 46 | -- true, 2 47 | -- true, 3 48 | -- ) 49 | -- ( 50 | -- false,2 51 | -- ) 52 | -- ) 53 | -------------------------------------------------------------------------------- /examples/wip/gd-pb-mini.renyi.duet: -------------------------------------------------------------------------------- 1 | -- gradient descent 2 | -- per-iteration bound 3 | -- with minibatching 4 | let main = pλ m : ℕ, 5 | n : ℕ, 6 | ε : ℝ⁺, 7 | α : ℝ⁺, 8 | k : ℕ, 9 | b : ℕ 10 | . 11 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 12 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 13 | ε : ℝ⁺[ε], 14 | α : ℝ⁺[α], 15 | k : ℕ[k], 16 | η : ℝ, 17 | b : ℕ[b] 18 | ⇒ 19 | let m₀ = mcreate[ L∞ | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 20 | loop k on m₀ { t , θ ⇒ 21 | g ← sample[ b ] xs, ys {xs', ys' ⇒ 22 | let s = ℝ⁺[1.0] / real (rows xs') in 23 | mgauss[ s , α, ε ] { ∇[ LR | θ ; mclip[L2] xs' , ys' ] } }; 24 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 25 | } 26 | in main 27 | -------------------------------------------------------------------------------- /examples/wip/gd-pb-zcdp-tb.ed.duet: -------------------------------------------------------------------------------- 1 | -- gradient descent 2 | -- per-iteration bound 3 | let main = pλ m : ℕ, 4 | n : ℕ, 5 | k : ℕ, 6 | ε : ℝ⁺, 7 | δ : ℝ⁺ 8 | . 9 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] , 10 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] , 11 | k : ℕ[k], 12 | ε : ℝ⁺[ε], 13 | δ : ℝ⁺[δ], 14 | η : ℝ 15 | ⇒ 16 | let m₀ = mcreate[ L∞ | ℕ[1] , cols xs ] { i , j ⇒ 0.0 } in 17 | -- this is according to wolfram alpha 18 | -- having tested some examples, it does seem to work 19 | let ρᵢ = (-2√(k² ε ㏒(1/δ) + k² ㏒(1/δ)²) + 2 k ㏒(1/δ) + k ε) / k² in 20 | ZCDP[ δ ] { 21 | loop k on m₀ { a, θ ⇒ 22 | let s = ℝ⁺[1.0] / real (rows xs) in 23 | g ← mgauss[ s , ρᵢ ] { ∇[ LR | θ ; mclip[L2] xs, ys ] } ; 24 | return mmap θ , mmap g { x ⇒ η ⋅ x } { x , y ⇒ x - y } 25 | } 26 | } 27 | in main 28 | -------------------------------------------------------------------------------- /examples/wip/olh.ed.duet: -------------------------------------------------------------------------------- 1 | -- optimized local hashing 2 | let main = pλ d : ℕ, 3 | p : ℕ, 4 | ε : ℝ⁺ 5 | . 6 | d : ℕ[d], 7 | p : ℕ[p], 8 | x : ℕ, 9 | ε : ℝ⁺[ε] 10 | ⇒ 11 | a ← rand-nat[1, dyn p]; 12 | b ← rand-nat[0, dyn p]; 13 | rand-resp[d + ℕ[1], ε] { ((a ⋅ x + b) mod p) mod (d + ℕ[1]) } 14 | in main 15 | -------------------------------------------------------------------------------- /experiments/crypt.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE OverloadedStrings #-} 2 | {-# LANGUAGE ScopedTypeVariables #-} 3 | {-# LANGUAGE GADTs #-} 4 | 5 | import Crypto.Cipher.AES (AES128) 6 | import Crypto.Cipher.Types (BlockCipher(..), Cipher(..), nullIV, KeySizeSpecifier(..), IV, makeIV) 7 | import Crypto.Error (CryptoFailable(..), CryptoError(..)) 8 | 9 | import qualified Crypto.Random.Types as CRT 10 | 11 | import Data.ByteArray (ByteArray) 12 | import Data.ByteString (ByteString) 13 | 14 | -- | Not required, but most general implementation 15 | data Key c a where 16 | Key :: (BlockCipher c, ByteArray a) => a -> Key c a 17 | 18 | -- | Generates a string of bytes (key) of a specific length for a given block cipher 19 | genSecretKey :: forall m c a. (CRT.MonadRandom m, BlockCipher c, ByteArray a) => c -> Int -> m (Key c a) 20 | genSecretKey _ = fmap Key . CRT.getRandomBytes 21 | 22 | -- | Generate a random initialization vector for a given block cipher 23 | genRandomIV :: forall m c. (CRT.MonadRandom m, BlockCipher c) => c -> m (Maybe (IV c)) 24 | genRandomIV _ = do 25 | bytes :: ByteString <- CRT.getRandomBytes $ blockSize (undefined :: c) 26 | return $ makeIV bytes 27 | 28 | -- | Initialize a block cipher 29 | initCipher :: (BlockCipher c, ByteArray a) => Key c a -> Either CryptoError c 30 | initCipher (Key k) = case cipherInit k of 31 | CryptoFailed e -> Left e 32 | CryptoPassed a -> Right a 33 | 34 | encrypt :: (BlockCipher c, ByteArray a) => Key c a -> IV c -> a -> Either CryptoError a 35 | encrypt secretKey initIV msg = 36 | case initCipher secretKey of 37 | Left e -> Left e 38 | Right c -> Right $ ctrCombine c initIV msg 39 | 40 | decrypt :: (BlockCipher c, ByteArray a) => Key c a -> IV c -> a -> Either CryptoError a 41 | decrypt = encrypt 42 | 43 | exampleAES128 :: ByteString -> IO () 44 | exampleAES128 msg = do 45 | -- secret key needs 128 bits (16 * 8) 46 | secretKey <- genSecretKey (undefined :: AES128) 16 47 | mInitIV <- genRandomIV (undefined :: AES128) 48 | case mInitIV of 49 | Nothing -> error "Failed to generate an initialization vector." 50 | Just initIV -> do 51 | let encryptedMsg = encrypt secretKey initIV msg 52 | decryptedMsg = decrypt secretKey initIV =<< encryptedMsg 53 | case (,) <$> encryptedMsg <*> decryptedMsg of 54 | Left err -> error $ show err 55 | Right (eMsg, dMsg) -> do 56 | putStrLn $ "Original Message: " ++ show msg 57 | putStrLn $ "Message after encryption: " ++ show eMsg 58 | putStrLn $ "Message after decryption: " ++ show dMsg 59 | 60 | example1AES128 :: [ByteString] -> IO () 61 | example1AES128 msg = do 62 | -- secret key needs 128 bits (16 * 8) 63 | secretKey <- genSecretKey (undefined :: AES128) 16 64 | mInitIV <- genRandomIV (undefined :: AES128) 65 | case mInitIV of 66 | Nothing -> error "Failed to generate and initialization vector." 67 | Just initIV -> do 68 | let encryptedMsg = encryptCSV secretKey initIV msg 69 | decryptedMsg = decryptCSV secretKey initIV encryptedMsg 70 | case (encryptedMsg, decryptedMsg) of 71 | (eMsg, dMsg) -> do 72 | putStrLn $ "Original Message: " ++ show msg 73 | putStrLn $ "Message after encryption: " ++ show eMsg 74 | putStrLn $ "Message after decryption: " ++ show dMsg 75 | 76 | encryptCSV :: (BlockCipher c, ByteArray a) => Key c a -> IV c -> [a] -> [a] 77 | encryptCSV _ _ [] = [] 78 | encryptCSV secretKey initIV (x:xs) = 79 | case encrypt secretKey initIV x of 80 | Left err -> error $ show err 81 | Right eMsg -> eMsg : encryptCSV secretKey initIV xs 82 | 83 | decryptCSV :: (BlockCipher c, ByteArray a) => Key c a -> IV c -> [a] -> [a] 84 | decryptCSV = encryptCSV 85 | 86 | -- main = exampleAES128 "Hello, World!" 87 | main = example1AES128 ["Hello, World!", "Goodbye, World!"] 88 | -------------------------------------------------------------------------------- /main/Main.hs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | import Duet 4 | 5 | initEnv ∷ 𝕏 ⇰ Type RNF 6 | initEnv = dict 7 | [ var "sign" ↦ ((Nil :* ℝT) :⊸: (ι 1 :* ℝT)) 8 | ] 9 | 10 | parseMode ∷ 𝕊 → Ex_C PRIV_C PRIV_W 11 | parseMode s = case list $ splitOn𝕊 "." s of 12 | _ :& "eps" :& "duet" :& Nil → Ex_C EPS_W 13 | _ :& "ed" :& "duet" :& Nil → Ex_C ED_W 14 | _ :& "renyi" :& "duet" :& Nil → Ex_C RENYI_W 15 | _ :& "tcdp" :& "duet" :& Nil → Ex_C TC_W 16 | _ :& "zcdp" :& "duet" :& Nil → Ex_C ZC_W 17 | _ → error "BAD FILE NAME" 18 | 19 | parseMatrix𝔻 ∷ 𝕊 → ExMatrix 𝔻 20 | parseMatrix𝔻 s = unID $ do 21 | traceM "PARSING MATRIX…" 22 | let dss ∷ 𝐼 (𝐼 𝔻) 23 | dss = map (map read𝕊 ∘ iter ∘ splitOn𝕊 ",") $ filter (\x → not (isEmpty𝕊 x)) $ splitOn𝕊 "\n" s 24 | dss' ∷ 𝐿 (𝐿 𝔻) 25 | dss' = list $ map list dss 26 | xu dss' $ \ m → do 27 | traceM "DONE" 28 | return $ ExMatrix $ xvirt m 29 | 30 | -- TODO: detect line endings or make an arg 31 | buildArgs ∷ (Pretty r) ⇒ 𝐿 (Type r) → 𝐿 𝕊 → IO (𝐿 Val) 32 | buildArgs Nil Nil = return Nil 33 | buildArgs (τ:&τs) (a:&as) = case τ of 34 | -- TODO: currently the assumption is to read in RealVs 35 | (𝕄T _ _ _ (RexpME r τ)) → do 36 | s ← read a 37 | case parseMatrix𝔻 s of 38 | ExMatrix m → do 39 | let m' = MatrixV $ ExMatrix $ map RealV m 40 | r ← buildArgs τs as 41 | return $ m' :& r 42 | (𝕄T _ _ _ (ConsME τ m)) → do 43 | csvs ← read a 44 | let csvss = map (splitOn𝕊 ",") $ filter (\x → not (isEmpty𝕊 x)) $ splitOn𝕊 "\n" csvs 45 | let csvm = csvToDF (list $ map list csvss) (schemaToTypes (ConsME τ m)) 46 | r ← buildArgs τs as 47 | return $ csvm :& r 48 | SetT (τ₁ :×: τ₂) → do 49 | csvs ← read a 50 | let csvss = map (splitOn𝕊 ",") $ filter (\x → not (isEmpty𝕊 x)) $ splitOn𝕊 "\n" csvs 51 | let csvm = csvToPairSet (list $ map list csvss) (list [τ₁, τ₂]) 52 | r ← buildArgs τs as 53 | return $ csvm :& r 54 | ℕT → do 55 | r ← buildArgs τs as 56 | return $ NatV (read𝕊 a) :& r 57 | ℕˢT _ → do 58 | r ← buildArgs τs as 59 | return $ NatV (read𝕊 a) :& r 60 | ℝT → do 61 | r ← buildArgs τs as 62 | return $ RealV (read𝕊 a) :& r 63 | ℝˢT _ → do 64 | r ← buildArgs τs as 65 | return $ RealV (read𝕊 a) :& r 66 | _ → error $ "unexpected arg type in main: " ⧺ (pprender τ) 67 | buildArgs _ _ = error "number of args provided does not match function signature" 68 | 69 | drop :: ℕ -> IO (𝐼 𝕊) -> IO (𝐼 𝕊) 70 | drop x as = do 71 | as' ← as 72 | case list as' of 73 | Nil → return empty𝐼 74 | (_ :& ys) → do 75 | case x ≡ 1 of 76 | True → return $ iter ys 77 | False → drop (x-1) (return (iter ys)) 78 | 79 | intercalate ∷ 𝕊 → 𝐿 𝕊 → 𝕊 80 | intercalate sep arr = case arr of 81 | Nil -> "" 82 | (x :& Nil) -> x 83 | (x :& xs) -> x ⧺ sep ⧺ intercalate sep xs 84 | 85 | main ∷ IO () 86 | main = do 87 | (tohs ∘ list) ^⋅ args ≫= \case 88 | ["parse",fn] → do 89 | do pprint $ ppHeader "READING" ; flushOut 90 | s ← read fn 91 | do pprint $ ppHeader "TOKENIZING" ; flushOut 92 | ts ← tokenizeIO tokDuet $ stream $ list $ tokens s 93 | do pprint $ ppHeader "PARSING" ; flushOut 94 | unpack_C (parseMode fn) $ \ mode → 95 | parseIOMain (pSkip tokSkip $ pFinal $ parSExp mode) $ stream ts 96 | ["check",fn] → do 97 | do pprint $ ppHeader "READING" ; flushOut 98 | s :* tRead ← timeIO $ read fn 99 | do out $ "(" ⧺ show𝕊 (secondsTimeD tRead) ⧺ "s)" ; flushOut 100 | do pprint $ ppHeader "TOKENIZING" ; flushOut 101 | ts :* tToken ← timeIO $ tokenizeIO tokDuet $ stream $ list $ tokens s 102 | do out $ "(" ⧺ show𝕊 (secondsTimeD tToken) ⧺ "s)" ; flushOut 103 | unpack_C (parseMode fn) $ \ mode → do 104 | do pprint $ ppHeader "PARSING" ; flushOut 105 | e :* tParse ← timeIO $ parseIO (pSkip tokSkip $ pFinal $ parSExp mode) $ stream ts 106 | do out $ "(" ⧺ show𝕊 (secondsTimeD tParse) ⧺ "s)" ; flushOut 107 | do pprint $ ppHeader "TYPE CHECKING" ; flushOut 108 | r :* tCheck ← time (\ () → runSM dø initEnv dø $ inferSens e) () 109 | do out $ "(" ⧺ show𝕊 (secondsTimeD tCheck) ⧺ "s)" ; flushOut 110 | tt ← read "typecheck-times" 111 | write "typecheck-times" $ tt ⧺ "\n" ⧺ show𝕊 (secondsTimeD tCheck) 112 | do pprint $ ppHeader "DONE" ; flushOut 113 | do pprint r ; flushOut 114 | "lr-accuracy":xsfn:ysfn:mdfn:[] → do 115 | do pprint $ ppHeader "ACCURACY TEST" ; flushOut 116 | sxs ← read xsfn 117 | sys ← read ysfn 118 | smd ← read mdfn 119 | case (parseMatrix𝔻 sxs,parseMatrix𝔻 sys,parseMatrix𝔻 smd) of 120 | (ExMatrix mxs,ExMatrix mys,ExMatrix mmd) → do 121 | let xs ∷ ExMatrix 𝔻 122 | xs = ExMatrix mxs 123 | ys ∷ DuetVector 𝔻 124 | ys = list mys 125 | md ∷ DuetVector 𝔻 126 | md = list mmd 127 | (r :* w) = accuracy xs ys md 128 | write "out/acc.csv" (intercalate "," (map show𝕊 (list [r,w]))) 129 | pprint (r,w) 130 | pprint $ concat [ pretty (100.0 × dbl r / dbl (r+w)) , ppText "%" ] 131 | "run":fn:_ → do 132 | -- make this spit out concrete privacy costs based on the input 133 | do pprint $ ppHeader "READING" ; flushOut 134 | s ← read fn 135 | do pprint $ ppHeader "TOKENIZING" ; flushOut 136 | ts ← tokenizeIO tokDuet $ stream $ list $ tokens s 137 | do pprint $ ppHeader "PARSING" ; flushOut 138 | unpack_C (parseMode fn) $ \ mode → do 139 | e ← parseIO (pSkip tokSkip $ pFinal $ parSExp mode) $ stream ts 140 | do pprint $ ppHeader "TYPE CHECKING" ; flushOut 141 | let τ = runSM dø initEnv dø $ inferSens e 142 | do pprint τ ; flushOut 143 | do pprint $ ppHeader "RUNNING" ; flushOut 144 | let r = seval dø (extract e) 145 | do pprint r ; flushOut 146 | fnargs ← drop 2 args 147 | case τ of 148 | Inr rv → do 149 | case rv of 150 | _ :* (_ :* PArgs pargs) :⊸⋆: _ → do 151 | let τs = map fst pargs 152 | as ← buildArgs τs (list fnargs) 153 | case r of 154 | PFunV xs (ExPriv (Ex_C e₁)) γ → do 155 | r' ← peval (assoc (zip xs as) ⩌ γ) e₁ 156 | case r' of 157 | MatrixV m → do 158 | pprint r' 159 | write "out/model.csv" (intercalate "\n" (map (intercalate ",") (mapp (show𝕊 ∘ urv) (toRows m)))) 160 | _ → do 161 | pprint r' 162 | write "out/output.json" $ printJSON r' 163 | pprint $ ppHeader "DONE" ; flushOut 164 | _ → error "expected pλ at top level" 165 | _ → error "expected pλ at top level" 166 | _ → error "typechecking phase encountered an error" 167 | _ → do 168 | pprint $ ppHeader "USAGE" 169 | out $ "duet parse " 170 | out $ "duet check " 171 | 172 | printJSON ∷ Val → 𝕊 173 | printJSON v = (printJSONr v) ⧺ "\n" 174 | 175 | printJSONr ∷ Val → 𝕊 176 | printJSONr v = case v of 177 | NatV n → show𝕊 n 178 | RealV n → show𝕊 n 179 | BoolV True → "\"True\"" 180 | BoolV False → "\"False\"" 181 | PairV (v₁ :* v₂) → "[ " ⧺ (printJSONr v₁) ⧺ ", " ⧺ (printJSONr v₂) ⧺ " ]" 182 | SetV vs → "[\n" ⧺ (intercalate ",\n" $ map printJSONr (list vs)) ⧺ " ]" 183 | _ → show𝕊 v 184 | -------------------------------------------------------------------------------- /package.yaml: -------------------------------------------------------------------------------- 1 | verbatim: 2 | cabal-version: 2.2 3 | 4 | name: duet 5 | version: 0.0.0.0 6 | 7 | default-extensions: 8 | - ConstraintKinds 9 | - DataKinds 10 | - ExplicitNamespaces 11 | - FlexibleContexts 12 | - FlexibleInstances 13 | - FunctionalDependencies 14 | - GADTs 15 | - GeneralizedNewtypeDeriving 16 | - InstanceSigs 17 | - KindSignatures 18 | - LambdaCase 19 | - MonadComprehensions 20 | - MultiParamTypeClasses 21 | - NoImplicitPrelude 22 | - OverloadedStrings 23 | - PatternSynonyms 24 | - PolyKinds 25 | - QuantifiedConstraints 26 | - RankNTypes 27 | - RebindableSyntax 28 | - ScopedTypeVariables 29 | - StandaloneDeriving 30 | - Strict 31 | - StrictData 32 | - TemplateHaskell 33 | - TypeApplications 34 | - TypeFamilies 35 | - TypeOperators 36 | - UndecidableInstances 37 | - UndecidableSuperClasses 38 | - UnicodeSyntax 39 | - ViewPatterns 40 | 41 | ghc-options: 42 | - -Wall 43 | - -Wno-orphans 44 | - -Wno-partial-type-signatures 45 | - -j 46 | - -O0 47 | - -threaded -rtsopts -with-rtsopts=-N 48 | 49 | executable: 50 | source-dirs: 51 | - src 52 | - main 53 | main: Main.hs 54 | dependencies: 55 | - base 56 | - uvmhs 57 | - random 58 | - mwc-random 59 | - time 60 | - normaldistribution >= 1.1.0.3 61 | -------------------------------------------------------------------------------- /src/Duet.hs: -------------------------------------------------------------------------------- 1 | module Duet 2 | (module Duet.Parser 3 | ,module Duet.Quantity 4 | ,module Duet.RNF 5 | ,module Duet.Syntax 6 | ,module Duet.Check 7 | ,module Duet.Interpreter 8 | ,module Duet.UVMHS 9 | ) where 10 | 11 | import Duet.Parser 12 | import Duet.Quantity 13 | import Duet.RNF 14 | import Duet.Syntax 15 | import Duet.Check 16 | import Duet.Interpreter 17 | import Duet.UVMHS 18 | -------------------------------------------------------------------------------- /src/Duet/Interpreter.hs: -------------------------------------------------------------------------------- 1 | module Duet.Interpreter where 2 | 3 | import Duet.UVMHS 4 | 5 | import Duet.Pretty () 6 | import Duet.Syntax 7 | 8 | -- external libraries 9 | import System.Random.MWC 10 | import Data.Random.Normal 11 | 12 | type Env = 𝕏 ⇰ Val 13 | type DuetVector a = 𝐿 a 14 | type Model = DuetVector 𝔻 15 | 16 | 17 | -- | Defining Val algebraic data type 18 | data Val = 19 | NatV ℕ 20 | | RealV 𝔻 21 | | PairV (Val ∧ Val) 22 | | StrV 𝕊 23 | | BoolV 𝔹 24 | | ListV (𝐿 Val) 25 | | SetV (𝑃 Val) 26 | | SFunV 𝕏 (ExPriv SExp) Env -- See UVMHS.Core.Init for definition of Ex 27 | | PFunV (𝐿 𝕏) (ExPriv PExp) Env 28 | | MatrixV (ExMatrix Val) 29 | deriving (Eq,Ord,Show) 30 | 31 | instance Eq (Sℕ32 n) where 32 | TRUSTME_Sℕ32 n₁ == TRUSTME_Sℕ32 n₂ = n₁ ≡ n₂ 33 | instance (Eq a) ⇒ Eq (Vᴍ m n a) where 34 | Vᴍ m₁ n₁ a₁ == Vᴍ m₂ n₂ a₂ = (m₁ == m₂) ⩓ (n₁ == n₂) ⩓ (a₁ == a₂) 35 | data ExMatrix a where 36 | ExMatrix ∷ (Rℕ m,Rℕ n) ⇒ Vᴍ m n a -> ExMatrix a 37 | instance Functor ExMatrix where 38 | map f (ExMatrix m) = ExMatrix $ map f m 39 | instance (Eq a) ⇒ Eq (ExMatrix a) where 40 | ExMatrix (Vᴍ _ _ a₁) == ExMatrix (Vᴍ _ _ a₂) = a₁ ≡ a₂ 41 | instance (Ord a) ⇒ Ord (ExMatrix a) where 42 | compare (ExMatrix xs₁) (ExMatrix xs₂) = compare (xlist2 xs₁) (xlist2 xs₂) 43 | instance (Show a) ⇒ Show (ExMatrix a) where 44 | show (ExMatrix xs) = show $ xlist2 xs 45 | 46 | instance Pretty Val where 47 | pretty = \case 48 | NatV n → pretty n 49 | RealV d → pretty d 50 | StrV s → pretty s 51 | BoolV b → pretty b 52 | ListV l → pretty l 53 | SetV s → pretty s 54 | PairV a → pretty a 55 | SFunV _x _se _e → ppKeyPun "" 56 | PFunV _xs _pe _e → ppKeyPun "" 57 | MatrixV m → ppVertical $ list [ppText "MATRIX VALUE:",pretty m] 58 | 59 | instance (Pretty a) ⇒ Pretty (ExMatrix a) where 60 | pretty (ExMatrix a) = pretty a 61 | 62 | instance (Pretty a) ⇒ Pretty (Vᴍ m n a) where 63 | pretty m = pretty $ xlist2 m 64 | 65 | -- this could be moved to Syntax.hs, and PArgs r (and its Eq and Ord instances) 66 | -- could be derived using this type 67 | newtype ExPriv (e ∷ PRIV → ★) = ExPriv { unExPriv ∷ Ex_C PRIV_C e } 68 | 69 | deriving instance (∀ p. Show (e p)) ⇒ Show (ExPriv e) 70 | 71 | instance (∀ p. Eq (e p)) ⇒ Eq (ExPriv e) where 72 | ExPriv (Ex_C (e₁ ∷ e p₁)) == ExPriv (Ex_C (e₂ ∷ e p₂)) = case eqPRIV (priv @ p₁) (priv @ p₂) of 73 | Some (Refl ∷ p₁ ≟ p₂) → (e₁ ∷ e p₁) ≡ (e₂ ∷ e p₁) 74 | None → False 75 | 76 | instance (∀ p. Eq (e p),∀ p. Ord (e p)) ⇒ Ord (ExPriv e) where 77 | ExPriv (Ex_C (e₁ ∷ e p₁)) `compare` ExPriv (Ex_C (e₂ ∷ e p₂)) = case eqPRIV (priv @ p₁) (priv @ p₂) of 78 | Some (Refl ∷ p₁ ≟ p₂) → (e₁ ∷ e p₁) ⋚ (e₂ ∷ e p₁) 79 | None → stripPRIV (priv @ p₁) ⋚ stripPRIV (priv @ p₂) 80 | 81 | ex2m :: ExMatrix a → (∀ m n. Vᴍ m n a → b) → b 82 | ex2m (ExMatrix xs) f = f xs 83 | 84 | n2i :: ∀ n. Rℕ n ⇒ Sℕ32 n → ℕ → 𝕀32 n 85 | n2i s n = case (d𝕚 s (𝕟32 n)) of 86 | Some x → x 87 | None → error "index out of bounds" 88 | 89 | -- TODO: eventually add this to UVMHS 90 | minElem :: Ord b => (a → b) → 𝐿 a → a 91 | minElem f Nil = error "minElem on empty list" 92 | minElem f (x:&xs) = fold x (\ x₁ x₂ → case f x₁ < f x₂ of { True → x₁ ; False → x₂ }) xs 93 | 94 | minElemPairs :: Ord b => 𝐿 (a ∧ b) → a ∧ b 95 | minElemPairs = minElem snd 96 | 97 | norm_2 :: Vᴍ 1 m 𝔻 → 𝔻 98 | norm_2 = root ∘ sum ∘ xmap (\x → x×x) 99 | 100 | cols :: ExMatrix a → ℕ 101 | cols (ExMatrix xs) = nat $ unSℕ32 $ xcols xs 102 | 103 | rows :: ExMatrix a → ℕ 104 | rows (ExMatrix xs) = nat $ unSℕ32 $ xrows xs 105 | 106 | scols :: ∀ n a. Rℕ n ⇒ ExMatrix a → Sℕ32 n 107 | scols (ExMatrix (xs ∷ Vᴍ m' n' a)) = case compareTℕ @ n @ n' of 108 | Some Refl → xcols xs 109 | 110 | srows :: ∀ n a. Rℕ n ⇒ ExMatrix a → Sℕ32 n 111 | srows (ExMatrix (xs ∷ Vᴍ m' n' a)) = case compareTℕ @ n @ m' of 112 | Some Refl → xrows xs 113 | 114 | tr :: ExMatrix 𝔻 → ExMatrix 𝔻 115 | tr (ExMatrix xs) = ExMatrix $ xtranspose xs 116 | 117 | mindex :: ∀ m n a. (Rℕ m,Rℕ n) ⇒ ExMatrix a → 𝕀32 m → 𝕀32 n → a 118 | mindex (ExMatrix (xs ∷ Vᴍ m' n' a)) i j = case (compareTℕ @ n @ n',compareTℕ @ m @ m') of 119 | (Some Refl, Some Refl) → xs 𝄪 (i,j) 120 | 121 | boolCheck :: 𝔹 → 𝔻 122 | boolCheck True = 1.0 123 | boolCheck False = 0.0 124 | 125 | flatten :: ExMatrix a → DuetVector a 126 | flatten m = fold Nil (⧺) (toRows m) 127 | 128 | (<>) :: ExMatrix 𝔻 → ExMatrix 𝔻 → ExMatrix 𝔻 129 | (<>) (ExMatrix a) (ExMatrix b) = 130 | let b' = (xbp b) in 131 | let b'' = matrix (xcols a) (xcols b) $ \ i j → b' 𝄪 ((n2i (xrows b) (nat (un𝕀32 i))),j) in 132 | ExMatrix $ xproduct (xvirt (xbp a)) b'' 133 | 134 | xgradient ∷ ∀ m n. Vᴍ 1 n 𝔻 → Vᴍ m n 𝔻 → Vᴍ m 1 𝔻 → Vᴍ 1 n 𝔻 135 | xgradient θ xs ys = unID $ do 136 | let θ' ∷ Vᴍ 1 n 𝔻 137 | θ' = {- xvirt $ xup -} θ 138 | let exponent ∷ Vᴍ m 1 𝔻 139 | exponent = xvirt $ xup $ xtranspose (θ' ✖ xtranspose xs) × ys 140 | let scaled ∷ Vᴍ m 1 𝔻 141 | scaled = ys × xmap (\ x → 1.0 / (exp x + 1.0)) exponent 142 | let gradSum ∷ Vᴍ 1 n 𝔻 143 | gradSum = xtranspose scaled ✖ xs 144 | let r = neg $ dbl $ unSℕ32 $ xrows xs 145 | let avgGrad ∷ Vᴍ 1 n 𝔻 146 | avgGrad = xvirt $ xup $ xmap (\ x → x / r) gradSum 147 | return avgGrad 148 | 149 | scale :: 𝔻 → DuetVector 𝔻 → Model 150 | scale r v = map (× r) v 151 | 152 | mscale :: 𝔻 → ExMatrix 𝔻 → ExMatrix 𝔻 153 | mscale r (ExMatrix m) = ExMatrix $ xmap (× r) m 154 | 155 | -- build the rows of a matrix 156 | fromRows :: 𝐿 (𝐿 a) → ExMatrix a 157 | fromRows Nil = ExMatrix $ matrix (s𝕟32 @ 0) (s𝕟32 @ 0) (\i j -> undefined) 158 | fromRows ls = xb ls $ \ xs → ExMatrix (xvirt xs) 159 | 160 | -- extracts the rows of a matrix as a list of vectors 161 | toRows :: ExMatrix a → 𝐿 (𝐿 a) 162 | toRows (ExMatrix m) = xlist2 m 163 | 164 | (+++) :: (Plus a) => ExMatrix a → ExMatrix a → ExMatrix a 165 | (+++) (ExMatrix a) (ExMatrix b) = 166 | let b' = matrix (xrows a) (xcols a) $ \ i j → b 𝄪 ((n2i (xrows b) (nat (un𝕀32 i))),(n2i (xcols b) (nat (un𝕀32 j)))) in 167 | ExMatrix $ xmap2 (+) a b' 168 | 169 | (-/) :: (Minus a) => ExMatrix a → ExMatrix a → ExMatrix a 170 | (-/) (ExMatrix a) (ExMatrix b) = 171 | let b' = matrix (xrows a) (xcols a) $ \ i j → b 𝄪 ((n2i (xrows b) (nat (un𝕀32 i))),(n2i (xcols b) (nat (un𝕀32 j)))) in 172 | ExMatrix $ xmap2 (-) a b' 173 | 174 | urv :: Val → 𝔻 175 | urv x = case x of 176 | RealV d → d 177 | _ → error $ "unpack real val failed" ⧺ pprender x 178 | 179 | arsinh ∷ 𝔻 → 𝔻 180 | arsinh x = log $ x + (root $ (x × x) + 1.0) 181 | 182 | -- Nat, 1-row matrix (really a row), list of one row matrices, and so on 183 | -- mostly because matrices are the only thing we can index 184 | joinMatch₁ ∷ ℕ → ExMatrix Val → 𝐿 (ExMatrix Val) → ℕ → 𝐿 Val 185 | joinMatch₁ n₁ row₁ Nil n₂ = Nil 186 | joinMatch₁ n₁ (ExMatrix row₁) ((ExMatrix row₂):&rows₂) n₂ = 187 | case ((indexVᴍ (n2i (xrows row₁) 0) (n2i (xcols row₁) n₁) row₁) ≡ (indexVᴍ (n2i (xrows row₂) 0) (n2i (xcols row₂) n₂) row₂)) of 188 | True → (flatten (ExMatrix row₁)) ⧺ (flatten (ExMatrix row₂)) 189 | False → joinMatch₁ n₁ (ExMatrix row₁) rows₂ n₂ 190 | 191 | schemaToTypes :: MExp r → 𝐿 (Type r) 192 | schemaToTypes me = case me of 193 | (ConsME τ me') → schemaToTypes₁ me 194 | _ → error "schemaToTypes expects a ConsME" 195 | 196 | schemaToTypes₁ :: MExp r → 𝐿 (Type r) 197 | schemaToTypes₁ me = case me of 198 | (ConsME τ me') → τ :& schemaToTypes₁ me' 199 | EmptyME → Nil 200 | _ → error "schemaToTypes: unexpected MExp within ConsME" 201 | 202 | rowToDFRow :: (Pretty r) ⇒ 𝐿 (Type r) → 𝐿 𝕊 → 𝐿 Val 203 | rowToDFRow Nil Nil = Nil 204 | rowToDFRow (τ:&τs) (s:&ss) = case τ of 205 | ℕT → NatV (read𝕊 s) :& rowToDFRow τs ss 206 | ℕˢT _ → NatV (read𝕊 s) :& rowToDFRow τs ss 207 | ℝT → RealV (read𝕊 s) :& rowToDFRow τs ss 208 | ℝˢT _ → RealV (read𝕊 s) :& rowToDFRow τs ss 209 | 𝕊T → StrV (read𝕊 s) :& rowToDFRow τs ss 210 | 𝔻T τ' → rowToDFRow (τ':&τs) (s:&ss) 211 | _ → error $ "rowToDFRow: type is currently not supported" ⧺ pprender τ 212 | rowToDFRow y z = error $ "rowToDFRow: arguments length mismatch" ⧺ (pprender (y :* z)) 213 | 214 | pairList ∷ 𝐿 Val → Val 215 | pairList (v₁ :& v₂ :& Nil) = PairV (v₁ :* v₂) 216 | pairList _ = error "pairList: tried to build pair out of list with incorrect structure" 217 | 218 | csvToPairSet ∷ (Pretty r) ⇒ 𝐿 (𝐿 𝕊) → 𝐿 (Type r) → Val 219 | csvToPairSet sss τs = 220 | let csvList ∷ 𝐿 (𝐿 Val) = map (rowToDFRow τs) sss 221 | in SetV $ pow $ map pairList csvList 222 | 223 | csvToDF ∷ (Pretty r) ⇒ 𝐿 (𝐿 𝕊) → 𝐿 (Type r) → Val 224 | csvToDF sss τs = 225 | let csvList ∷ 𝐿 (𝐿 Val) = map (rowToDFRow τs) sss 226 | in MatrixV $ fromRows csvList 227 | 228 | partition ∷ 𝐿 Val → 𝐿 (Val ∧ 𝐿 (𝐿 Val)) → 𝐿 (Val ∧ 𝐿 (𝐿 Val)) 229 | partition _ Nil = Nil 230 | partition Nil _ = Nil 231 | partition (k:&ks) (v:&vs) = (k :* partition₁ k (v:&vs)) :& partition ks (v:&vs) 232 | 233 | partition₁ ∷ Val → 𝐿 (Val ∧ 𝐿 (𝐿 Val)) → 𝐿 (𝐿 Val) 234 | partition₁ k Nil = Nil 235 | partition₁ k ((val:*llvals):&vs) = case k ≡ val of 236 | True → llvals ⧺ partition₁ k vs 237 | False → partition₁ k vs 238 | 239 | shapedExMatrix ∷ ∀ m n a. (Rℕ m,Rℕ n) ⇒ Sℕ32 m → Sℕ32 n → ExMatrix a → 𝑂 (Vᴍ m n a) 240 | shapedExMatrix m n (ExMatrix (xs ∷ Vᴍ m' n' a)) = do 241 | Refl ← compareTℕ @ m @ m' 242 | Refl ← compareTℕ @ n @ n' 243 | return xs 244 | 245 | -- | Evaluates an expression from the sensitivity language 246 | seval ∷ (PRIV_C p) ⇒ (Env) → (SExp p) → (Val) 247 | 248 | -- literals 249 | seval _ (ℕSE n) = NatV n 250 | seval _ (ℝSE n) = RealV n 251 | seval _ (ℝˢSE n) = RealV n 252 | seval _ (ℕˢSE n) = NatV n 253 | seval env (RealSE e) = 254 | case (seval env $ extract e) of 255 | (NatV n) → RealV $ dbl n 256 | (RealV n) → RealV n 257 | a → error $ "realSE: unknown type " ⧺ (pprender a) ⧺ " in " ⧺ (pprender e) 258 | 259 | -- variables 260 | seval env (VarSE x) = env ⋕! x 261 | 262 | seval env (LetSE x e₁ e₂) = do 263 | let v₁ = seval env (extract e₁) in 264 | seval ((x ↦ v₁) ⩌ env) (extract e₂) 265 | 266 | -- arithmetic 267 | seval env (PlusSE e₁ e₂) = 268 | case (seval env (extract e₁), seval env (extract e₂)) of 269 | (MatrixV v₁, MatrixV v₂) → MatrixV $ map RealV ( (map urv v₁) +++ (map urv v₂) ) 270 | (RealV v₁, RealV v₂) → RealV (v₁ + v₂) 271 | (NatV v₁, NatV v₂) → NatV (v₁ + v₂) 272 | (a, b) → error $ "No pattern in + for " ⧺ (show𝕊 (a, b)) 273 | 274 | seval env (MinusSE e₁ e₂) = 275 | case (seval env (extract e₁), seval env (extract e₂)) of 276 | (MatrixV v₁, MatrixV v₂) → MatrixV $ map RealV ( (map urv v₁) -/ (map urv v₂) ) 277 | (RealV v₁, RealV v₂) → RealV (v₁ - v₂) 278 | (NatV v₁, NatV v₂) → NatV (v₁ - v₂) 279 | (a, b) → error $ "No pattern for " ⧺ (show𝕊 (a, b)) 280 | 281 | seval env (TimesSE e₁ e₂) = 282 | case (seval env (extract e₁), seval env (extract e₂)) of 283 | (MatrixV v₁, MatrixV v₂) → MatrixV $ map RealV ((map urv v₁) <> (map urv v₂)) 284 | (RealV v₁, MatrixV v₂) → MatrixV $ map RealV (mscale v₁ (map urv v₂)) 285 | (RealV v₁, RealV v₂) → RealV (v₁ × v₂) 286 | (NatV v₁, NatV v₂) → NatV (v₁ × v₂) 287 | (a, b) → error $ "No pattern for " ⧺ (show𝕊 (a, b)) 288 | 289 | seval env (DivSE e₁ e₂) = 290 | case (seval env (extract e₁), seval env (extract e₂)) of 291 | (RealV v₁, RealV v₂) → RealV (v₁ / v₂) 292 | (a, b) → error $ "No pattern for " ⧺ (show𝕊 (a, b)) 293 | 294 | -- matrix operations 295 | seval env (MRowsSE e) = 296 | case (seval env (extract e)) of 297 | (MatrixV v) → 298 | NatV $ nat $ rows v 299 | 300 | seval env (MColsSE e) = 301 | case (seval env (extract e)) of 302 | (MatrixV v) → 303 | NatV $ nat $ cols v 304 | 305 | seval env (MIndexSE e₁ e₂ e₃) = 306 | case (seval env (extract e₁),seval env (extract e₂),seval env (extract e₃)) of 307 | (MatrixV (ExMatrix v), NatV n₁, NatV n₂) → 308 | case (d𝕚 (xrows v) (natΩ32 n₁),d𝕚 (xcols v) (natΩ32 n₂)) of 309 | (Some (n₁' ∷ 𝕀32 m),Some (n₂' ∷ 𝕀32 n)) → v 𝄪 (n₁',n₂') 310 | _ → error "matrix index out of bounds" 311 | (a, b, c) → error $ "Mindex fail: " ⧺ (pprender (e₁ :* a :* b :* c)) 312 | 313 | -- clip operation for only L2 norm 314 | seval env (MClipSE norm e) = 315 | case seval env $ extract e of 316 | MatrixV (ExMatrix m) → 317 | MatrixV 318 | $ ExMatrix 319 | $ xmap RealV 320 | $ xmeld (xcols m) 321 | $ xmap normalize 322 | $ xsplit 323 | $ xmap urv m 324 | _ → error $ "cannot mclip a not matrix" 325 | 326 | -- gradient 327 | seval env (MLipGradSE LR e₁ e₂ e₃) = 328 | case (seval env (extract e₁), seval env (extract e₂), seval env (extract e₃)) of 329 | (MatrixV (ExMatrix (θ ∷ Vᴍ m₁ n₁ Val)), MatrixV (ExMatrix (xs ∷ Vᴍ m₂ n₂ Val)), MatrixV (ExMatrix (ys ∷ Vᴍ m₃ n₃ Val))) → 330 | case (compareTℕ @ m₁ @ 1,compareTℕ @ n₃ @ 1,compareTℕ @ n₁ @ n₂,compareTℕ @ m₂ @ m₃) of 331 | (Some Refl,Some Refl,Some Refl,Some Refl) → 332 | let θ' = map urv θ 333 | xs' = map urv xs 334 | ys' = map urv ys 335 | in MatrixV $ ExMatrix $ map RealV $ xgradient θ' xs' ys' 336 | _ → error "seval MLipGradSE : bad stuff happened" 337 | 338 | -- create matrix 339 | seval env (MCreateSE l e₁ e₂ ix jx e₃) = 340 | case (seval env (extract e₁), seval env (extract e₂)) of 341 | (NatV v₁, NatV v₂) → 342 | d𝕟32 (natΩ32 v₁) $ \ (m ∷ Sℕ32 m) → 343 | d𝕟32 (natΩ32 v₂) $ \ (n ∷ Sℕ32 n) → 344 | MatrixV $ ExMatrix $ matrix m n $ \ i j → 345 | seval ((ix ↦ NatV (nat $ un𝕀32 i)) ⩌ (jx ↦ NatV (nat $ un𝕀32 j)) ⩌ env) $ extract e₃ 346 | 347 | seval env (MFoldSE e₁ e₂ x₁ x₂ e₃) = 348 | case (seval env (extract e₁),seval env (extract e₂)) of 349 | (v₁, MatrixV (ExMatrix v₂)) → 350 | fold v₁ (\b a → (seval ((x₁ ↦ a) ⩌ (x₂ ↦ b) ⩌ env) (extract e₃))) $ iter $ map (MatrixV ∘ ExMatrix) $ xsplit v₂ 351 | 352 | -- matrix maps 353 | seval env (MMapSE e₁ x e₂) = 354 | case (seval env (extract e₁)) of 355 | (MatrixV v₁) → 356 | MatrixV $ map (\a → (seval ((x ↦ a) ⩌ env) (extract e₂))) v₁ 357 | 358 | seval env (MMap2SE e₁ e₂ x₁ x₂ e₃) = 359 | case (seval env (extract e₁),seval env (extract e₂)) of 360 | (MatrixV v₁, MatrixV v₂) → case v₁ of 361 | ExMatrix (xs ∷ Vᴍ m n Val) → case shapedExMatrix (xrows xs) (xcols xs) v₂ of 362 | None → error "bad dimensions" 363 | Some (ys ∷ Vᴍ m n Val) → 364 | let fn = (\a b → (seval ((x₂ ↦ b) ⩌ ((x₁ ↦ a) ⩌ env)) (extract e₃))) 365 | c = xmap2 fn xs ys 366 | in MatrixV $ ExMatrix c 367 | 368 | seval env (MMapColSE e₁ x e₂) = 369 | case (seval env (extract e₁)) of 370 | (MatrixV (ExMatrix v₁)) → 371 | MatrixV $ ExMatrix $ map (\a → (seval ((x ↦ (MatrixV (ExMatrix a))) ⩌ env) (extract e₂))) (xcolsplit v₁) 372 | 373 | -- functions and application 374 | seval env (PFunSE _ args body) = 375 | PFunV (map fst args) (ExPriv (Ex_C (extract body))) env 376 | 377 | seval env (SFunSE _ x _ body) = 378 | SFunV x (ExPriv (Ex_C (extract body))) env 379 | 380 | seval env (BoxSE e) = seval env (extract e) 381 | 382 | seval env (UnboxSE e) = seval env (extract e) 383 | 384 | seval env TrueSE = BoolV True 385 | 386 | seval env FalseSE = BoolV False 387 | 388 | seval env (AppSE e₁ _ e₂) = 389 | case seval env (extract e₁) of 390 | (SFunV x (ExPriv (Ex_C body)) env') → 391 | let env'' = (x ↦ (seval env (extract e₂))) ⩌ env' 392 | in seval env'' body 393 | 394 | seval env (SetSE es) = SetV $ pow $ map ((seval env) ∘ extract) es 395 | 396 | seval env (TupSE e₁ e₂) = PairV $ seval env (extract e₁) :* seval env (extract e₂) 397 | 398 | seval env (MemberSE e₁ e₂) = case (seval env (extract e₁), seval env (extract e₂)) of 399 | (v, SetV p) → BoolV $ v ∈ p 400 | 401 | seval env (UnionAllSE e) = case (seval env (extract e)) of 402 | (SetV ss) → SetV $ fold pø (∪) $ pmap (\(SetV p) → p) ss 403 | 404 | seval env (JoinSE e₁ e₂ e₃ e₄) = 405 | case (seval env (extract e₁),seval env (extract e₂),seval env (extract e₃),seval env (extract e₄)) of 406 | (MatrixV m₁, NatV n₁, MatrixV m₂, NatV n₂) → 407 | let colmaps = map (\row₁ → joinMatch₁ n₁ (fromRows (list [row₁])) (map (\l → (fromRows (list [l]))) (toRows m₂)) n₂) (toRows m₁) 408 | colmaps₁ = filter (\colmap → not (colmap ≡ Nil)) $ colmaps 409 | in MatrixV $ fromRows $ list colmaps₁ 410 | 411 | seval env (EqualsSE e₁ e₂) = 412 | let v₁ = seval env $ extract e₁ 413 | v₂ = seval env $ extract e₂ 414 | in BoolV $ v₁ ≡ v₂ 415 | 416 | seval env (IdxSE e) = seval env $ extract e 417 | 418 | seval env (DiscSE e) = seval env $ extract e 419 | 420 | seval env (ConvSE e) = seval env $ extract e 421 | 422 | seval env (MFilterSE e₁ x e₂) = 423 | case (seval env (extract e₁)) of 424 | MatrixV m → do 425 | let boolVals ∷ 𝐿 (Val ∧ (𝐿 Val)) = map (\row → (seval ((x ↦ MatrixV (fromRows (list [row]))) ⩌ env) (extract e₂)) :* row) (toRows m) 426 | let filtered = filter (\val → case val of 427 | (BoolV v :* result) → v) 428 | boolVals 429 | let final = map snd filtered 430 | let finalM = MatrixV $ fromRows $ list final 431 | finalM 432 | _ → error $ "Error in mfilterSE" 433 | 434 | 435 | seval env e = error $ "Unknown expression: " ⧺ (show𝕊 e) 436 | 437 | -- | Evaluates an expression from the privacy language 438 | peval ∷ (PRIV_C p) ⇒ Env → PExp p → IO (Val) 439 | 440 | -- bind and application 441 | peval env (BindPE x e₁ e₂) = do 442 | v₁ ← peval env (extract e₁) 443 | v₂ ← peval ((x ↦ v₁) ⩌ env) (extract e₂) 444 | return v₂ 445 | 446 | peval env (IfPE e₁ e₂ e₃) = case seval env (extract e₁) of 447 | BoolV True → peval env (extract e₂) 448 | BoolV False → peval env (extract e₃) 449 | 450 | peval env (AppPE e₁ _ e₂s) = 451 | let f = seval env (extract e₁) in 452 | case f of 453 | (PFunV xs (ExPriv (Ex_C body)) env') → 454 | let args = map (seval env ∘ extract) e₂s in 455 | let env'' = (assoc $ zip xs args) ⩌ env' in 456 | peval env'' body 457 | _ → error $ "AppPE: invalid function: " ⧺ (pprender f) 458 | -- let env'' = (x ↦ (seval env (extract e₂))) ⩌ env' 459 | -- in seval env'' body 460 | 461 | -- sample on two matrices and compute on sample 462 | peval env (EDSamplePE size xs ys x y e) = 463 | case (seval env (extract size), seval env (extract xs), seval env (extract ys)) of 464 | (NatV n, MatrixV v1, MatrixV v2) → case v1 of 465 | ExMatrix (xs ∷ Vᴍ m n Val) → case shapedExMatrix (xrows xs) (s𝕟32 @ 1) v2 of 466 | None → error "bad dimensions" 467 | Some (ys ∷ Vᴍ m 1 Val) → 468 | (d𝕟32 (natΩ32 n) (\n₁ → sampleHelper n₁ (map urv xs) (map urv ys) x y (extract e) env)) 469 | 470 | peval env (TCSamplePE size xs ys x y e) = 471 | case (seval env (extract size), seval env (extract xs), seval env (extract ys)) of 472 | (NatV n, MatrixV v1, MatrixV v2) → case v1 of 473 | ExMatrix (xs ∷ Vᴍ m n Val) → case shapedExMatrix (xrows xs) (s𝕟32 @ 1) v2 of 474 | None → error "bad dimensions" 475 | Some (ys ∷ Vᴍ m 1 Val) → 476 | (d𝕟32 (natΩ32 n) (\n₁ → sampleHelper n₁ (map urv xs) (map urv ys) x y (extract e) env)) 477 | 478 | peval env (RenyiSamplePE size xs ys x y e) = 479 | case (seval env (extract size), seval env (extract xs), seval env (extract ys)) of 480 | (NatV n, MatrixV v1, MatrixV v2) → case v1 of 481 | ExMatrix (xs ∷ Vᴍ m n Val) → case shapedExMatrix (xrows xs) (s𝕟32 @ 1) v2 of 482 | None → error "bad dimensions" 483 | Some (ys ∷ Vᴍ m 1 Val) → 484 | (d𝕟32 (natΩ32 n) (\n₁ → sampleHelper n₁ (map urv xs) (map urv ys) x y (extract e) env)) 485 | 486 | -- gaussian mechanism for real numbers 487 | peval env (GaussPE r (EDGaussParams ε δ) vs e) = 488 | case (seval env (extract r), seval env (extract ε), seval env (extract δ), seval env (extract e)) of 489 | (RealV r', RealV ε', RealV δ', RealV v) → do 490 | r ← gaussianNoise zero (r' × (root $ 2.0 × (log $ 1.25/δ')) / ε') 491 | return $ RealV $ v + r 492 | (a, b, c, d) → error $ "No pattern for: " ⧺ (show𝕊 (a,b,c,d)) 493 | 494 | -- laplace mechanism for real numbers 495 | peval env (LaplacePE r (EpsLaplaceParams ε) vs e) = 496 | case (seval env (extract r), seval env (extract ε), seval env (extract e)) of 497 | (RealV r', RealV ε', RealV v) → do 498 | r ← laplaceNoise (r' / ε') 499 | return $ RealV $ v + r 500 | (a, b, c) → error $ "No pattern for: " ⧺ (show𝕊 (a,b,c)) 501 | 502 | -- gaussian mechanism for matrices 503 | peval env (MGaussPE r (EDGaussParams ε δ) vs e) = 504 | case (seval env (extract r), seval env (extract ε), seval env (extract δ), seval env (extract e)) of 505 | (RealV r', RealV ε', RealV δ', MatrixV (ExMatrix mat)) → do 506 | let σ = (r' × (root $ 2.0 × (log $ 1.25/δ')) / ε') 507 | let mat' = map urv mat 508 | mat'' ← xumapM (\val → gaussianNoise val σ) mat' 509 | let r = MatrixV $ ExMatrix $ (map RealV $ xvirt mat'') 510 | return r 511 | (a, b, c, d) → error $ "No pattern for: " ⧺ (show𝕊 (a,b,c,d)) 512 | 513 | peval env (MGaussPE r (RenyiGaussParams α ϵ) vs e) = 514 | case (seval env (extract r), seval env (extract α), seval env (extract ϵ), seval env (extract e)) of 515 | (RealV r', NatV α', RealV ϵ', MatrixV mat) → do 516 | let σ = (r' × (root (dbl α'))) / (root (2.0 × ϵ')) 517 | mat' ← mapM (\row → mapM (\val → gaussianNoise val σ) row) $ toRows (map urv mat) 518 | return $ MatrixV $ (map RealV (fromRows mat')) 519 | (a, b, c, d) → error $ "No pattern for: " ⧺ (show𝕊 (a,b,c,d)) 520 | 521 | peval env (MGaussPE r (TCGaussParams ρ ω) vs e) = 522 | case (seval env (extract r), seval env (extract ρ), seval env (extract ω), seval env (extract e)) of 523 | (RealV r', RealV ρ', NatV ω', MatrixV mat) → do 524 | gn ← gaussianNoise 0.0 ((8.0 × r' × r') / ρ') 525 | let a = 8.0 × r' × (dbl ω') 526 | let σ = a × (arsinh $ (1.0 / a) × gn) 527 | mat' ← mapM (\row → mapM (\val → gaussianNoise val σ) row) $ toRows (map urv mat) 528 | return $ MatrixV $ (map RealV (fromRows mat')) 529 | (a, b, c, d) → error $ "No pattern for: " ⧺ (show𝕊 (a,b,c,d)) 530 | 531 | -- evaluate finite iteration 532 | peval env (LoopPE k init xs x₁ x₂ e) = 533 | case (seval env (extract k), seval env (extract init)) of 534 | (NatV k', initV) → 535 | iter₁ k' initV x₁ x₂ 0 (extract e) env 536 | 537 | peval env (EDLoopPE _ k init xs x₁ x₂ e) = 538 | case (seval env (extract k), seval env (extract init)) of 539 | (NatV k', initV) → 540 | iter₁ k' initV x₁ x₂ 0 (extract e) env 541 | 542 | peval env (ParallelPE e₀ e₁ x₂ e₂ x₃ x₄ e₃) = 543 | case (seval env (extract e₀), seval env (extract e₁)) of 544 | (MatrixV m, SetV p) → do 545 | let candidates ∷ 𝐿 (Val ∧ 𝐿 (𝐿 Val)) = map (\row → (seval ((x₂ ↦ MatrixV (fromRows (list [row]))) ⩌ env) (extract e₂)) :* (list [row])) (toRows m) 546 | let partitions = map (\x → x :* (concat $ map snd $ filter (\y → (fst y) ≡ x) candidates)) 547 | (uniques p) 548 | let evalPart (name :* llvals) = evalOnePart name $ MatrixV (fromRows llvals) 549 | evalOnePart v m = (peval ((x₃ ↦ v) ⩌ (x₄ ↦ m) ⩌ env) (extract e₃)) 550 | r ← pow ^$ mapM evalPart partitions 551 | return $ SetV $ r 552 | 553 | -- evaluate sensitivity expression and return in the context of the privacy language 554 | peval env (ReturnPE e) = 555 | return $ seval env (extract e) 556 | 557 | peval env (ExponentialPE se (EDExponentialParams εe) xse _ x body) = 558 | case (seval env (extract se), seval env (extract εe), seval env (extract xse)) of 559 | (RealV s, RealV ε, MatrixV (ExMatrix (xs ∷ Vᴍ m n Val))) → case compareTℕ @ m @ 1 of 560 | None → error "bad matrix shape not 1 in exponential" 561 | Some Refl → do 562 | i ← exponentialHelper env s ε xs x $ extract body 563 | return $ NatV i 564 | 565 | -- error 566 | peval env e = error $ "Unknown expression: " ⧺ (show𝕊 e) 567 | 568 | exponentialHelper ∷ ∀ p m n. (PRIV_C p,Rℕ n) ⇒ (𝕏 ⇰ Val) → 𝔻 → 𝔻 → Vᴍ 1 n Val → 𝕏 → SExp p → IO ℕ 569 | exponentialHelper env s ε xs x body = do 570 | let scores = map (\ x' → urv $ seval ((x ↦ x') ⩌ env) body) xs 571 | δ = 1e-5 572 | σ = (s × (root $ 2.0 × (log $ 1.25/δ)) / ε) 573 | scores' ← xumapM (\score → gaussianNoise score σ) scores 574 | let rM = firstMaxByLT ((<) `on` snd) $ withIndex scores' 575 | return $ case rM of 576 | None → error "exponential on empty thing" 577 | Some r → fst r 578 | 579 | -- | Helper function for loop expressions 580 | iter₁ ∷ (PRIV_C p) ⇒ ℕ → Val → 𝕏 → 𝕏 → ℕ → PExp p → Env → IO (Val) 581 | iter₁ 0 v _ _ _ _ _ = return v 582 | iter₁ k v t x kp body env = do 583 | newVal ← peval ((x ↦ v) ⩌ ((t ↦ (NatV $ nat kp)) ⩌ env)) body 584 | iter₁ (k - 1) newVal t x (kp+1) body env 585 | 586 | -- | Samples a normal distribution and returns a single value 587 | gaussianNoise ∷ 𝔻 → 𝔻 → IO 𝔻 588 | gaussianNoise c v = normalIO'(c, v) 589 | 590 | laplaceNoise ∷ 𝔻 → IO 𝔻 591 | laplaceNoise scale = do 592 | gen ← createSystemRandom 593 | u ← uniformR (neg 0.5, 0.5) gen 594 | return $ neg $ scale × (signum u) × log(1.0 - 2.0 × (abs u)) 595 | 596 | -- -- | Helper function for PSampleE 597 | sampleHelper :: (PRIV_C p, Rℕ o) ⇒ Sℕ32 o → Vᴍ m n 𝔻 → Vᴍ m 1 𝔻 → 𝕏 → 𝕏 → PExp p → Env → IO Val 598 | sampleHelper n xs ys x y e env = do 599 | batch <- minibatch n xs ys 600 | peval (insertDataSet env (x :* y) ((fst batch) :* (snd batch))) e 601 | 602 | randIndex ∷ GenIO → Sℕ32 m → IO (𝕀32 m) 603 | randIndex gen n = do 604 | x ← uniformR (zero, unSℕ32 n - 𝕟32 1) gen 605 | return $ d𝕟32 x $ \ x' → 𝕀32 x' TRUSTME_LT 606 | 607 | -- -- | Generates random indicies for sampling 608 | randIndices ∷ (Rℕ m) ⇒ GenIO → Sℕ32 m → Sℕ32 n → IO (Vᴍ 1 m (𝕀32 n)) 609 | randIndices gen m n = map xvirt $ xbmapM (\ () → randIndex gen n) $ xconst (s𝕟32 @ 1) m () 610 | 611 | -- | Outputs a single minibatch of data 612 | minibatch :: (Rℕ o) ⇒ Sℕ32 o → Vᴍ m n 𝔻 → Vᴍ m 1 𝔻 → IO (Vᴍ o n 𝔻 ∧ Vᴍ o 1 𝔻) 613 | minibatch batchSize xs@(Vᴍ _ _ _) ys@(Vᴍ _ _ _) = do 614 | gen <- createSystemRandom 615 | idxs <- randIndices gen batchSize (xrows xs) 616 | return (xindirect xs idxs :* xindirect ys idxs) 617 | 618 | insertDataSet ∷ Env → (𝕏 ∧ 𝕏) → (Vᴍ o n 𝔻 ∧ Vᴍ o 1 𝔻) → Env 619 | insertDataSet env (x :* y) (xs@(Vᴍ _ _ _) :* ys@(Vᴍ _ _ _)) = 620 | (x ↦ (MatrixV $ ExMatrix $ map RealV xs)) ⩌ (y ↦ (MatrixV $ ExMatrix $ map RealV ys)) ⩌ env 621 | 622 | -- | Obtains a vector in the same direction with L2-norm=1 623 | normalize ::Vᴍ 1 m 𝔻 → Vᴍ 1 m 𝔻 624 | normalize v 625 | | r > 1.0 = xmap (\ x → x / r) v 626 | | otherwise = v 627 | where 628 | r = norm_2 v 629 | 630 | -- | Makes a single prediction 631 | predict ∷ Model → (DuetVector 𝔻 ∧ 𝔻) → 𝔻 632 | predict θ (x :* _y) = signum $ x <.> θ 633 | 634 | -- dot product 635 | (<.>) :: DuetVector 𝔻 → DuetVector 𝔻 → 𝔻 636 | (<.>) a b = sum $ zipWith (×) a b 637 | 638 | signum ∷ (Ord a, Zero a, Zero p, Minus p, One p) ⇒ a → p 639 | signum x = case compare x zero of 640 | LT → neg one 641 | EQ → zero 642 | GT → one 643 | 644 | abs ∷ (Ord p, Zero p, Minus p) ⇒ p → p 645 | abs x = case compare x zero of 646 | LT → neg x 647 | EQ → zero 648 | GT → x 649 | 650 | isCorrect ∷ (𝔻 ∧ 𝔻) → (ℕ ∧ ℕ) 651 | isCorrect (prediction :* actual) = unID $ do 652 | return $ case prediction ≡ actual of 653 | True → (1 :* 0) 654 | False → (0 :* 1) 655 | 656 | -- | Calculates the accuracy of a model 657 | accuracy ∷ ExMatrix 𝔻 → DuetVector 𝔻 → Model → (ℕ ∧ ℕ) 658 | accuracy (ExMatrix x) y θ = 659 | let x' = xlist2 $ xmeld (xcols x) $ xmap normalize $ xsplit x 660 | pairs ∷ 𝐿 (DuetVector 𝔻 ∧ 𝔻) = list $ zip x' y 661 | labels ∷ 𝐿 𝔻 = map (predict θ) pairs 662 | correct ∷ 𝐿 (ℕ ∧ ℕ) = map isCorrect $ list $ zip labels y 663 | in fold (0 :* 0) (\a b → ((fst a + fst b) :* (snd a + snd b))) correct 664 | -------------------------------------------------------------------------------- /src/Duet/Pretty.hs: -------------------------------------------------------------------------------- 1 | module Duet.Pretty where 2 | 3 | import UVMHS 4 | 5 | import Duet.Syntax 6 | import Duet.Quantity 7 | 8 | instance (Pretty e) ⇒ Pretty (Quantity e) where 9 | pretty Zero = ppKeyPun "⊥" 10 | pretty (Quantity e) = pretty e 11 | pretty Inf = ppKeyPun "⊤" 12 | 13 | instance (Pretty r) ⇒ Pretty (RowsT r) where 14 | pretty = \case 15 | RexpRT r → pretty r 16 | StarRT → ppKeyPun "★" 17 | 18 | instance (Pretty r) ⇒ Pretty (MExp r) where 19 | pretty = \case 20 | EmptyME → ppKeyPun "[]" 21 | VarME x → pretty x 22 | ConsME τ m → ppAtLevel 6 $ ppSeparated $ list 23 | [ ppAlign $ pretty τ 24 | , ppKeyPun "∷" 25 | , ppAlign $ pretty m 26 | ] 27 | AppendME n m → ppAtLevel 3 $ ppSeparated $ list 28 | [ ppAlign $ pretty n 29 | , ppKeyPun "⧺" 30 | , ppBump $ ppAlign $ pretty m 31 | ] 32 | RexpME r τ → ppAtLevel 8 $ ppSeparated $ list 33 | [ ppAlign $ pretty r 34 | , ppKeyPun "⋅" 35 | , ppAlign $ pretty τ 36 | ] 37 | 38 | instance Pretty Kind where 39 | pretty = \case 40 | ℕK → ppKeyPun "ℕ" 41 | ℝK → ppKeyPun "ℝ⁺" 42 | TypeK → ppKeyPun "☆K" 43 | 44 | 45 | instance Pretty Norm where 46 | pretty = \case 47 | L1 → ppKeyPun "L1" 48 | L2 → ppKeyPun "L2" 49 | LInf → ppKeyPun "L∞" 50 | 51 | instance Pretty Clip where 52 | pretty = \case 53 | NormClip ℓ → pretty ℓ 54 | UClip → ppKeyPun "U" 55 | 56 | deriving instance (Pretty r) ⇒ Pretty (Sens r) 57 | 58 | instance (Pretty r) ⇒ Pretty (Pr p r) where 59 | pretty = \case 60 | EpsPriv r → pretty r 61 | EDPriv r₁ r₂ → pretty $ pretty r₁ :* pretty r₂ 62 | RenyiPriv r₁ r₂ → pretty $ pretty r₁ :* pretty r₂ 63 | ZCPriv r → pretty r 64 | TCPriv r₁ r₂ → pretty $ pretty r₁ :* pretty r₂ 65 | 66 | deriving instance (Pretty r) ⇒ Pretty (Priv p r) 67 | 68 | instance (Pretty r) ⇒ Pretty (Type r) where 69 | pretty = \case 70 | ℝˢT r → concat[ppKeyPun "ℝ⁺",ppPun "[",pretty r,ppPun "]"] 71 | ℕˢT r → concat[ppKeyPun "ℕ",ppPun "[",pretty r,ppPun "]"] 72 | ℕT → ppKeyPun "ℕ" 73 | ℝT → ppKeyPun "ℝ" 74 | 𝔹T → ppKeyPun "𝔹" 75 | 𝕊T → ppKeyPun "𝕊" 76 | 𝔻T ℝT → ppKeyPun "𝔻 " 77 | 𝕀T r → concat[ppKeyPun "𝕀",ppPun "[",pretty r,ppPun "]"] 78 | 𝔻𝔽T as → ppAtLevel 2 $ ppSeparated $ list 79 | [ ppKeyPun "𝔻𝔽" 80 | , ppPun "[" 81 | , ppAlign $ ppSeparated $ list $ inbetween (ppPun ",") $ mapOn as $ \ (n :* t) → 82 | ppBotLevel $ concat [ppAlign $ ppPun n,ppPun ":",ppAlign $ pretty t] 83 | , ppPun "]" 84 | ] 85 | BagT ℓ c (RecordT as) → ppAtLevel 2 $ ppSeparated $ list 86 | [ ppKeyPun "𝔻𝔽" 87 | , ppPun "[" 88 | , ppAlign $ pretty ℓ 89 | , ppSpace 1 90 | , ppAlign $ pretty c 91 | , ppPun "]" 92 | , ppPun "[" 93 | , ppAlign $ ppSeparated $ list $ inbetween (ppPun ",") $ mapOn as $ \ (n :* t) → 94 | ppBotLevel $ concat [ppAlign $ ppPun n,ppPun ":",ppAlign $ pretty t] 95 | , ppPun "]" 96 | ] 97 | BagT ℓ c τ → ppAtLevel 5 $ ppSeparated $ list 98 | [ ppKeyPun "Bag" 99 | , ppPun "[" 100 | , ppAlign $ pretty ℓ 101 | , ppSpace 1 102 | , ppAlign $ pretty c 103 | , ppPun "]" 104 | , ppBump $ pretty τ 105 | ] 106 | SetT τ → ppAtLevel 5 $ ppSeparated $ list 107 | [ ppKeyPun "℘" 108 | , ppPun "{" 109 | , ppAlign $ pretty τ 110 | , ppPun "}" 111 | ] 112 | 𝔻T τ → ppAtLevel 5 $ ppSeparated $ list 113 | [ ppKeyPun "𝐝" 114 | , ppBump $ pretty τ 115 | ] 116 | RecordT as → ppAtLevel 2 $ ppSeparated $ list 117 | [ ppKeyPun "Record" 118 | , ppPun "[" 119 | , ppAlign $ ppSeparated $ list $ inbetween (ppPun ",") $ mapOn as $ \ (n :* t) → 120 | ppBotLevel $ concat [ppAlign $ ppPun n,ppPun ":",ppAlign $ pretty t] 121 | , ppPun "]" 122 | ] 123 | 𝕄T ℓ c ηₘ ηₙ → ppAtLevel 10 $ ppSeparated $ list 124 | [ concat 125 | [ ppKeyPun "𝕄 " 126 | , ppPun "[" 127 | , ppAlign $ pretty ℓ 128 | , ppPun "," 129 | , ppAlign $ pretty c 130 | , ppPun "|" 131 | , ppAlign $ pretty ηₘ 132 | , ppPun "," 133 | , ppAlign $ pretty ηₙ 134 | , ppPun "]" 135 | ] 136 | ] 137 | τ₁ :+: τ₂ → ppAtLevel 5 $ ppSeparated $ list 138 | [ pretty τ₁ 139 | , ppPun "+" 140 | , ppBump $ pretty τ₂ 141 | ] 142 | τ₁ :×: τ₂ → ppAtLevel 6 $ ppSeparated $ list 143 | [ pretty τ₁ 144 | , ppPun "×" 145 | , ppBump $ pretty τ₂ 146 | ] 147 | τ₁ :&: τ₂ → ppAtLevel 6 $ ppSeparated $ list 148 | [ pretty τ₁ 149 | , ppPun "&" 150 | , ppBump $ pretty τ₂ 151 | ] 152 | (ακs :* τ₁) :⊸: (ς :* τ₂) → ppAtLevel 2 $ ppSeparated $ list 153 | [ concat 154 | [ ppPun "∀" 155 | , ppSpace 1 156 | , ppAlign $ ppSeparated $ list $ inbetween (ppPun ",") $ mapOn ακs $ \ (α :* κ) → 157 | ppBotLevel $ concat [ppAlign $ pretty α,ppPun ":",ppAlign $ pretty κ] 158 | ] 159 | , ppPun "." 160 | , ppBump $ pretty τ₁ 161 | , ppBotLevel $ concat [ppPun "⊸[",ppAlign $ pretty ς,ppPun "]"] 162 | , pretty τ₂ 163 | ] 164 | (ακs :* PArgs τps) :⊸⋆: τ → ppAtLevel 2 $ ppSeparated $ list 165 | [ concat 166 | [ ppPun "∀" 167 | , ppSpace 1 168 | , ppAlign $ ppSeparated $ list $ inbetween (ppPun ",") $ mapOn ακs $ \ (α :* κ) → 169 | ppBotLevel $ concat [ppAlign $ pretty α,ppPun ":",ppAlign $ pretty κ] 170 | ] 171 | , ppSeparated 172 | $ list 173 | $ mapFirst (\ s → ppSeparated $ list [ppPun ".",s]) 174 | $ mapAfterFirst (\ s → ppSeparated $ list [ppPun ",",s]) 175 | $ mapOn τps $ \ (τ' :* p) → 176 | ppBotLevel $ concat [ppAlign $ pretty τ',ppPun "@",ppAlign $ pretty p] 177 | , concat [ppPun "⇒",ppSpace 1,ppAlign $ pretty τ] 178 | ] 179 | BoxedT σ τ → ppAtLevel 5 $ ppSeparated $ list 180 | [ concat [ ppKeyPun "□" , ppPun "[" ] 181 | , ppSeparated $ list $ inbetween (ppPun ",") $ mapOn (iter σ) $ \ (x :* Sens q) → 182 | ppBotLevel $ concat [ppAlign $ pretty x,ppKeyPun "@",ppAlign $ pretty q] 183 | , ppPun "]" 184 | , ppBump $ pretty τ 185 | ] 186 | VarT x → pretty x 187 | -------------------------------------------------------------------------------- /src/Duet/Quantity.hs: -------------------------------------------------------------------------------- 1 | module Duet.Quantity where 2 | 3 | import UVMHS 4 | 5 | import Duet.RNF 6 | 7 | data Quantity a = Zero | Quantity a | Inf 8 | deriving (Eq,Ord,Show) 9 | 10 | makePrisms ''Quantity 11 | 12 | instance (HasPrism a b) ⇒ HasPrism (Quantity a) b where hasPrism = (hasPrism @ a @ b) ⊚ (quantityL @ a) 13 | 14 | instance Zero (Quantity a) where zero = Zero 15 | instance (Plus a) ⇒ Plus (Quantity a) where 16 | Zero + x = x 17 | x + Zero = x 18 | Inf + _ = Inf 19 | _ + Inf = Inf 20 | Quantity x + Quantity y = Quantity $ x + y 21 | instance (Plus a) ⇒ Additive (Quantity a) 22 | 23 | instance (One a) ⇒ One (Quantity a) where one = Quantity one 24 | instance (Times a) ⇒ Times (Quantity a) where 25 | Zero × _ = Zero 26 | _ × Zero = Zero 27 | Inf × _ = Inf 28 | _ × Inf = Inf 29 | Quantity x × Quantity y = Quantity $ x × y 30 | instance (Multiplicative a) ⇒ Multiplicative (Quantity a) 31 | 32 | instance Null (Quantity a) where null = Zero 33 | instance (Append a) ⇒ Append (Quantity a) where 34 | Zero ⧺ x = x 35 | x ⧺ Zero = x 36 | Inf ⧺ _ = Inf 37 | _ ⧺ Inf = Inf 38 | Quantity x ⧺ Quantity y = Quantity $ x ⧺ y 39 | instance Append a ⇒ Monoid (Quantity a) 40 | 41 | instance (Unit a) ⇒ Unit (Quantity a) where unit = Quantity unit 42 | instance (Cross a) ⇒ Cross (Quantity a) where 43 | Zero ⨳ _ = Zero 44 | _ ⨳ Zero = Zero 45 | Inf ⨳ _ = Inf 46 | _ ⨳ Inf = Inf 47 | Quantity x ⨳ Quantity y = Quantity $ x ⨳ y 48 | instance (Prodoid a) ⇒ Prodoid (Quantity a) 49 | 50 | instance Bot (Quantity a) where bot = Zero 51 | instance (Join a) ⇒ Join (Quantity a) where 52 | Zero ⊔ y = y 53 | x ⊔ Zero = x 54 | Inf ⊔ _ = Inf 55 | _ ⊔ Inf = Inf 56 | Quantity x ⊔ Quantity y = Quantity $ x ⊔ y 57 | instance (Join a) ⇒ JoinLattice (Quantity a) 58 | 59 | instance (POrd a) ⇒ POrd (Quantity a) where 60 | Zero ⊑ _ = True 61 | Quantity x ⊑ Quantity y = x ⊑ y 62 | _ ⊑ Inf = True 63 | _ ⊑ _ = False 64 | 65 | instance Top (Quantity a) where top = Inf 66 | instance (Meet a) ⇒ Meet (Quantity a) where 67 | Zero ⊓ _ = Zero 68 | _ ⊓ Zero = Zero 69 | x ⊓ Inf = x 70 | Inf ⊓ y = y 71 | Quantity x ⊓ Quantity y = Quantity $ x ⊓ y 72 | instance (Meet a) ⇒ MeetLattice (Quantity a) 73 | instance (Join a,Meet a) ⇒ Lattice (Quantity a) 74 | 75 | instance Functor Quantity where 76 | map f = \case 77 | Zero → Zero 78 | Quantity x → Quantity $ f x 79 | Inf → Inf 80 | 81 | -- ⌉s′⌈ˢ ≡ truncate s s′ 82 | -- ⌉Σ⌈ˢ ≡ map (Sens ∘ truncate s ∘ unSens) Σ 83 | truncate ∷ Quantity a → Quantity b → Quantity a 84 | truncate _ Zero = Zero 85 | truncate p Inf = p 86 | truncate p (Quantity _) = p 87 | 88 | 89 | 90 | class 91 | (Functor p 92 | ,∀ a. Eq a ⇒ Eq (p a) 93 | ,∀ a. Additive a ⇒ Additive (p a) 94 | ,∀ a. Append a ⇒ Append (p a) 95 | ,∀ a. Join a ⇒ Join (p a) 96 | ) ⇒ Privacy p where 97 | edLoopBounds ∷ RNF → RNF → p RNF → p RNF 98 | loopBounds ∷ RNF → p RNF → p RNF 99 | -------------------------------------------------------------------------------- /src/Duet/RNF.hs: -------------------------------------------------------------------------------- 1 | module Duet.RNF where 2 | 3 | import Duet.UVMHS 4 | 5 | instance Show FullContext where 6 | show = chars ∘ ppshow 7 | 8 | instance Show RExpPre where 9 | show = chars ∘ ppshow 10 | 11 | type RExp = Annotated FullContext RExpPre 12 | data RExpPre = 13 | VarRE 𝕏 14 | | NatRE ℕ 15 | | NNRealRE 𝔻 16 | | MaxRE RExp RExp 17 | | MinRE RExp RExp 18 | | PlusRE RExp RExp 19 | | TimesRE RExp RExp 20 | | DivRE RExp RExp 21 | | RootRE RExp 22 | | ExpRE RExp RExp 23 | | LogRE RExp 24 | | ExpFnRE RExp 25 | | MinusRE RExp RExp 26 | deriving (Eq,Ord) 27 | makePrettySum ''RExpPre 28 | 29 | interpRExp ∷ (𝕏 ⇰ 𝔻) → RExpPre → 𝔻 30 | interpRExp γ = \case 31 | VarRE x → γ ⋕! x 32 | NatRE n → dbl n 33 | NNRealRE r → r 34 | MaxRE e₁ e₂ → interpRExp γ (extract e₁) ⩏ interpRExp γ (extract e₂) 35 | MinRE e₁ e₂ → interpRExp γ (extract e₁) ⩎ interpRExp γ (extract e₂) 36 | PlusRE e₁ e₂ → interpRExp γ (extract e₁) + interpRExp γ (extract e₂) 37 | TimesRE e₁ e₂ → interpRExp γ (extract e₁) × interpRExp γ (extract e₂) 38 | DivRE e₁ e₂ → interpRExp γ (extract e₁) / interpRExp γ (extract e₂) 39 | RootRE e → root $ interpRExp γ $ extract e 40 | ExpRE e₁ e₂ → interpRExp γ (extract e₁) ^ interpRExp γ (extract e₂) 41 | LogRE e → log $ interpRExp γ $ extract e 42 | ExpFnRE e → exp $ interpRExp γ $ extract e 43 | MinusRE e₁ e₂ → interpRExp γ (extract e₁) - interpRExp γ (extract e₂) 44 | 45 | data TLExp r = Type r | RExp 46 | 47 | data RNF = 48 | NatRNF ℕ 49 | | NNRealRNF 𝔻 50 | | SymRNF (𝑃 {- max -} (𝑃 {- min -} RSP)) 51 | deriving (Eq,Ord,Show) 52 | newtype RSP = RSP { unRSP ∷ (RAtom ⇰ {- prod -} ℕ) ⇰ {- sum -} ℕ } 53 | deriving (Eq,Ord,Show) 54 | data RAtom = 55 | NNRealRA 𝔻 56 | | VarRA 𝕏 57 | | InvRA RSP 58 | | RootRA RSP 59 | | ExpRA RSP RSP 60 | | LogRA RSP 61 | | ExpFnRA RSP 62 | | MinusRA RNF RNF 63 | deriving (Eq,Ord,Show) 64 | 65 | makePrisms ''RNF 66 | 67 | instance HasPrism RNF ℕ where hasPrism = natRNFL 68 | instance HasPrism RNF 𝔻 where hasPrism = nNRealRNFL 69 | 70 | ppRAtom ∷ RAtom → Doc 71 | ppRAtom = \case 72 | NNRealRA r → pretty r 73 | VarRA x → pretty x 74 | InvRA e → ppAtLevel 7 $ concat [ppOp "1/",ppRSP e] 75 | RootRA e → ppAtLevel 7 $ concat [ppOp "√",ppRSP e] 76 | ExpRA e₁ e₂ → ppAtLevel 8 $ concat [ppBump $ ppRSP e₁,ppOp "^",ppRSP e₂] 77 | LogRA e → ppAtLevel 7 $ concat [ppOp "㏒",ppRSP e] 78 | ExpFnRA e → ppAtLevel 7 $ concat [ppOp "exp",ppRSP e] 79 | MinusRA e₁ e₂ → ppAtLevel 5 $ concat [ppRNF e₁,ppOp "-",ppBump $ ppRNF e₂] 80 | 81 | ppProd ∷ (RAtom ⇰ ℕ) → Doc 82 | ppProd xs = case list xs of 83 | Nil → pretty 1 84 | (x :* n) :& Nil → 85 | case n ≡ 1 of 86 | True → ppRAtom x 87 | False → ppAtLevel 7 $ concat [ppRAtom x,ppOp "^",pretty n] 88 | _ → ppAtLevel 6 $ concat $ do 89 | (x :* n) ← list xs 90 | return $ 91 | case n ≡ 1 of 92 | True → ppRAtom x 93 | False → ppAtLevel 7 $ concat [ppRAtom x,ppOp "^",pretty n] 94 | 95 | ppSum ∷ (RAtom ⇰ ℕ) ⇰ ℕ → Doc 96 | ppSum xs² = case list xs² of 97 | Nil → pretty 0 98 | (xs :* m) :& Nil → 99 | case m ≡ 1 of 100 | True → ppProd xs 101 | False → ppAtLevel 6 $ concat [pretty m,ppProd xs] 102 | _ → ppAtLevel 5 $ concat $ inbetween (ppOp "+") $ do 103 | (xs :* m) ← list xs² 104 | return $ 105 | case m ≡ 1 of 106 | True → ppProd xs 107 | False → ppAtLevel 6 $ concat [pretty m,ppProd xs] 108 | 109 | ppRSP ∷ RSP → Doc 110 | ppRSP = ppSum ∘ unRSP 111 | 112 | ppMin ∷ 𝑃 RSP → Doc 113 | ppMin xs³ = case list xs³ of 114 | Nil → pretty 0 115 | xs² :& Nil → ppRSP xs² 116 | _ → ppAtLevel 6 $ concat $ inbetween (ppOp "⊓") $ do 117 | xs² ← list xs³ 118 | return $ ppRSP xs² 119 | 120 | ppMax ∷ 𝑃 (𝑃 RSP) → Doc 121 | ppMax xs⁴ = case list xs⁴ of 122 | Nil → ppLit "∞" 123 | xs³ :& Nil → ppMin xs³ 124 | _ → ppAtLevel 5 $ concat $ inbetween (ppOp "⊔") $ do 125 | xs³ ← list xs⁴ 126 | return $ ppMin xs³ 127 | 128 | ppRNF ∷ RNF → Doc 129 | ppRNF = \case 130 | NatRNF n → concat [pretty n] 131 | NNRealRNF r → concat [pretty r] 132 | SymRNF xs⁴ → ppMax xs⁴ 133 | 134 | instance Pretty RNF where pretty = ppRNF 135 | 136 | interpRAtom ∷ (𝕏 ⇰ 𝔻) → RAtom → 𝔻 137 | interpRAtom γ = \case 138 | VarRA x → γ ⋕! x 139 | NNRealRA r → r 140 | InvRA xs² → 1.0 / interpRSP γ xs² 141 | RootRA xs² → root $ interpRSP γ xs² 142 | ExpRA xs² ys² → interpRSP γ xs² ^ interpRSP γ ys² 143 | LogRA xs² → log $ interpRSP γ xs² 144 | ExpFnRA xs² → exp $ interpRSP γ xs² 145 | MinusRA xs⁴ ys⁴ → interpRNF γ xs⁴ - interpRNF γ ys⁴ 146 | 147 | interpRSP ∷ (𝕏 ⇰ 𝔻) → RSP → 𝔻 148 | interpRSP γ xs² = 149 | fold 0.0 (+) $ do 150 | (xs :* m) ← list $ unRSP xs² 151 | let d = fold 1.0 (×) $ do 152 | (x :* n) ← list xs 153 | return $ interpRAtom γ x ^ dbl n 154 | return $ d × dbl m 155 | 156 | interpRNF ∷ (𝕏 ⇰ 𝔻) → RNF → 𝔻 157 | interpRNF γ = \case 158 | NatRNF n → dbl n 159 | NNRealRNF r → r 160 | SymRNF xs⁴ → 161 | fold 0.0 (⩏) $ do 162 | xs³ ← list xs⁴ 163 | return $ fold (1.0/0.0) (⩎) $ do 164 | xs² ← list xs³ 165 | return $ interpRSP γ xs² 166 | 167 | natSymRNF ∷ ℕ → 𝑃 (𝑃 RSP) 168 | natSymRNF n 169 | | n ≤ 0 = pø 170 | | otherwise = single $ single $ RSP $ dø ↦ n 171 | 172 | realSymRNF ∷ 𝔻 → 𝑃 (𝑃 RSP) 173 | realSymRNF r = single $ single $ RSP $ (NNRealRA r ↦ 1) ↦ 1 174 | 175 | binopRNF ∷ 𝑃 RNF → 𝑃 RNF → (ℕ → ℕ → ℕ ∨ 𝔻) → (𝔻 → 𝔻 → 𝔻) → (𝑃 (𝑃 RSP) → 𝑃 (𝑃 RSP) → 𝑃 (𝑃 RSP)) → RNF → RNF → RNF 176 | binopRNF units zeros nop rop rspop ε₁ ε₂ 177 | | ε₁ ∈ units = ε₂ 178 | | ε₂ ∈ units = ε₁ 179 | | ε₁ ∈ zeros = ε₁ 180 | | ε₂ ∈ zeros = ε₂ 181 | | otherwise = case (ε₁,ε₂) of 182 | (NatRNF n₁ ,NatRNF n₂ ) → case nop n₁ n₂ of {Inl n → NatRNF n;Inr r → NNRealRNF r} 183 | (NatRNF n₁ ,NNRealRNF r₂) → NNRealRNF $ rop (dbl n₁) r₂ 184 | (NNRealRNF r₁,NatRNF n₂ ) → NNRealRNF $ rop r₁ $ dbl n₂ 185 | (NatRNF n₁ ,SymRNF ys⁴) → SymRNF $ rspop (natSymRNF n₁) ys⁴ 186 | (SymRNF xs⁴,NatRNF n₂ ) → SymRNF $ rspop xs⁴ $ natSymRNF n₂ 187 | (NNRealRNF r₁,NNRealRNF r₂) → NNRealRNF $ rop r₁ r₂ 188 | (NNRealRNF r₁,SymRNF ys⁴) → SymRNF $ rspop (realSymRNF r₁) ys⁴ 189 | (SymRNF xs⁴,NNRealRNF r₂) → SymRNF $ rspop xs⁴ $ realSymRNF r₂ 190 | (SymRNF xs⁴,SymRNF ys⁴) → SymRNF $ rspop xs⁴ ys⁴ 191 | 192 | varRNF ∷ 𝕏 → RNF 193 | varRNF x = SymRNF $ single $ single $ RSP $ (VarRA x ↦ 1) ↦ 1 194 | 195 | maxRNF ∷ RNF → RNF → RNF 196 | maxRNF = binopRNF (pow [NatRNF 0,NNRealRNF 0.0]) pø (Inl ∘∘ (⩏)) (⩏) $ \ xs⁴ ys⁴ → xs⁴ ∪ ys⁴ 197 | 198 | minRNF ∷ RNF → RNF → RNF 199 | minRNF = binopRNF pø (pow [NatRNF 0,NNRealRNF 0.0]) (Inl ∘∘ (⩎)) (⩎) $ \ xs⁴ ys⁴ → pow $ do 200 | xs³ ← list xs⁴ 201 | ys³ ← list ys⁴ 202 | return $ xs³ ⧺ ys³ 203 | 204 | plusRNF ∷ RNF → RNF → RNF 205 | plusRNF = binopRNF (pow [NatRNF 0,NNRealRNF 0.0]) pø (Inl ∘∘ (+)) (+) $ \ xs⁴ ys⁴ → pow $ do 206 | xs³ ← list xs⁴ 207 | ys³ ← list ys⁴ 208 | return $ pow $ do 209 | xs² ← list xs³ 210 | ys² ← list ys³ 211 | return $ RSP $ unionWith (+) (unRSP xs²) (unRSP ys²) 212 | 213 | timesRNF ∷ RNF → RNF → RNF 214 | timesRNF = binopRNF (pow [NatRNF 1,NNRealRNF 1.0]) (pow [NatRNF 0,NNRealRNF 0.0]) (Inl ∘∘ (×)) (×) $ \ xs⁴ ys⁴ → pow $ do 215 | xs³ ← list xs⁴ 216 | ys³ ← list ys⁴ 217 | return $ pow $ do 218 | xs² ← list xs³ 219 | ys² ← list ys³ 220 | return $ RSP $ dict $ do 221 | (xs :* m) ← list $ unRSP xs² 222 | (ys :* n) ← list $ unRSP ys² 223 | return $ unionWith (+) xs ys ↦ m×n 224 | 225 | invRNF ∷ RNF → RNF 226 | invRNF (NatRNF n) = NNRealRNF $ 1.0 / dbl n 227 | invRNF (NNRealRNF r) = NNRealRNF $ 1.0 / r 228 | invRNF (SymRNF xs⁴) = SymRNF $ pow $ do 229 | xs³ ← cart $ map list $ list xs⁴ 230 | return $ pow $ do 231 | xs² ← xs³ 232 | return $ RSP $ (InvRA xs² ↦ 1) ↦ 1 233 | 234 | rootRNF ∷ RNF → RNF 235 | rootRNF (NatRNF n) = NNRealRNF $ root $ dbl n 236 | rootRNF (NNRealRNF r) = NNRealRNF $ root $ r 237 | rootRNF (SymRNF xs⁴) = SymRNF $ pow $ do 238 | xs³ ← list xs⁴ 239 | return $ pow $ do 240 | xs² ← list xs³ 241 | return $ RSP $ (RootRA xs² ↦ 1) ↦ 1 242 | 243 | expRNF ∷ RNF → RNF → RNF 244 | expRNF (NatRNF n₁) (NatRNF n₂) = NatRNF $ n₁ ^ n₂ 245 | expRNF (NatRNF n₁) (NNRealRNF r₂) = NNRealRNF $ dbl n₁ ^ r₂ 246 | expRNF (NNRealRNF r₁) (NatRNF n₂) = NNRealRNF $ r₁ ^ dbl n₂ 247 | expRNF (NNRealRNF r₁) (NNRealRNF r₂) = NNRealRNF $ r₁ ^ r₂ 248 | expRNF (SymRNF xs⁴) (NatRNF n₂) = SymRNF $ pow $ do 249 | xs³ ← list xs⁴ 250 | return $ pow $ do 251 | xs² ← list xs³ 252 | return $ RSP $ (ExpRA xs² (RSP $ (NNRealRA (dbl n₂) ↦ 1) ↦ 1) ↦ 1) ↦ 1 253 | expRNF (SymRNF xs⁴) (NNRealRNF r₂) = SymRNF $ pow $ do 254 | xs³ ← list xs⁴ 255 | return $ pow $ do 256 | xs² ← list xs³ 257 | return $ RSP $ (ExpRA xs² (RSP $ (NNRealRA r₂ ↦ 1) ↦ 1) ↦ 1) ↦ 1 258 | expRNF (NatRNF n₁) (SymRNF ys⁴) = SymRNF $ pow $ do 259 | ys³ ← list ys⁴ 260 | return $ pow $ do 261 | ys² ← list ys³ 262 | return $ RSP $ (ExpRA (RSP $ (NNRealRA (dbl n₁) ↦ 1) ↦ 1) ys² ↦ 1) ↦ 1 263 | expRNF (NNRealRNF r₁) (SymRNF ys⁴) = SymRNF $ pow $ do 264 | ys³ ← list ys⁴ 265 | return $ pow $ do 266 | ys² ← list ys³ 267 | return $ RSP $ (ExpRA (RSP $ (NNRealRA r₁ ↦ 1) ↦ 1) ys² ↦ 1) ↦ 1 268 | expRNF (SymRNF xs⁴) (SymRNF ys⁴) = SymRNF $ pow $ do 269 | xs³ ← list xs⁴ 270 | ys³ ← list ys⁴ 271 | return $ pow $ do 272 | xs² ← list xs³ 273 | ys² ← list ys³ 274 | return $ RSP $ (ExpRA xs² ys² ↦ 1) ↦ 1 275 | 276 | logRNF ∷ RNF → RNF 277 | logRNF (NatRNF n) = NNRealRNF $ log $ dbl n 278 | logRNF (NNRealRNF r) = NNRealRNF $ log $ r 279 | logRNF (SymRNF xs⁴) = SymRNF $ pow $ do 280 | xs³ ← list xs⁴ 281 | return $ pow $ do 282 | xs² ← list xs³ 283 | return $ RSP $ (LogRA xs² ↦ 1) ↦ 1 284 | 285 | expFnRNF ∷ RNF → RNF 286 | expFnRNF (NatRNF n) = NNRealRNF $ exp $ dbl n 287 | expFnRNF (NNRealRNF r) = NNRealRNF $ exp $ r 288 | expFnRNF (SymRNF xs⁴) = SymRNF $ pow $ do 289 | xs³ ← list xs⁴ 290 | return $ pow $ do 291 | xs² ← list xs³ 292 | return $ RSP $ (ExpFnRA xs² ↦ 1) ↦ 1 293 | 294 | minusRNF ∷ RNF → RNF → RNF 295 | minusRNF xs⁴ ys⁴ = SymRNF $ single $ single $ RSP $ (MinusRA xs⁴ ys⁴ ↦ one) ↦ one 296 | 297 | instance Bot RNF where bot = NatRNF 0 298 | instance Join RNF where (⊔) = maxRNF 299 | instance JoinLattice RNF 300 | 301 | instance Meet RNF where (⊓) = maxRNF 302 | 303 | instance Zero RNF where zero = NatRNF 0 304 | instance Plus RNF where (+) = plusRNF 305 | instance Minus RNF where (-) = minusRNF 306 | instance One RNF where one = NatRNF 1 307 | instance Times RNF where (×) = timesRNF 308 | instance Divide RNF where e₁ / e₂ = e₁ `timesRNF` invRNF e₂ 309 | instance Root RNF where root = rootRNF 310 | instance Log RNF where log = logRNF 311 | 312 | instance Exponential RNF where (^) = expRNF 313 | instance ExponentialFn RNF where exp = expFnRNF 314 | 315 | instance Multiplicative RNF 316 | instance Additive RNF 317 | 318 | instance Null RNF where null = zero 319 | instance Append RNF where (⧺) = (+) 320 | instance Monoid RNF 321 | 322 | instance POrd RNF where 323 | NatRNF n₁ ⊑ NatRNF n₂ = n₁ ≤ n₂ 324 | NatRNF n₁ ⊑ NNRealRNF r₂ = dbl n₁ ≤ r₂ 325 | NNRealRNF r₁ ⊑ NatRNF n₂ = r₁ ≤ dbl n₂ 326 | NatRNF n₁ ⊑ SymRNF ys⁴ = natSymRNF n₁ ⊆ ys⁴ 327 | SymRNF xs⁴ ⊑ NatRNF n₂ = xs⁴ ⊆ natSymRNF n₂ 328 | NNRealRNF r₁ ⊑ NNRealRNF r₂ = r₁ ≤ r₂ 329 | NNRealRNF r₁ ⊑ SymRNF ys⁴ = realSymRNF r₁ ⊆ ys⁴ 330 | SymRNF xs⁴ ⊑ NNRealRNF r₂ = xs⁴ ⊆ realSymRNF r₂ 331 | SymRNF xs⁴ ⊑ SymRNF ys⁴ = xs⁴ ⊆ ys⁴ 332 | 333 | normalizeRExpPre ∷ RExpPre → RNF 334 | normalizeRExpPre (VarRE x) = varRNF x 335 | normalizeRExpPre (NatRE n) = NatRNF n 336 | normalizeRExpPre (NNRealRE r) = NNRealRNF r 337 | normalizeRExpPre (MaxRE e₁ e₂) = maxRNF (normalizeRExpPre $ extract e₁) (normalizeRExpPre $ extract e₂) 338 | normalizeRExpPre (MinRE e₁ e₂) = minRNF (normalizeRExpPre $ extract e₁) (normalizeRExpPre $ extract e₂) 339 | normalizeRExpPre (PlusRE e₁ e₂) = plusRNF (normalizeRExpPre $ extract e₁) (normalizeRExpPre $ extract e₂) 340 | normalizeRExpPre (TimesRE e₁ e₂) = timesRNF (normalizeRExpPre $ extract e₁) (normalizeRExpPre $ extract e₂) 341 | normalizeRExpPre (DivRE e₁ e₂) = timesRNF (normalizeRExpPre $ extract e₁) $ invRNF (normalizeRExpPre $ extract e₂) 342 | normalizeRExpPre (RootRE e) = rootRNF (normalizeRExpPre $ extract e) 343 | normalizeRExpPre (ExpRE e₁ e₂) = expRNF (normalizeRExpPre $ extract e₁) (normalizeRExpPre $ extract e₂) 344 | normalizeRExpPre (LogRE e) = logRNF (normalizeRExpPre $ extract e) 345 | normalizeRExpPre (ExpFnRE e) = expFnRNF (normalizeRExpPre $ extract e) 346 | normalizeRExpPre (MinusRE e₁ e₂) = minusRNF (normalizeRExpPre $ extract e₁) (normalizeRExpPre $ extract e₂) 347 | 348 | normalizeRExp ∷ RExp → RNF 349 | normalizeRExp = normalizeRExpPre ∘ extract 350 | 351 | -- RENAMING AND SUBSTITUTION -- 352 | 353 | -- Renaming Variables -- 354 | 355 | renaming ∷ 𝑃 𝕏 → 𝑃 𝕏 → 𝕏 ⇰ 𝕏 356 | renaming 𝓈 fv = 357 | let xs = 𝓈 ∩ fv 358 | mn = fold None (⩎) $ map 𝕩Gen $ iter xs 359 | mn' = elim𝑂 0 (+1) mn 360 | ns = map (\ x → x + mn') $ naturals 361 | in assoc $ zip xs $ zipWith (\ (𝕏 x _) n → 𝕏 x $ Some n) xs ns 362 | 363 | renameRNF ∷ 𝕏 ⇰ 𝕏 → RNF → RNF 364 | renameRNF ρ = foldFrom ρ $ \ (x :* x') → substRNF x (varRNF x') 365 | 366 | -- Free variables -- 367 | 368 | fvRAtom ∷ RAtom → 𝑃 𝕏 369 | fvRAtom = \case 370 | VarRA x → single x 371 | NNRealRA _ → pø 372 | InvRA xs² → fvRSP xs² 373 | RootRA xs² → fvRSP xs² 374 | ExpRA xs² ys² → fvRSP xs² ∪ fvRSP ys² 375 | LogRA xs² → fvRSP xs² 376 | ExpFnRA xs² → fvRSP xs² 377 | MinusRA xs⁴ ys⁴ → fvRNF xs⁴ ∪ fvRNF ys⁴ 378 | 379 | fvRSP ∷ RSP → 𝑃 𝕏 380 | fvRSP xs² = pow $ do 381 | (xs :* _) ← list $ unRSP xs² 382 | (a :* _) ← list xs 383 | list $ fvRAtom a 384 | 385 | fvRNF ∷ RNF → 𝑃 𝕏 386 | fvRNF = \case 387 | NatRNF _ → pø 388 | NNRealRNF _ → pø 389 | SymRNF xs⁴ → pow $ do 390 | xs³ ← list xs⁴ 391 | xs² ← list xs³ 392 | list $ fvRSP xs² 393 | 394 | -- Substitution -- 395 | 396 | natExpRNF ∷ RNF → ℕ → RNF 397 | natExpRNF e n 398 | | n ≡ 0 = NatRNF 1 399 | | otherwise = e `timesRNF` natExpRNF e (n - 1) 400 | 401 | substRAtom ∷ 𝕏 → RNF → RAtom → RNF 402 | substRAtom x r' = \case 403 | VarRA y → case x ≡ y of 404 | True → r' 405 | False → varRNF y 406 | NNRealRA r → NNRealRNF r 407 | InvRA xs² → invRNF $ substRSP x r' xs² 408 | RootRA xs² → rootRNF $ substRSP x r' xs² 409 | ExpRA xs² ys² → expRNF (substRSP x r' xs²) (substRSP x r' ys²) 410 | LogRA xs² → logRNF $ substRSP x r' xs² 411 | ExpFnRA xs² → expFnRNF $ substRSP x r' xs² 412 | MinusRA xs⁴ ys⁴ → minusRNF (substRNF x r' xs⁴) (substRNF x r' ys⁴) 413 | 414 | substRSP ∷ 𝕏 → RNF → RSP → RNF 415 | substRSP x r' xs² = 416 | fold (NatRNF 0) plusRNF $ do 417 | (xs :* m) ← list $ unRSP xs² 418 | return $ (NatRNF m `timesRNF`) $ fold (NatRNF 1) timesRNF $ do 419 | (a :* n) ← list xs 420 | return $ substRAtom x r' a `natExpRNF` n 421 | 422 | substRNF ∷ 𝕏 → RNF → RNF → RNF 423 | substRNF x r' = \case 424 | NatRNF n → NatRNF n 425 | NNRealRNF r → NNRealRNF r 426 | SymRNF xs⁴ → fold (NatRNF 0) maxRNF $ do 427 | xs³ ← list xs⁴ 428 | case list xs³ of 429 | Nil → return $ NNRealRNF (1.0/0.0) 430 | xs² :& xs³' → return $ fold (substRSP x r' xs²) minRNF $ do 431 | xs²' ← list xs³' 432 | return $ substRSP x r' xs²' 433 | -------------------------------------------------------------------------------- /src/Duet/Syntax.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE PartialTypeSignatures #-} 2 | module Duet.Syntax where 3 | 4 | import Duet.UVMHS 5 | 6 | import Duet.Quantity 7 | import Duet.RNF 8 | 9 | data Kind = 10 | ℕK 11 | | ℝK 12 | | TypeK 13 | deriving (Eq,Ord,Show) 14 | 15 | instance POrd Kind where 16 | ℕK ⊑ ℕK = True 17 | ℕK ⊑ ℝK = True 18 | ℝK ⊑ ℝK = True 19 | _ ⊑ _ = False 20 | 21 | data Norm = L1 | L2 | LInf 22 | deriving (Eq,Ord,Show) 23 | 24 | data Clip = NormClip Norm | UClip 25 | deriving (Eq,Ord,Show) 26 | 27 | newtype Sens r = Sens { unSens ∷ Quantity r } 28 | deriving 29 | (Eq,Ord,Show,Functor 30 | ,Zero,Plus,Additive 31 | ,One,Times,Multiplicative 32 | ,Null,Append,Monoid 33 | ,Unit,Cross,Prodoid 34 | ,POrd 35 | ,Bot,Join,JoinLattice 36 | ,Top,Meet,MeetLattice 37 | ,Lattice) 38 | 39 | instance (HasPrism (Quantity r) s) ⇒ HasPrism (Sens r) s where 40 | hasPrism = Prism 41 | { construct = Sens ∘ construct hasPrism 42 | , view = view hasPrism ∘ unSens 43 | } 44 | 45 | data PRIV = EPS | ED | RENYI | ZC | TC 46 | deriving (Eq,Ord,Show) 47 | 48 | data PRIV_W (p ∷ PRIV) where 49 | EPS_W ∷ PRIV_W 'EPS 50 | ED_W ∷ PRIV_W 'ED 51 | RENYI_W ∷ PRIV_W 'RENYI 52 | ZC_W ∷ PRIV_W 'ZC 53 | TC_W ∷ PRIV_W 'TC 54 | 55 | eqPRIV ∷ PRIV_W p₁ → PRIV_W p₂ → 𝑂 (p₁ ≟ p₂) 56 | eqPRIV p₁ p₂ = case (p₁,p₂) of 57 | (EPS_W,EPS_W) → Some Refl 58 | (ED_W,ED_W) → Some Refl 59 | (RENYI_W,RENYI_W) → Some Refl 60 | (ZC_W,ZC_W) → Some Refl 61 | (TC_W,TC_W) → Some Refl 62 | (_,_) → None 63 | 64 | stripPRIV ∷ PRIV_W p → PRIV 65 | stripPRIV = \case 66 | EPS_W → EPS 67 | ED_W → ED 68 | RENYI_W → RENYI 69 | ZC_W → ZC 70 | TC_W → TC 71 | 72 | class PRIV_C (p ∷ PRIV) where 73 | priv ∷ PRIV_W p 74 | 75 | instance PRIV_C 'EPS where priv = EPS_W 76 | instance PRIV_C 'ED where priv = ED_W 77 | instance PRIV_C 'RENYI where priv = RENYI_W 78 | instance PRIV_C 'ZC where priv = ZC_W 79 | instance PRIV_C 'TC where priv = TC_W 80 | 81 | data Pr (p ∷ PRIV) r where 82 | EpsPriv ∷ r → Pr 'EPS r 83 | EDPriv ∷ r → r → Pr 'ED r 84 | RenyiPriv ∷ r → r → Pr 'RENYI r 85 | ZCPriv ∷ r → Pr 'ZC r 86 | TCPriv ∷ r → r → Pr 'TC r 87 | deriving instance (Eq r) ⇒ Eq (Pr p r) 88 | deriving instance (Ord r) ⇒ Ord (Pr p r) 89 | deriving instance (Show r) ⇒ Show (Pr p r) 90 | 91 | instance (Append r,Meet r) ⇒ Append (Pr p r) where 92 | EpsPriv ε₁ ⧺ EpsPriv ε₂ = EpsPriv $ ε₁ ⧺ ε₂ 93 | EDPriv ε₁ δ₁ ⧺ EDPriv ε₂ δ₂ = EDPriv (ε₁ ⧺ ε₂) (δ₁ ⧺ δ₂) 94 | RenyiPriv α₁ ε₁ ⧺ RenyiPriv α₂ ε₂ = RenyiPriv (α₁ ⊓ α₂) (ε₁ ⧺ ε₂) 95 | ZCPriv ρ₁ ⧺ ZCPriv ρ₂ = ZCPriv $ ρ₁ ⧺ ρ₂ 96 | TCPriv ρ₁ ω₁ ⧺ TCPriv ρ₂ ω₂ = TCPriv (ρ₁ ⧺ ρ₂) (ω₁ ⊓ ω₂) 97 | instance (Join r,Meet r) ⇒ Join (Pr p r) where 98 | EpsPriv ε₁ ⊔ EpsPriv ε₂ = EpsPriv $ ε₁ ⊔ ε₂ 99 | EDPriv ε₁ δ₁ ⊔ EDPriv ε₂ δ₂ = EDPriv (ε₁ ⊔ ε₂) (δ₁ ⊔ δ₂) 100 | RenyiPriv α₁ ε₁ ⊔ RenyiPriv α₂ ε₂ = RenyiPriv (α₁ ⊓ α₂) (ε₁ ⊔ ε₂) 101 | ZCPriv ρ₁ ⊔ ZCPriv ρ₂ = ZCPriv $ ρ₁ ⊔ ρ₂ 102 | TCPriv ρ₁ ω₁ ⊔ TCPriv ρ₂ ω₂ = TCPriv (ρ₁ ⊔ ρ₂) (ω₁ ⊓ ω₂) 103 | 104 | iteratePr ∷ (Times r) ⇒ r → Pr p r → Pr p r 105 | iteratePr x = \case 106 | EpsPriv ε → EpsPriv $ x × ε 107 | EDPriv ε δ → EDPriv (x × ε) (x × δ) 108 | RenyiPriv α ε → RenyiPriv α $ x × ε 109 | ZCPriv ρ → ZCPriv $ x × ρ 110 | TCPriv ρ ω → TCPriv (x × ρ) ω 111 | 112 | -- JOE TODO: put a link here to the paper 113 | convertRENYIEDPr ∷ (One r,Plus r,Minus r,Divide r,Log r) ⇒ r → Pr 'RENYI r → Pr 'ED r 114 | convertRENYIEDPr δ (RenyiPriv α ε) = EDPriv (ε + log (one / δ) / (α - one)) δ 115 | 116 | -- JOE TODO: put a link here to the paper 117 | convertZCEDPr ∷ (One r,Plus r,Minus r,Times r,Divide r,Root r,Log r) ⇒ r → Pr 'ZC r → Pr 'ED r 118 | convertZCEDPr δ (ZCPriv ρ) = EDPriv (ρ + (one + one) × root (ρ × log (one / δ))) δ 119 | 120 | -- JOE TODO: put a link here to the paper 121 | convertEPSZCPr ∷ (One r,Plus r,Minus r,Times r,Divide r,Root r,Log r) ⇒ Pr 'EPS r → Pr 'ZC r 122 | convertEPSZCPr (EpsPriv ε) = ZCPriv ((one / (one + one)) × ε × ε) 123 | 124 | -- JOE TODO: put a link here to the paper 125 | -- we would like to have a constraint solver for this, because the conversion 126 | -- only makes sense when ⟨δ,ρ,ω⟩ are in a particular relationship 127 | -- convertTCEDPr ∷ (One r,Plus r,Minus r,Divide r,Log r) ⇒ r → Pr 'TC r → Pr 'ED r 128 | -- convertTCEDPr δ (TCPriv ρ ω) = EDPRIV _ _ 129 | 130 | instance Functor (Pr p) where 131 | map f (EpsPriv ε) = EpsPriv $ f ε 132 | map f (EDPriv ε δ) = EDPriv (f ε) (f δ) 133 | map f (RenyiPriv α ε) = RenyiPriv (f α) (f ε) 134 | map f (ZCPriv ρ) = ZCPriv $ f ρ 135 | map f (TCPriv ρ ω) = TCPriv (f ρ) (f ω) 136 | 137 | newtype Priv p r = Priv { unPriv ∷ Quantity (Pr p r) } 138 | deriving 139 | (Eq,Ord,Show 140 | ,Null,Append,Monoid 141 | ,Bot,Join,JoinLattice) 142 | instance Functor (Priv p) where map f = Priv ∘ mapp f ∘ unPriv 143 | 144 | onPriv ∷ (Quantity (Pr p₁ r₁) → Quantity (Pr p₂ r₂)) → Priv p₁ r₁ → Priv p₂ r₂ 145 | onPriv f = Priv ∘ f ∘ unPriv 146 | 147 | instance (HasPrism (Quantity (Pr p r)) s) ⇒ HasPrism (Priv p r) s where 148 | hasPrism = Prism 149 | { construct = Priv ∘ construct hasPrism 150 | , view = view hasPrism ∘ unPriv 151 | } 152 | 153 | data PArgs r where 154 | PArgs ∷ ∀ (p ∷ PRIV) r. (PRIV_C p) ⇒ 𝐿 (Type r ∧ Priv p r) → PArgs r 155 | 156 | instance (Eq r) ⇒ Eq (PArgs r) where 157 | (==) ∷ PArgs r → PArgs r → 𝔹 158 | PArgs (xps₁ ∷ 𝐿 (_ ∧ Priv p₁ _)) == PArgs (xps₂ ∷ 𝐿 (_ ∧ Priv p₂ _)) = case eqPRIV (priv @ p₁) (priv @ p₂) of 159 | Some Refl → xps₁ ≡ xps₂ 160 | None → False 161 | instance (Ord r) ⇒ Ord (PArgs r) where 162 | compare ∷ PArgs r → PArgs r → Ordering 163 | compare (PArgs (xps₁ ∷ 𝐿 (_ ∧ Priv p₁ _))) (PArgs (xps₂ ∷ 𝐿 (_ ∧ Priv p₂ _))) = case eqPRIV (priv @ p₁) (priv @ p₂) of 164 | Some Refl → compare xps₁ xps₂ 165 | None → compare (stripPRIV (priv @ p₁)) (stripPRIV (priv @ p₂)) 166 | deriving instance (Show r) ⇒ Show (PArgs r) 167 | 168 | 169 | data RowsT r = RexpRT r | StarRT deriving (Eq,Ord,Show) 170 | 171 | instance Functor RowsT where 172 | map ∷ (a → b) → RowsT a → RowsT b 173 | map f = \case 174 | RexpRT r → RexpRT $ f r 175 | StarRT → StarRT 176 | 177 | data MExp r = 178 | EmptyME 179 | | VarME 𝕏 180 | | ConsME (Type r) (MExp r) 181 | | AppendME (MExp r) (MExp r) 182 | | RexpME r (Type r) 183 | deriving (Eq,Ord,Show) 184 | 185 | instance Functor MExp where 186 | map ∷ (a → b) → MExp a → MExp b 187 | map f = \case 188 | EmptyME → EmptyME 189 | VarME x → VarME x 190 | ConsME τ m → ConsME (map f τ) (map f m) 191 | AppendME n m → AppendME (map f n) (map f m) 192 | RexpME r τ → RexpME (f r) (map f τ) 193 | 194 | type TypeSource r = Annotated FullContext (Type r) 195 | data Type r = 196 | ℕˢT r 197 | | ℝˢT r 198 | | ℕT 199 | | ℝT 200 | | 𝕀T r 201 | | 𝔹T 202 | | 𝕊T 203 | | 𝔻𝔽T (𝐿 (𝕊 ∧ Type r)) -- TODO: remove 204 | | BagT Norm Clip (Type r) 205 | | SetT (Type r) 206 | | RecordT (𝐿 (𝕊 ∧ Type r)) 207 | | 𝕄T Norm Clip (RowsT r) (MExp r) 208 | | 𝔻T (Type r) 209 | | Type r :+: Type r 210 | | Type r :×: Type r 211 | | Type r :&: Type r 212 | | (𝐿 (𝕏 ∧ Kind) ∧ Type r) :⊸: (Sens r ∧ Type r) 213 | | (𝐿 (𝕏 ∧ Kind) ∧ PArgs r) :⊸⋆: Type r 214 | | BoxedT (𝕏 ⇰ Sens r) (Type r) 215 | | VarT 𝕏 216 | deriving (Eq,Ord,Show) 217 | 218 | instance Functor Type where 219 | map ∷ (a → b) → Type a → Type b 220 | map f = \case 221 | ℕˢT r → ℕˢT $ f r 222 | ℝˢT r → ℝˢT $ f r 223 | ℕT → ℕT 224 | ℝT → ℝT 225 | 𝕀T r → 𝕀T $ f r 226 | 𝔹T → 𝔹T 227 | 𝕊T → 𝕊T 228 | 𝔻𝔽T as → 𝔻𝔽T $ map (mapPair id $ map f) as -- TODO: remove 229 | BagT ℓ c τ → BagT ℓ c (map f τ) 230 | SetT τ → SetT (map f τ) 231 | RecordT as → RecordT $ map (mapPair id $ map f) as 232 | 𝕄T ℓ c r₁ r₂ → 𝕄T ℓ c (map f r₁) (map f r₂) 233 | 𝔻T τ → 𝔻T $ map f τ 234 | τ₁ :+: τ₂ → map f τ₁ :+: map f τ₂ 235 | τ₁ :×: τ₂ → map f τ₁ :×: map f τ₂ 236 | τ₁ :&: τ₂ → map f τ₁ :&: map f τ₂ 237 | (αks :* τ₁) :⊸: (s :* τ₂) → (αks :* map f τ₁) :⊸: (map f s :* map f τ₂) 238 | (αks :* PArgs xτs) :⊸⋆: τ → (αks :* PArgs (map (mapPair (map f) (map f)) xτs)) :⊸⋆: map f τ 239 | BoxedT σ τ → BoxedT (map (map f) σ) (map f τ) 240 | --TODO:QUESTION 241 | VarT x → VarT x 242 | 243 | ----------------- 244 | -- Expressions -- 245 | ----------------- 246 | 247 | data Grad = LR 248 | deriving (Eq,Ord,Show) 249 | makePrettySum ''Grad 250 | 251 | 252 | type SExpSource (p ∷ PRIV) = Annotated FullContext (SExp p) 253 | -- this is using GADT syntax and extension 254 | data SExp (p ∷ PRIV) where 255 | -- numeric operations 256 | ℕˢSE ∷ ℕ → SExp p 257 | ℝˢSE ∷ 𝔻 → SExp p 258 | DynSE ∷ SExpSource p → SExp p 259 | ℕSE ∷ ℕ → SExp p 260 | ℝSE ∷ 𝔻 → SExp p 261 | RealSE ∷ SExpSource p → SExp p 262 | MaxSE ∷ SExpSource p → SExpSource p → SExp p 263 | MinSE ∷ SExpSource p → SExpSource p → SExp p 264 | PlusSE ∷ SExpSource p → SExpSource p → SExp p 265 | TimesSE ∷ SExpSource p → SExpSource p → SExp p 266 | MTimesSE ∷ SExpSource p → SExpSource p → SExp p 267 | DivSE ∷ SExpSource p → SExpSource p → SExp p 268 | RootSE ∷ SExpSource p → SExp p 269 | LogSE ∷ SExpSource p → SExp p 270 | ModSE ∷ SExpSource p → SExpSource p → SExp p 271 | MinusSE ∷ SExpSource p → SExpSource p → SExp p 272 | EqualsSE ∷ SExpSource p → SExpSource p → SExp p 273 | TrueSE ∷ SExp p 274 | FalseSE ∷ SExp p 275 | AndSE ∷ SExpSource p → SExpSource p → SExp p 276 | OrSE ∷ SExpSource p → SExpSource p → SExp p 277 | -- dataframe operations 278 | RecordColSE ∷ 𝕊 → SExpSource p → SExp p 279 | DFPartitionSE ∷ SExpSource p → 𝕊 → SExpSource p → SExp p 280 | DFMapSE ∷ SExpSource p → 𝕏 → SExpSource p → SExp p 281 | DFAddColSE ∷ 𝕊 → SExpSource p → SExp p 282 | DFJoin1SE ∷ 𝕊 → SExpSource p → SExpSource p → SExp p 283 | -- matrix operations 284 | MCreateSE ∷ Norm → SExpSource p → SExpSource p → 𝕏 → 𝕏 → SExpSource p → SExp p 285 | MIndexSE ∷ SExpSource p → SExpSource p → SExpSource p → SExp p 286 | MUpdateSE ∷ SExpSource p → SExpSource p → SExpSource p → SExpSource p → SExp p 287 | MFilterSE ∷ SExpSource p → 𝕏 → SExpSource p → SExp p 288 | MZipSE ∷ SExpSource p → SExpSource p → SExp p 289 | MRowsSE ∷ SExpSource p → SExp p 290 | MColsSE ∷ SExpSource p → SExp p 291 | MTransposeSE ∷ SExpSource p → SExp p 292 | IdxSE ∷ SExpSource p → SExp p 293 | MClipSE ∷ Norm → SExpSource p → SExp p 294 | MConvertSE ∷ SExpSource p → SExp p 295 | MLipGradSE ∷ Grad → SExpSource p → SExpSource p → SExpSource p → SExp p 296 | MUnbGradSE ∷ Grad → SExpSource p → SExpSource p → SExpSource p → SExp p 297 | -- | MUnbGradSE (SExpSource p) (SExpSource p) (SExpSource p) 298 | MMapSE ∷ SExpSource p → 𝕏 → SExpSource p → SExp p 299 | MMapColSE ∷ SExpSource p → 𝕏 → SExpSource p → SExp p 300 | MMapCol2SE ∷ SExpSource p → SExpSource p → 𝕏 → 𝕏 → SExpSource p → SExp p 301 | MMapRowSE ∷ SExpSource p → 𝕏 → SExpSource p → SExp p 302 | MMap2SE ∷ SExpSource p → SExpSource p → 𝕏 → 𝕏 → SExpSource p → SExp p 303 | MFoldSE ∷ SExpSource p → SExpSource p → 𝕏 → 𝕏 → SExpSource p → SExp p 304 | JoinSE ∷ SExpSource p → SExpSource p → SExpSource p → SExpSource p → SExp p 305 | -- CSVtoMatrixSE :: 𝐿 (𝐿 𝕊) → TypeSource RExp → SExp p 306 | BMapSE ∷ SExpSource p → 𝕏 → SExpSource p → SExp p 307 | BMap2SE ∷ SExpSource p → SExpSource p → 𝕏 → 𝕏 → SExpSource p → SExp p 308 | -- | MMapRowSE (SExpSource p) 𝕏 (SExpSource p) 309 | -- | MMapRow2SE (SExpSource p) 𝕏 (SExpSource p) 310 | -- | MFoldRowSE (SExpSource p) (SExpSource p) 𝕏 𝕏 (SExpSource p) 311 | -- connectives 312 | -- | SLoopSE (SExpSource p) (SExpSource p) 𝕏 (SExpSource p) 313 | LoopSE ∷ SExpSource p → SExpSource p → 𝕏 → 𝕏 → SExpSource p → SExp p 314 | VarSE ∷ 𝕏 → SExp p 315 | LetSE ∷ 𝕏 → SExpSource p → SExpSource p → SExp p 316 | SFunSE ∷ 𝐿 (𝕏 ∧ Kind) → 𝕏 → TypeSource RExp → SExpSource p → SExp p 317 | AppSE ∷ SExpSource p → 𝐿 RExp → SExpSource p → SExp p 318 | PFunSE ∷ 𝐿 (𝕏 ∧ Kind) → 𝐿 (𝕏 ∧ TypeSource RExp) → PExpSource p → SExp p 319 | InlSE ∷ TypeSource RExp → SExpSource p → SExp p 320 | InrSE ∷ TypeSource RExp → SExpSource p → SExp p 321 | CaseSE ∷ SExpSource p → 𝕏 → SExpSource p → 𝕏 → SExpSource p → SExp p 322 | TupSE ∷ SExpSource p → SExpSource p → SExp p 323 | UntupSE ∷ 𝕏 → 𝕏 → SExpSource p → SExpSource p → SExp p 324 | SetSE ∷ 𝐿 (SExpSource p) → SExp p 325 | UnionAllSE ∷ SExpSource p → SExp p 326 | MemberSE ∷ SExpSource p → SExpSource p → SExp p 327 | PairSE ∷ SExpSource p → SExpSource p → SExp p 328 | FstSE ∷ SExpSource p → SExp p 329 | SndSE ∷ SExpSource p → SExp p 330 | BoxSE ∷ SExpSource p → SExp p 331 | UnboxSE ∷ SExpSource p → SExp p 332 | ClipSE ∷ SExpSource p → SExp p 333 | ConvSE ∷ SExpSource p → SExp p 334 | DiscFSE ∷ SExpSource p → SExp p 335 | DiscSE ∷ SExpSource p → SExp p 336 | CountSE ∷ SExpSource p → SExp p 337 | ChunksSE ∷ SExpSource p → SExpSource p → SExp p 338 | Chunks2SE ∷ SExpSource p → SExpSource p → SExpSource p → SExp p 339 | deriving (Eq,Ord,Show) 340 | 341 | data GaussParams (p ∷ PRIV) where 342 | EDGaussParams ∷ SExpSource 'ED → SExpSource 'ED → GaussParams 'ED 343 | RenyiGaussParams ∷ SExpSource 'RENYI → SExpSource 'RENYI → GaussParams 'RENYI 344 | TCGaussParams ∷ SExpSource 'TC → SExpSource 'TC → GaussParams 'TC 345 | ZCGaussParams ∷ SExpSource 'ZC → GaussParams 'ZC 346 | deriving instance Eq (GaussParams p) 347 | deriving instance Ord (GaussParams p) 348 | deriving instance Show (GaussParams p) 349 | 350 | data LaplaceParams (p ∷ PRIV) where 351 | EpsLaplaceParams ∷ SExpSource 'EPS → LaplaceParams 'EPS 352 | deriving instance Eq (LaplaceParams p) 353 | deriving instance Ord (LaplaceParams p) 354 | deriving instance Show (LaplaceParams p) 355 | 356 | data ExponentialParams (p ∷ PRIV) where 357 | EDExponentialParams ∷ SExpSource 'ED → ExponentialParams 'ED 358 | deriving instance Eq (ExponentialParams p) 359 | deriving instance Ord (ExponentialParams p) 360 | deriving instance Show (ExponentialParams p) 361 | 362 | data SVTParams (p ∷ PRIV) where 363 | EPSSVTParams ∷ SExpSource 'EPS → SVTParams 'EPS 364 | EDSVTParams ∷ SExpSource 'ED → SVTParams 'ED 365 | deriving instance Eq (SVTParams p) 366 | deriving instance Ord (SVTParams p) 367 | deriving instance Show (SVTParams p) 368 | 369 | type PExpSource (p ∷ PRIV) = Annotated FullContext (PExp p) 370 | data PExp (p ∷ PRIV) where 371 | ReturnPE ∷ SExpSource p → PExp p 372 | BindPE ∷ 𝕏 → PExpSource p → PExpSource p → PExp p 373 | AppPE ∷ SExpSource p → 𝐿 RExp → 𝐿 (SExpSource p) → PExp p 374 | EDLoopPE ∷ SExpSource 'ED → SExpSource 'ED → SExpSource 'ED → 𝐿 𝕏 → 𝕏 → 𝕏 → PExpSource 'ED → PExp 'ED 375 | LoopPE ∷ SExpSource p → SExpSource p → 𝐿 𝕏 → 𝕏 → 𝕏 → PExpSource p → PExp p 376 | GaussPE ∷ SExpSource p → GaussParams p → 𝐿 𝕏 → SExpSource p → PExp p 377 | IfPE ∷ (SExpSource p) → (PExpSource p) → (PExpSource p) → PExp p 378 | ParallelPE ∷ SExpSource p → SExpSource p → 𝕏 → SExpSource p → 𝕏 → 𝕏 → PExpSource p → PExp p 379 | MMapPE ∷ SExpSource p → 𝕏 → PExpSource p → PExp p 380 | PMapColPE ∷ SExpSource p → 𝕏 → PExpSource p → PExp p 381 | PFldRowsPE ∷ SExpSource p → SExpSource p → SExpSource p → PExp p 382 | PFldRows2PE ∷ SExpSource p → SExpSource p → SExpSource p → SExpSource p → SExpSource p → PExp p 383 | MGaussPE ∷ SExpSource p → GaussParams p → 𝐿 𝕏 → SExpSource p → PExp p 384 | BGaussPE ∷ SExpSource p → GaussParams p → 𝐿 𝕏 → SExpSource p → PExp p 385 | LaplacePE ∷ SExpSource p → LaplaceParams p → 𝐿 𝕏 → SExpSource p → PExp p 386 | MLaplacePE ∷ SExpSource p → LaplaceParams p → 𝐿 𝕏 → SExpSource p → PExp p 387 | ExponentialPE ∷ SExpSource p → ExponentialParams p → SExpSource p → 𝐿 𝕏 → 𝕏 → SExpSource p → PExp p 388 | SVTPE ∷ SVTParams p → SExpSource p → SExpSource p → 𝐿 𝕏 → SExpSource p → PExp p 389 | RRespPE ∷ SExpSource p → SExpSource p → 𝐿 𝕏 → SExpSource p → PExp p 390 | EDSamplePE ∷ SExpSource 'ED → SExpSource 'ED → SExpSource 'ED → 𝕏 → 𝕏 → PExpSource 'ED → PExp 'ED 391 | RenyiSamplePE ∷ SExpSource 'RENYI → SExpSource 'RENYI → SExpSource 'RENYI → 𝕏 → 𝕏 → PExpSource 'RENYI → PExp 'RENYI 392 | TCSamplePE ∷ SExpSource 'TC → SExpSource 'TC → SExpSource 'TC → 𝕏 → 𝕏 → PExpSource 'TC → PExp 'TC 393 | RandNatPE ∷ SExpSource p → SExpSource p → PExp p 394 | ConvertZCEDPE ∷ SExpSource 'ED → PExpSource 'ZC → PExp 'ED 395 | ConvertEPSZCPE ∷ PExpSource 'EPS → PExp 'ZC 396 | ConvertRENYIEDPE ∷ SExpSource 'ED → PExpSource 'RENYI → PExp 'ED 397 | 398 | deriving instance Eq (PExp p) 399 | deriving instance Ord (PExp p) 400 | deriving instance Show (PExp p) 401 | 402 | instance Pretty (SExp p) where pretty _ = ppLit "SEXP" 403 | instance Pretty (PExp p) where pretty _ = ppLit "PEXP" 404 | -------------------------------------------------------------------------------- /src/Duet/UVMHS.hs: -------------------------------------------------------------------------------- 1 | module Duet.UVMHS 2 | ( module UVMHS 3 | , module Duet.UVMHS 4 | ) where 5 | 6 | import UVMHS 7 | 8 | import qualified Prelude as HS 9 | import qualified GHC.Stats as HS 10 | import qualified System.Mem as HS 11 | import qualified Data.Time.Clock as Time 12 | 13 | infixl 3 ⨺,⨹ 14 | 15 | type Time = Time.UTCTime 16 | type TimeD = Time.NominalDiffTime 17 | 18 | secondsTimeD ∷ TimeD → 𝔻 19 | secondsTimeD = HS.realToFrac 20 | 21 | instance Zero TimeD where {zero = HS.fromIntegral 0} 22 | instance Plus TimeD where {(+) = (HS.+)} 23 | instance Additive TimeD 24 | instance One TimeD where {one = HS.fromIntegral 1} 25 | instance Times TimeD where {(×) = (HS.*)} 26 | instance Multiplicative TimeD 27 | 28 | (⨺) ∷ Time → Time → TimeD 29 | (⨺) = Time.diffUTCTime 30 | 31 | (⨹) ∷ Time → TimeD → Time 32 | (⨹) = flip Time.addUTCTime 33 | 34 | now ∷ IO Time 35 | now = Time.getCurrentTime 36 | 37 | gc ∷ IO () 38 | gc = HS.performGC 39 | 40 | time ∷ (a → b) → a → IO (b ∧ TimeD) 41 | time f x = do 42 | gc 43 | t₁ ← now 44 | let y = f x 45 | t₂ ← now 46 | return $ (y :* t₂ ⨺ t₁) 47 | 48 | timeIO ∷ IO a → IO (a ∧ TimeD) 49 | timeIO xM = do 50 | gc 51 | t₁ ← now 52 | x ← xM 53 | t₂ ← now 54 | return $ (x :* t₂ ⨺ t₁) 55 | 56 | profile ∷ (a → b) → a → IO (TimeD,𝔻) 57 | profile f x = do 58 | gc 59 | s₁ ← HS.getRTSStats 60 | let (n₁,u₁) = (HS.major_gcs s₁,HS.cumulative_live_bytes s₁) 61 | t₁ ← now 62 | let _ = f x 63 | t₂ ← now 64 | s₂ ← HS.getRTSStats 65 | let (n₂,u₂) = (HS.major_gcs s₂,HS.cumulative_live_bytes s₂) 66 | return (t₂ ⨺ t₁,dbl (HS.fromIntegral u₂ - HS.fromIntegral u₁ ∷ ℕ) / dbl (HS.fromIntegral n₂ - HS.fromIntegral n₁ ∷ ℕ)) 67 | 68 | xcolsplit ∷ Vᴍ m n a → Vᴍ 1 n (Vᴍ m 1 a) 69 | xcolsplit xys@(Vᴍ _ _ _) = matrix (s𝕟32 @ 1) (xcols xys) $ \ _ j → matrix (rowsVᴍ xys) (s𝕟32 @ 1) $ \ i _ → indexVᴍ i j xys 70 | -------------------------------------------------------------------------------- /stack.yaml: -------------------------------------------------------------------------------- 1 | resolver: lts-13.2 2 | extra-deps: 3 | - git: git@github.com:uvm-plaid/uvmhs.git 4 | commit: fd4300c1b68e86f7414f1267325ecc7a4dd74c6a 5 | - normaldistribution-1.1.0.3 6 | -------------------------------------------------------------------------------- /wild_ideas.md: -------------------------------------------------------------------------------- 1 | a logic programming top level layer that read in files and unifies type 2 | variables?? 3 | 4 | import gd-pb.ed.duet 5 | 6 | m : ℕ[m] ← lvar 7 | n : ℕ[n] ← lvar 8 | 9 | xs : 𝕄 [L∞, U|m, n⋅𝔻 ] ← readCSV "data.csv" 10 | ys : 𝕄 [L∞, U|m, 1⋅𝔻 ] ← readCSV "labels.csv" 11 | 12 | print@(m) -- print length of db 13 | 14 | main@[m, n, 0.05 100 0.0001 0.0001 . xs, ys, 0.05, 100, 0.0001, 0.0001, 1] 15 | --------------------------------------------------------------------------------