---
layout: page
title: CRDT Papers
---
CRDT Papers
This page contains a comprehensive list of research publications on CRDTs.
The data is available in BibTeX format.
If you have anything to add or correct, please
edit the file on GitHub
and send us a pull request.
Select checkboxes to filter papers by topic:
Paper List
(In reverse chronological order)
-
[1]
-
Martin Kleppmann.
Moving elements in list CRDTs.
In 7th Workshop on Principles and Practice of Consistency for
Distributed Data, PaPoC 2020. ACM, April 2020.
[ bib |
DOI |
.pdf ]
Keywords: text-editing
-
[2]
-
Weihai Yu and Sigbjørn Rostad.
A low-cost set CRDT based on causal lengths.
In 7th Workshop on Principles and Practice of Consistency for
Distributed Data, PaPoC 2020. ACM, April 2020.
[ bib |
DOI ]
Keywords: set-crdt
-
[3]
-
Pascal Grosch, Roman Krafft, Marcel Wölki, and Annette Bieniusa.
AutoCouch: A JSON CRDT framework.
In 7th Workshop on Principles and Practice of Consistency for
Distributed Data, PaPoC 2020. ACM, April 2020.
[ bib |
DOI ]
Keywords: systems, Automerge, AutoCouch
-
[4]
-
Victor Grishchenko and Mikhail Patrakeev.
Chronofold: A data structure for versioned text.
In 7th Workshop on Principles and Practice of Consistency for
Distributed Data, PaPoC 2020. ACM, April 2020.
[ bib |
DOI |
arXiv ]
Keywords: text-editing, Chronofold
-
[5]
-
Matthieu Nicolas, Gérald Oster, and Olivier Perrin.
Efficient renaming in sequence CRDTs.
In 7th Workshop on Principles and Practice of Consistency for
Distributed Data, PaPoC 2020. ACM, April 2020.
[ bib |
DOI |
http ]
Keywords: text-editing, LogootSplit
-
[6]
-
Peter van Hardenberg and Martin Kleppmann.
PushPin: Towards production-quality peer-to-peer collaboration.
In 7th Workshop on Principles and Practice of Consistency for
Distributed Data, PaPoC 2020. ACM, April 2020.
[ bib |
DOI |
.pdf ]
Keywords: systems, usability, PushPin
-
[7]
-
Jim Bauwens and Elisa Gonzalez Boix.
Flec: A versatile programming framework for eventually consistent
systems.
In 7th Workshop on Principles and Practice of Consistency for
Distributed Data, PaPoC 2020. ACM, April 2020.
[ bib |
DOI ]
Keywords: systems, Flec
-
[8]
-
Matthew Weidner, Heather Miller, and Christopher Meiklejohn.
Composing and decomposing op-based CRDTs with semidirect products.
In 7th Workshop on Principles and Practice of Consistency for
Distributed Data, PaPoC 2020. ACM, April 2020.
[ bib |
DOI |
arXiv ]
Keywords: composition
-
[9]
-
Weihai Yu, Victorien Elvinger, and Claudia-Lavinia Ignat.
A generic undo support for state-based CRDTs.
In 23rd International Conference on Principles of Distributed
Systems, OPODIS 2019. Dagstuhl LIPIcs, November 2019.
[ bib |
DOI |
.pdf ]
Keywords: state-based, undo
-
[10]
-
Martin Kleppmann, Adam Wiggins, Peter van Hardenberg, and Mark McGranaghan.
Local-first software: You own your data, in spite of the cloud.
In ACM SIGPLAN International Symposium on New Ideas, New
Paradigms, and Reflections on Programming and Software, Onward! 2019, pages
154--178. ACM, October 2019.
[ bib |
DOI |
.pdf ]
Keywords: systems, usability
-
[11]
-
Gowtham Kaki, Swarn Priya, KC Sivaramakrishnan, and Suresh Jagannathan.
Mergeable replicated data types.
Proceedings of the ACM on Programming Languages (PACMPL),
3(OOPSLA), October 2019.
[ bib |
DOI |
.pdf ]
Keywords: crdt-related
-
[12]
-
Ragnar Mogk, Joscha Drechsler, Guido Salvaneschi, and Mira Mezini.
A fault-tolerant programming model for distributed interactive
applications.
Proceedings of the ACM on Programming Languages (PACMPL),
3(OOPSLA), October 2019.
[ bib |
DOI ]
Keywords: systems
-
[13]
-
Stephan A Kollmann, Martin Kleppmann, and Alastair R Beresford.
Snapdoc: Authenticated snapshots with history privacy in
peer-to-peer collaborative editing.
Proceedings on Privacy Enhancing Technologies (PoPETS),
2019(3):210--232, July 2019.
[ bib |
DOI |
.pdf ]
Keywords: security
-
[14]
-
Vitor Enes, Paulo Sérgio Almeida, Carlos Baquero, and João Leitão.
Efficient synchronization of state-based CRDTs.
In 35th IEEE International Conference on Data Engineering, ICDE
2019, pages 148--159, April 2019.
[ bib |
DOI |
arXiv ]
Keywords: state-based
-
[15]
-
Adriaan Leijnse, Paulo Sérgio Almeida, and Carlos Baquero.
Higher-order patterns in replicated data types.
In 6th Workshop on Principles and Practice of Consistency for
Distributed Data, PaPoC 2019. ACM, March 2019.
[ bib |
DOI |
.pdf ]
Keywords: composition
-
[16]
-
Martin Kleppmann, Victor B. F. Gomes, Dominic P. Mulligan, and Alastair R.
Beresford.
Interleaving anomalies in collaborative text editors.
In 6th Workshop on Principles and Practice of Consistency for
Distributed Data, PaPoC 2019. ACM, March 2019.
[ bib |
DOI |
.pdf ]
Keywords: text-editing
-
[17]
-
David Mealha, Nuno Preguiça, Maria Cecilia Gomes, and João Leitão.
Data replication on the cloud/edge.
In 6th Workshop on Principles and Practice of Consistency for
Distributed Data, PaPoC 2019. ACM, March 2019.
[ bib |
DOI ]
Keywords: systems
-
[18]
-
Kevin De Porre, Florian Myter, Christophe De Troyer, Christophe Scholliers,
Wolfgang De Meuter, and Elisa Gonzalez Boix.
A generic replicated data type for strong eventual consistency.
In 6th Workshop on Principles and Practice of Consistency for
Distributed Data, PaPoC 2019. ACM, March 2019.
[ bib |
DOI |
.pdf ]
Keywords: text-editing, operation-based
-
[19]
-
Xiao Lv, Fazhi He, Yuan Cheng, and Yiqi Wu.
A novel CRDT-based synchronization method for real-time
collaborative CAD systems.
Advanced Engineering Informatics, 38:381--391, August 2018.
[ bib |
DOI ]
Keywords: systems
-
[20]
-
Ragnar Mogk, Lars Baumgärtner, Guido Salvaneschi, Bernd Freisleben, and
Mira Mezini.
Fault-tolerant distributed reactive programming.
In 32nd European Conference on Object-Oriented Programming,
volume 109 of ECOOP 2018. Schloss Dagstuhl--Leibniz-Zentrum fuer
Informatik, July 2018.
[ bib |
DOI ]
Keywords: systems
-
[21]
-
Badrish Chandramouli, Guna Prasaad, Donald Kossmann, Justin Levandoski, James
Hunter, and Mike Barnett.
FASTER: A concurrent key-value store with in-place updates.
In International Conference on Management of Data, SIGMOD 2018,
pages 275--290. ACM, June 2018.
[ bib |
DOI |
.pdf ]
Keywords: systems
-
[22]
-
Nuno Preguiça.
Conflict-free replicated data types: An overview.
June 2018.
[ bib |
arXiv |
http ]
Keywords: introduction
-
[23]
-
Nuno Preguiça, Carlos Baquero, and Marc Shapiro.
Conflict-free replicated data types (CRDTs).
In Encyclopedia of Big Data Technologies. Springer, May 2018.
[ bib |
DOI |
arXiv ]
Keywords: introduction
-
[24]
-
Martin Kleppmann, Victor B F Gomes, Dominic P Mulligan, and Alastair R
Beresford.
OpSets: Sequential specifications for replicated datatypes
(extended version).
May 2018.
[ bib |
arXiv |
http ]
Keywords: specification, verification
-
[25]
-
Marc Shapiro, Annette Bieniusa, Peter Zeller, and Gustavo Petri.
Ensuring referential integrity under causal consistency.
In 5th Workshop on the Principles and Practice of Consistency
for Distributed Data, PaPoC 2018. ACM, April 2018.
[ bib |
DOI |
.pdf ]
Keywords: causal-consistency
-
[26]
-
Jim Bauwens, Florian Myter, and Elisa Gonzalez Boix.
Constraining the eventual in eventual consistency.
In 5th Workshop on the Principles and Practice of Consistency
for Distributed Data, PaPoC 2018. ACM, April 2018.
[ bib |
DOI |
.pdf ]
Keywords: counters
-
[27]
-
Paulo Sérgio Almeida, Ali Shoker, and Carlos Baquero.
Delta state replicated data types.
Journal of Parallel and Distributed Computing, 111:162--173,
January 2018.
[ bib |
DOI |
arXiv ]
Keywords: state-based
-
[28]
-
Mahsa Najafzadeh, Marc Shapiro, and Patrick Eugster.
Co-design and verification of an available file system.
In 19th International Conference on Verification, Model
Checking, and Abstract Interpretation, VMCAI 2018, pages 358--381. Springer
LNCS volume 10747, January 2018.
[ bib |
DOI |
.pdf ]
Keywords: trees
-
[29]
-
Vitor Enes.
Efficient synchronization of state-based CRDTs.
Master's thesis, Universidade do Minho, November 2017.
[ bib |
.pdf ]
Keywords: state-based
-
[30]
-
Victor B F Gomes, Martin Kleppmann, Dominic P Mulligan, and Alastair R
Beresford.
Verifying strong eventual consistency in distributed systems.
Proceedings of the ACM on Programming Languages (PACMPL),
1(OOPSLA), October 2017.
[ bib |
DOI |
arXiv ]
Keywords: specification, verification
-
[31]
-
Carlos Baquero, Paulo Sérgio Almeida, Alcino Cunha, and Carla Ferreira.
Composition in state-based replicated data types.
Bulletin of the European Association for Theoretical Computer
Science, (123), October 2017.
[ bib |
http ]
Keywords: composition, state-based
-
[32]
-
Carlos Baquero, Paulo Sérgio Almeida, and Ali Shoker.
Pure operation-based replicated data types.
October 2017.
[ bib |
arXiv |
http ]
Keywords: operation-based
-
[33]
-
Weihai Yu, Gérald Oster, and Claudia-Lavinia Ignat.
Handling disturbance and awareness of concurrent updates in a
collaborative editor.
In 14th International Conference on Cooperative Design,
Visualization, and Engineering, CDVE 2017, pages 39--47. Springer LNCS
volume 10451, September 2017.
[ bib |
DOI |
http ]
Keywords: systems, usability
-
[34]
-
Martin Kleppmann and Alastair R Beresford.
A conflict-free replicated JSON datatype.
IEEE Transactions on Parallel and Distributed Systems,
28(10):2733--2746, April 2017.
[ bib |
DOI |
arXiv ]
Keywords: trees
-
[35]
-
Tim Jungnickel and Lennart Oldenburg.
Pluto: The CRDT-driven IMAP server.
In 3rd International Workshop on Principles and Practice of
Consistency for Distributed Data, PaPoC 2017. ACM, April 2017.
[ bib |
DOI |
.pdf ]
Keywords: systems
-
[36]
-
Georges Younes, Paulo Sérgio Almeida, and Carlos Baquero.
Compact resettable counters through causal stability.
In 3rd International Workshop on Principles and Practice of
Consistency for Distributed Data, PaPoC 2017. ACM, April 2017.
[ bib |
DOI |
.pdf ]
Keywords: counters
-
[37]
-
Peter Zeller.
Testing properties of weakly consistent programs with Repliss.
In 3rd International Workshop on Principles and Practice of
Consistency for Distributed Data, PaPoC 2017. ACM, April 2017.
[ bib |
DOI |
http ]
Keywords: testing, verification
-
[38]
-
Vitor Enes, Carlos Baquero, Paulo Sérgio Almeida, and João Leitão.
Borrowing an identity for a distributed counter: Work in progress
report.
In 3rd International Workshop on Principles and Practice of
Consistency for Distributed Data, PaPoC 2017. ACM, April 2017.
[ bib |
DOI |
.pdf ]
Keywords: counters
-
[39]
-
Albert van der Linde, Pedro Fouto, João Leitão, Nuno Preguiça,
Santiago Castiñeira, and Annette Bieniusa.
Legion: Enriching internet services with peer-to-peer interactions.
In 26th International Conference on World Wide Web, WWW 2017,
pages 283--292. ACM, April 2017.
[ bib |
DOI |
.pdf ]
Keywords: systems, Legion
-
[40]
-
Loïck Briot, Pascal Urso, and Marc Shapiro.
High responsiveness for group editing CRDTs.
In 19th International Conference on Supporting Group Work,
GROUP 2016, pages 51--60. ACM, November 2016.
[ bib |
DOI |
http ]
Keywords: text-editing, RGASplit
-
[41]
-
Petru Nicolaescu, Kevin Jahns, Michael Derntl, and Ralf Klamma.
Near real-time peer-to-peer shared editing on extensible data types.
In 19th International Conference on Supporting Group Work,
GROUP 2016, pages 39--49. ACM, November 2016.
[ bib |
DOI |
http ]
Keywords: text-editing, Yjs
-
[42]
-
Xiao Lv, Fazhi He, Weiwei Cai, and Yuan Cheng.
An efficient collaborative editing algorithm supporting string-based
operations.
In 20th IEEE International Conference on Computer Supported
Cooperative Work in Design, CSCWD 2016, pages 45--50. IEEE, September 2016.
[ bib |
DOI ]
Keywords: text-editing
-
[43]
-
Hagit Attiya, Sebastian Burckhardt, Alexey Gotsman, Adam Morrison, Hongseok
Yang, and Marek Zawirski.
Specification and complexity of collaborative text editing.
In ACM Symposium on Principles of Distributed Computing, PODC
2016, pages 259--268. ACM, July 2016.
[ bib |
DOI |
.pdf ]
Keywords: text-editing, specification, verification
-
[44]
-
Deepthi Devaki Akkoorath, Alejandro Z. Tomsic, Manuel Bravo, Zhongmiao Li,
Tyler Crain, Annette Bieniusa, Nuno Preguiça, and Marc Shapiro.
Cure: Strong semantics meets high availability and low latency.
In 36th IEEE International Conference on Distributed Computing
Systems, ICDCS 2016, pages 405--414. IEEE, June 2016.
[ bib |
DOI |
.pdf ]
Keywords: systems
-
[45]
-
Russell Brown, Zeeshan Lakhani, and Paul Place.
Big(ger) sets: Decomposed delta CRDT sets in Riak.
In 2nd Workshop on the Principles and Practice of Consistency
for Distributed Data, PaPoC 2016. ACM, April 2016.
[ bib |
DOI |
arXiv ]
Keywords: set-crdt, systems, composition
-
[46]
-
Marek Zawirski, Carlos Baquero, Annette Bieniusa, Nuno Preguiça, and Marc
Shapiro.
Eventually consistent register revisited.
In 2nd Workshop on the Principles and Practice of Consistency
for Distributed Data, PaPoC 2016. ACM, April 2016.
[ bib |
DOI |
arXiv |
.pdf ]
Keywords: state-based
-
[47]
-
Carlos Baquero, Paulo Sérgio Almeida, and Carl Lerche.
The problem with embedded CRDT counters and a solution.
In 2nd Workshop on the Principles and Practice of Consistency
for Distributed Data, PaPoC 2016. ACM, April 2016.
[ bib |
DOI |
.pdf ]
Keywords: composition, counters
-
[48]
-
Christian Weilbach, Konrad Kühne, and Annette Bieniusa.
Decoupling conflict resolution with CDVCS.
In 2nd Workshop on the Principles and Practice of Consistency
for Distributed Data, PaPoC 2016. ACM, April 2016.
[ bib |
DOI ]
Keywords: systems, Replikativ
-
[49]
-
Albert van der Linde, João Leitão, and Nuno Preguiça.
Δ-CRDTs: Making δ-CRDTs delta-based.
In 2nd Workshop on the Principles and Practice of Consistency
for Distributed Data, PaPoC 2016. ACM, April 2016.
[ bib |
DOI |
.pdf ]
Keywords: state-based
-
[50]
-
Deepthi Devaki Akkoorath and Annette Bieniusa.
Highly-scalable concurrent objects.
In 2nd Workshop on the Principles and Practice of Consistency
for Distributed Data, PaPoC 2016. ACM, April 2016.
[ bib |
DOI |
.pdf ]
Keywords: shared-memory concurrency
-
[51]
-
Brice Nédelec, Pascal Molli, and Achour Mostefaoui.
CRATE: Writing stories together with our browsers.
In 25th International World Wide Web Conference, WWW 2016,
pages 231--234. ACM, April 2016.
[ bib |
DOI |
http ]
Keywords: text-editing, LSEQ
-
[52]
-
Alexey Gotsman, Hongseok Yang, Carla Ferreira, Mahsa Najafzadeh, and Marc
Shapiro.
'Cause I'm Strong Enough: Reasoning about consistency choices in
distributed systems.
In 43rd Annual ACM SIGPLAN-SIGACT Symposium on Principles of
Programming Languages, POPL 2016, pages 371--384. ACM, January 2016.
[ bib |
DOI |
.pdf ]
Keywords: specification, verification
-
[53]
-
Marek Zawirski, Nuno Preguiça, Sérgio Duarte, Annette Bieniusa, Valter
Balegas, and Marc Shapiro.
Write fast, read in the past: Causal consistency for client-side
applications.
In 16th Annual Middleware Conference, pages 75--87.
ACM/IFIP/USENIX, December 2015.
[ bib |
DOI |
.pdf ]
Keywords: systems, SwiftCloud
-
[54]
-
Iwan Briquemont, Manuel Bravo, Zhongmiao Li, and Peter Van Roy.
Conflict-free partially replicated data types.
In 7th IEEE International Conference on Cloud Computing
Technology and Science, CloudCom 2015. IEEE, November 2015.
[ bib |
DOI |
http ]
Keywords: systems, SwiftCloud
-
[55]
-
Valter Balegas, Diogo Serra, Sérgio Duarte, Carla Ferreira, Marc Shapiro,
Rodrigo Rodrigues, and Nuno Preguiça.
Extending eventually consistent cloud databases for enforcing numeric
invariants.
In 34th IEEE Symposium on Reliable Distributed Systems, SRDS
2015, pages 31--36. IEEE, September 2015.
[ bib |
DOI |
arXiv ]
Keywords: counters
-
[56]
-
Christopher Meiklejohn and Peter Van Roy.
Lasp: A language for distributed, coordination-free programming.
In 17th International Symposium on Principles and Practice of
Declarative Programming, PPDP 2015, pages 184--195. ACM, July 2015.
[ bib |
DOI |
.pdf ]
Keywords: computation, systems
-
[57]
-
Petru Nicolaescu, Kevin Jahns, Michael Derntl, and Ralf Klamma.
Yjs: A framework for near real-time P2P shared editing on
arbitrary data types.
In 15th International Conference on Web Engineering, ICWE 2015,
pages 675--678. Springer LNCS volume 9114, June 2015.
[ bib |
DOI |
.pdf ]
Keywords: systems, Yjs
-
[58]
-
Weihai Yu, Luc André, and Claudia-Lavinia Ignat.
A CRDT supporting selective undo for collaborative text editing.
In 15th IFIP WG 6.1 International Conference on Distributed
Applications and Interoperable Systems, DAIS 2015, pages 193--206. Springer
LNCS volume 9038, June 2015.
[ bib |
DOI |
.pdf ]
Keywords: text-editing, undo
-
[59]
-
Vinh Tao, Marc Shapiro, and Vianney Rancurel.
Merging semantics for conflict updates in geo-distributed file
systems.
In 8th ACM International Systems and Storage Conference, SYSTOR
2015. ACM, May 2015.
[ bib |
DOI |
.pdf ]
Keywords: trees
-
[60]
-
Carlos Baquero, Paulo Sérgio Almeida, Alcino Cunha, and Carla Ferreira.
Composition of state-based CRDTs.
Technical report, HASLab, INESC TEC, May 2015.
[ bib |
.pdf ]
Keywords: state-based
-
[61]
-
Paulo Sérgio Almeida, Ali Shoker, and Carlos Baquero.
Efficient state-based CRDTs by delta-mutation.
In International Conference on Networked Systems, NETYS 2015,
pages 62--76. Springer LNCS volume 9466, May 2015.
[ bib |
DOI |
arXiv ]
Keywords: state-based
-
[62]
-
David Navalho, Sérgio Duarte, and Nuno Preguiça.
A study of CRDTs that do computations.
In 1st Workshop on Principles and Practice of Consistency for
Distributed Data, PaPoC 2015. ACM, April 2015.
[ bib |
DOI |
.pdf ]
Keywords: computation
-
[63]
-
Brandon Holt, Irene Zhang, Dan Ports, Mark Oskin, and Luis Ceze.
Claret: Using data types for highly concurrent distributed
transactions.
In 1st Workshop on Principles and Practice of Consistency for
Distributed Data, PaPoC 2015. ACM, April 2015.
[ bib |
DOI |
.pdf ]
Keywords: transactions, systems
-
[64]
-
Santiago J Castiñeira and Annette Bieniusa.
Collaborative offline web applications using conflict-free replicated
data types.
In 1st Workshop on Principles and Practice of Consistency for
Distributed Data, PaPoC 2015. ACM, April 2015.
[ bib |
DOI ]
Keywords: systems
-
[65]
-
Christopher Meiklejohn and Peter Van Roy.
Lasp: A language for distributed, eventually consistent computations
with crdts.
In 1st Workshop on Principles and Practice of Consistency for
Distributed Data, PaPoC 2015. ACM, April 2015.
[ bib |
DOI |
.pdf ]
Keywords: computation
-
[66]
-
Sebastian Burckhardt.
Principles of eventual consistency.
Foundations and Trends in Programming Languages, 1(1-2):1--150,
October 2014.
[ bib |
DOI |
http ]
Keywords: introduction
-
[67]
-
Cheng Li, João Leitão, Allen Clement, Nuno Preguiça, Rodrigo
Rodrigues, and Viktor Vafeiadis.
Automating the choice of consistency levels in replicated systems.
In USENIX Annual Technical Conference, ATC 2014, pages
281--292. USENIX, June 2014.
[ bib |
http ]
Keywords: verification
-
[68]
-
Peter Zeller, Annette Bieniusa, and Arnd Poetzsch-Heffter.
Formal specification and verification of CRDTs.
In 34th IFIP International Conference on Formal Techniques for
Distributed Objects, Components and Systems, FORTE 2014, pages 33--48.
Springer LNCS volume 8461, June 2014.
[ bib |
DOI |
.pdf ]
Keywords: specification, verification
-
[69]
-
Carlos Baquero, Paulo Sérgio Almeida, and Ali Shoker.
Making operation-based CRDTs operation-based.
In 14th IFIP WG 6.1 International Conference on Distributed
Applications and Interoperable Systems, DAIS 2014, pages 126--140. Springer
LNCS volume 8460, June 2014.
A shorter paper with the same title appears in PaPEC 2014.
[ bib |
DOI |
.pdf ]
Keywords: operation-based
-
[70]
-
Russell Brown, Sean Cribbs, Christopher Meiklejohn, and Sam Elliott.
Riak DT Map: A composable, convergent replicated dictionary.
In 1st Workshop on Principles and Practice of Eventual
Consistency, PaPEC 2014. ACM, April 2014.
[ bib |
DOI |
http ]
Keywords: systems, composition
-
[71]
-
Paulo Sérgio Almeida, Ali Shoker, and Carlos Baquero.
Efficient state-based CRDTs by decomposition (work in progress
report).
In 1st Workshop on Principles and Practice of Eventual
Consistency, PaPEC 2014. ACM, April 2014.
[ bib |
DOI |
.pdf ]
Keywords: composition
-
[72]
-
Mehdi Ahmed-Nacer, Pascal Urso, Valter Balegas, and Nuno Perguiça.
Merging OT and CRDT algorithms.
In 1st Workshop on Principles and Practice of Eventual
Consistency, PaPEC 2014. ACM, April 2014.
[ bib |
DOI |
.pdf ]
Keywords: text-editing
-
[73]
-
Christopher Meiklejohn.
On the composability of the Riak DT Map: Expanding from embedded to
multi-key structures.
In 1st Workshop on Principles and Practice of Eventual
Consistency, PaPEC 2014. ACM, 2014.
[ bib |
DOI |
http ]
Keywords: composition
-
[74]
-
Victor Grishchenko.
Citrea and Swarm: Partially ordered op logs in the browser.
In 1st Workshop on Principles and Practice of Eventual
Consistency, PaPEC 2014. ACM, April 2014.
[ bib |
DOI |
.pdf ]
Keywords: text-editing, operation-based
-
[75]
-
Lindsey Kuper and Ryan R Newton.
Joining forces: Toward a unified account of LVars and convergent
replicated data types.
In 5th Workshop on Determinism and Correctness in Parallel
Programming, WoDet 2014, March 2014.
[ bib |
.pdf ]
Keywords: crdt-related, shared-memory concurrency
-
[76]
-
Sebastian Burckhardt, Alexey Gotsman, Hongseok Yang, and Marek Zawirski.
Replicated data types: Specification, verification, optimality.
In 41st ACM SIGPLAN-SIGACT Symposium on Principles of
Programming Languages, POPL 2014, pages 271--284. ACM, January 2014.
[ bib |
DOI |
.pdf ]
Keywords: specification, verification
-
[77]
-
Mehdi Ahmed-Nacer, Pascal Urso, Valter Balegas, and Nuno Preguiça.
Concurrency control and awareness support for multi-synchronous
collaborative editing.
In 9th IEEE International Conference on Collaborative
Computing, CollaborateCom 2013. ICST, October 2013.
[ bib |
DOI |
.pdf ]
Keywords: text-editing
-
[78]
-
Brice Nédelec, Pascal Molli, Achour Mostefaoui, and Emmanuel Desmontils.
LSEQ: an adaptive structure for sequences in distributed
collaborative editing.
In 13th ACM Symposium on Document Engineering, DocEng 2013,
pages 37--46. ACM, September 2013.
[ bib |
DOI |
.pdf ]
Keywords: text-editing, LSEQ
-
[79]
-
Paulo Sérgio Almeida and Carlos Baquero.
Scalable eventually consistent counters over unreliable networks.
July 2013.
[ bib |
arXiv |
http ]
Keywords: counters
-
[80]
-
Erwan Le Merrer, Nicolas Le Scouarnec, and Gilles Straub.
Bitbox: Eventually consistent file sharing.
In 1st International Conference on Networked Systems, NETYS
2013, page 274–278. Springer LNCS volume 7853, May 2013.
[ bib |
DOI ]
Keywords: systems, Bitbox
-
[81]
-
David Navalho, Sérgio Duarte, Nuno Preguiça, and Marc Shapiro.
Incremental stream processing using computational conflict-free
replicated data types.
In 3rd International Workshop on Cloud Data and Platforms,
CloudDP 2013, pages 31--36. ACM, April 2013.
[ bib |
DOI |
.pdf ]
Keywords: computation
-
[82]
-
Hien Thi Thu Truong, Claudia-Lavinia Ignat, and Pascal Molli.
Authenticating operation-based history in collaborative systems.
In 17th ACM International Conference on Supporting Group Work,
GROUP 2012, pages 131--140. ACM, October 2012.
[ bib |
DOI |
http ]
Keywords: security
-
[83]
-
Neil Conway, William R. Marczak, Peter Alvaro, Joseph M. Hellerstein, and David
Maier.
Logic and lattices for distributed programming.
In 3rd ACM Symposium on Cloud Computing, SoCC 2012, pages
1--14. ACM, October 2012.
[ bib |
DOI |
.pdf ]
Keywords: crdt-related
-
[84]
-
Annette Bieniusa, Marek Zawirski, Nuno Preguiça, Marc Shapiro, Carlos
Baquero, Valter Balegas, and Sérgio Duarte.
Brief announcement: Semantics of eventually consistent replicated
sets.
In 26th International Symposium on Distributed Computing, DISC
2012, pages 441--442. Springer LNCS volume 7611, October 2012.
[ bib |
DOI |
.pdf ]
Keywords: set-crdt, specification
-
[85]
-
Annette Bieniusa, Marek Zawirski, Nuno Preguiça, Marc Shapiro, Carlos
Baquero, Valter Balegas, and Sérgio Duarte.
An optimized conflict-free replicated set.
Research Report RR-8083, INRIA, October 2012.
[ bib |
arXiv |
.pdf ]
Keywords: set-crdt
-
[86]
-
Mehdi Ahmed-Nacer, Stéphane Martin, and Pascal Urso.
File system on CRDT.
Research Report RR-8027, INRIA, July 2012.
[ bib |
arXiv |
http ]
Keywords: trees
-
[87]
-
Sebastian Burckhardt, Manuel Fähndrich, Daan Leijen, and Benjamin P Wood.
Cloud types for eventual consistency.
In 26th European Conference on Object-Oriented Programming,
ECOOP 2012, pages 283--307. Springer LNCS volume 7313, June 2012.
[ bib |
DOI |
.pdf ]
Keywords: crdt-related
-
[88]
-
Sebastian Burckhardt, Daan Leijen, Manuel Fähndrich, and Mooly Sagiv.
Eventually consistent transactions.
In 21st European Symposium on Programming, ESOP 2012, pages
67--86. Springer LNCS volume 7211, March 2012.
[ bib |
DOI |
.pdf ]
Keywords: crdt-related, transactions
-
[89]
-
Marc Shapiro, Nuno Preguiça, Carlos Baquero, and Marek Zawirski.
Conflict-free replicated data types.
In 13th International Conference on Stabilization, Safety, and
Security of Distributed Systems, SSS 2011, pages 386--400. Springer LNCS
volume 6976, October 2011.
[ bib |
DOI |
.pdf ]
Keywords: introduction
-
[90]
-
Mehdi Ahmed-Nacer, Claudia-Lavinia Ignat, Gérald Oster, Hyun-Gul Roh, and
Pascal Urso.
Evaluating CRDTs for real-time document editing.
In 11th ACM Symposium on Document Engineering, DocEng 2011,
pages 103--112. ACM, September 2011.
[ bib |
DOI |
.pdf ]
Keywords: text-editing
-
[91]
-
Hyun-Gul Roh, Myeongjae Jeon, Jin-Soo Kim, and Joonwon Lee.
Replicated abstract data types: Building blocks for collaborative
applications.
Journal of Parallel and Distributed Computing, 71(3):354--368,
March 2011.
[ bib |
DOI |
.pdf ]
Keywords: text-editing, RGA
-
[92]
-
Marc Shapiro, Nuno Preguiça, Carlos Baquero, and Marek Zawirski.
A comprehensive study of convergent and commutative replicated data
types.
Research Report 7506, INRIA, January 2011.
[ bib |
http ]
Keywords: introduction
-
[93]
-
Stéphane Martin, Pascal Urso, and Stéphane Weiss.
Scalable XML collaborative editing with undo.
In On the Move to Meaningful Internet Systems (OTM), pages
507--514. Springer LNCS volume 6426, October 2010.
[ bib |
DOI |
arXiv ]
Keywords: trees, undo
-
[94]
-
Stephane Weiss, Pascal Urso, and Pascal Molli.
Logoot-Undo: Distributed collaborative editing system on P2P
networks.
IEEE Transactions on Parallel and Distributed Systems,
21(8):1162--1174, August 2010.
[ bib |
DOI |
.pdf ]
Keywords: text-editing, Logoot, undo
-
[95]
-
Victor Grishchenko.
Deep hypertext with embedded revision control implemented in regular
expressions.
In 6th International Symposium on Wikis and Open Collaboration,
WikiSym 2010. ACM, July 2010.
[ bib |
DOI |
.pdf ]
Keywords: text-editing
-
[96]
-
Mihai Letia, Nuno Preguiça, and Marc Shapiro.
Consistency without concurrency control in large, dynamic systems.
ACM SIGOPS Operating Systems Review, 44(2):29--34, April 2010.
[ bib |
DOI |
.pdf ]
Keywords: introduction
-
[97]
-
Nuno Preguiça, Joan Manuel Marques, Marc Shapiro, and Mihai Letia.
A commutative replicated data type for cooperative editing.
In 29th IEEE International Conference on Distributed Computing
Systems, ICDCS 2009, pages 395--403. IEEE, 2009.
[ bib |
DOI |
http ]
Keywords: text-editing, Treedoc
-
[98]
-
Stephane Weiss, Pascal Urso, and Pascal Molli.
Logoot: A scalable optimistic replication algorithm for
collaborative editing on P2P networks.
In 29th IEEE International Conference on Distributed Computing
Systems, ICDCS 2009, pages 404--412. IEEE, 2009.
[ bib |
DOI |
http ]
Keywords: text-editing, Logoot
-
[99]
-
Stéphane Weiss, Pascal Urso, and Pascal Molli.
Wooki: A P2P wiki-based collaborative writing tool.
In 8th International Conference on Web Information Systems
Engineering, WISE 2007, pages 503--512. Springer LNCS volume 4831, December
2007.
[ bib |
DOI |
.pdf ]
Keywords: text-editing, WOOTO
-
[100]
-
Gérald Oster, Pascal Urso, Pascal Molli, and Abdessamad Imine.
Data consistency for P2P collaborative editing.
In 20th ACM Conference on Computer Supported Cooperative Work,
CSCW 2006, pages 259--268. ACM, November 2006.
[ bib |
DOI |
.pdf ]
Keywords: text-editing, WOOT
-
[101]
-
Gérald Oster, Pascal Urso, Pascal Molli, and Abdessamad Imine.
Real time group editors without operational transformation.
Research Report RR-5580, INRIA, May 2005.
[ bib |
http ]
Keywords: text-editing, WOOT


Continuing on from my earlier post, I’m now looking to tackle the question:
If you had to pick 3 beers to recommend using only this data, which would you pick?
This is a pretty open ended question, which is kind of fun. I also don’t really have a ton of experience (yet!) in recommendation systems, though I have done a little reading here or there on it.
My goals in coming up with three beers to recommend were to:
- Try to find the most popular beer among super users of the website
- Find a bizzaro beer that matched the profile of my first beer, but lives in the long tail of the ratings distribution
- Find the best Beer sans Booze (Highest Rating with lowest ABV)
So let’s begin! Here’s how I went about tackling this question.
Popular with Super Users
#=====================================================================================#
# Following suit of the last post...
#=====================================================================================#
# Library
library(ggplot2)
library(data.table)
library(stringr)
#=====================================================================================#
beer <- fread("data/beer_reviews.csv")
beer.complete <- beer[complete.cases(beer)]
#=====================================================================================#
Having more experience in experimental settings, one of the first things I needed to get used to when I started working with non-psychology datasets was the lack of complete sets in what felt like almost everything. Whereas in the lab we spend lots of time trying to design balanced studies that hopefully don’t violate the litany of assumptions that classic null hypothesis significance testing demands, my first few attempts at analyzing large amounts of data made me realize it’s almost risible to think that you’re going to have even, independent data, ever. This dataset is no different.
Of all of the unique users on the site, most of them have done only a couple of reviews, but some have essentially made a job out of this. Looking at the distribution of reviews, this is quite clear.
review.counts <- beer[, .(.N), by = review_profilename][order(-N)]
review.counts
## review_profilename N
## 1: northyorksammy 5817
## 2: BuckeyeNation 4661
## 3: mikesgroove 4617
## 4: Thorpe429 3518
## 5: womencantsail 3497
## ---
## 33384: beilfussd 1
## 33385: MPHSours11 1
## 33386: jennaizzel 1
## 33387: hogshead 1
## 33388: joeebbs 1
hist(beer[, .(.N), by = review_profilename][order(-N)]$N,
breaks = 200,
xlab = "Number of Reviews",
main = "Distribution of Reviews Per User")
This is pretty important when it comes to modeling the data (discussed in Part III), and not being fully aware of where your ratings are coming from could put the quality of your models at serious risk.
So looking at this dataset, I wondered if there were any sort of implicit assumptions I could make about this data that might be able to help me find a good beer. One assumption that I didn’t think was too wild was that a sample of this population that had gone out of its way to rate over 500 beers was probably more of a beer expert than those who have only done a couple of reviews on the site.
One thing I wanted to check was: of all the 1.5 million reviews, where were they coming from? Were there enough reviews among the super users that I could use? And what made someone a super user? I could have been a bit more scientific, setting an a priori threshold, but for this I kind of just looked at that chart above, spit balled thinking 500 might be a good number to check, and then went to see how much of the data would be accounted if I put my threshold there. I lucked out and got about half of it.
sum(review.counts$N) # Number of Total Reviews
## [1] 1586614
sum(review.counts[ N > 500]$N) # Number of Reviews from Super Users
## [1] 731066
731066/1586614 # Percent of Total Reviews from 500+ Super Users
## [1] 0.4607712
super.users <- review.counts[ N > 500] # I can settle for .75 Million Reviews
So now I had a list of the users who had completed over 500 reviews and made up 46% of our entire data. I could use this new table I had made to index through our dataset of all the reviews that I had (that have their ABV ratings!) so I was then only dealing with these higher quality reviewers.
super.reviews <- super.users[beer.complete, on = "review_profilename", nomatch=0]
As I continued to chop down the dataset (since this was a very exploratory process compared with cleaning up an experiment), it was important to do quality assessment steps. One thing worth checking here was to see if I was actually dealing with beer omnivores in our super users and make sure that all different types of beers were being represented in our smaller subset. This was done by just looking at the number of rows between the original dataset and our super user table.
super.reviews[, .(beer_styles = unique(beer_style))]
## beer_styles
## 1: Hefeweizen
## 2: English Strong Ale
## 3: Foreign / Export Stout
## 4: German Pilsener
## 5: American Double / Imperial IPA
## ---
## 100: Japanese Rice Lager
## 101: Roggenbier
## 102: Happoshu
## 103: Sahti
## 104: Bière de Champagne / Bière Brut
beer[, .(beer_styles = unique(beer_style))]
## beer_styles
## 1: Hefeweizen
## 2: English Strong Ale
## 3: Foreign / Export Stout
## 4: German Pilsener
## 5: American Double / Imperial IPA
## ---
## 100: Gueuze
## 101: Gose
## 102: Happoshu
## 103: Sahti
## 104: Bière de Champagne / Bière Brut
Luckily they were the same. If I were to really do some more work on this dataset, I would also want to check things such as how many of the beers had each super user tried? Were there IPA experts in the group? If yes, should their opinions be taken more seriously if I had questions about IPA recommendations in the future? But for now, I just set out to see what the highest rated beer among all the super users of this dataset was.
In order to answer that question, I had to find out which beer in specific had the highest mean rating.
The dataset ‘as is’ comes with a beer_id
unique ID, but the data downloaded as is does not give us a key to this, so I had to make it myself.
This was accomplished by just pasting together the brewery’s name, along with the beer name, and style into a new variable.
As another quality assurance step, it was worth checking to see if this recreated the unique ID variable, which it didn’t do exactly… but it was pretty close. I would chalk that up to some sort of encoding error.
super.reviews[, beer_name_unique := paste(brewery_name,beer_name, beer_style)]
length(unique(super.reviews$beer_beerid))
## [1] 42825
length(unique(super.reviews$beer_name_unique))
## [1] 42703
42703/42805 # Pretty close
## [1] 0.9976171
super.reviews.popular <- super.reviews[, .(most_reviewed_beers = .N),
by = beer_name_unique][order(-most_reviewed_beers)]
hist(super.reviews.popular$most_reviewed_beers,
main = "Distribution of Number of Ratings by Super Users",
xlab = "Number of Reviews each Beer Recieves",
breaks = 200)
Again I saw this was clearly not anything resembling a repeated measures experiment and not all beers were rated equally.
Continuing in the same fashion above, I just grabbed the top 100 beers of our super users and merged that on to our table from earlier that had all of the ratings from our super users. Then from that table, I took the average of the overall rating and looked at our top ten beers.
super.reviews.popular.100 <- super.reviews[, .(most_reviewed_beers = .N), by = beer_name_unique][order(-most_reviewed_beers)][1:100]
super.reviews.cream.of.crop <- super.reviews.popular.100[super.reviews,
on = "beer_name_unique",
nomatch=0]
super.reviews.cream.of.crop[, .(mean_review_overall = mean(review_overall)), by = beer_name_unique][order(-mean_review_overall)][1:10]
## beer_name_unique
## 1: Russian River Brewing Company Pliny The Elder American Double / Imperial IPA
## 2: Bayerische Staatsbrauerei Weihenstephan Weihenstephaner Hefeweissbier Hefeweizen
## 3: Tröegs Brewing Company Tröegs Nugget Nectar American Amber / Red Ale
## 4: Ballast Point Brewing Company Sculpin India Pale Ale American IPA
## 5: Three Floyds Brewing Co. & Brewpub Dreadnaught IPA American Double / Imperial IPA
## 6: Founders Brewing Company Founders KBS (Kentucky Breakfast Stout) American Double / Imperial Stout
## 7: Bell's Brewery, Inc. Two Hearted Ale American IPA
## 8: Bell's Brewery, Inc. Bell's Hopslam Ale American Double / Imperial IPA
## 9: Three Floyds Brewing Co. & Brewpub Alpha King Pale Ale American Pale Ale (APA)
## 10: Founders Brewing Company Founders Breakfast Stout American Double / Imperial Stout
## mean_review_overall
## 1: 4.536630
## 2: 4.535072
## 3: 4.449084
## 4: 4.443287
## 5: 4.367580
## 6: 4.366876
## 7: 4.353270
## 8: 4.349810
## 9: 4.346652
## 10: 4.334526
And we have our winner! It’s Pliny The Elder from Russian River Brewing Company as my first beer recommendation!
Bizzaro Beer
Now Pliny The Elder seemed to be a pretty popular beer. But what if I was trying to sketch out some ideas about what other beers I could recommend to beer lovers who like Pliny The Elder? It needed to somewhat “look like” the target beer, but have way less reviews.
Playing with some of the fringe data here, I wanted to be careful not to again pick a beer with only one or two ratings on it. My rationale was coming from assuming there is some sort of true “population mean” for this beer and having a beer with too little reviews will not approximate the mean correctly.
## Make Unique Beer Label for Larger Dataset
beer[, beer_name_unique := paste(brewery_name,beer_name, beer_style)]
## Count Number of Reviews Each Beer Has
number.of.reviews <- beer[, .(NumberOfReviews = .N), by = beer_name_unique][order(-NumberOfReviews)]
## Only get beers with over 30 reviews
reliable.beers.list <- number.of.reviews[ NumberOfReviews >= 30 ]
## Join that to our big 'beer' dataset only matching beers with over 30 reviews
beer.reliable <- reliable.beers.list[beer, on = "beer_name_unique", nomatch=0]
With our dataset chiseled down to only ‘reliable’ beers, I needed to find a way to get some sort of profile of each of the beers. While my first instinct was to do some sort of data reductive type thing like a PCA on our continuous variables and use distances from certain scores as metrics of similarity (which I have done before and it ended up actually being the inspiration for a tool currently used by Soundout!), doing that on so few predictors seemed extra.
So instead, I figured why not just assume that there is some sort of wiggle room in my hastily made recommendation system and just match first on the overall review, then if there are some close contenders, look for matches on other metrics?
The next bit of code creates a table of the metrics I am interested in, gets beers that have over 30 reviews, but less than 100, and also creates a vector so I can pull out all of the IPAs on my less reviewed beers table. I then joined the tables for my candidates.
# # Get metrics used for distance calculations
beer.metrics <- beer.reliable[, .(mean_review_overall = mean(review_overall),
mean_review_aroma = mean(review_overall),
mean_review_appearance = mean(review_appearance),
mean_review_palate = mean(review_palate),
mean_reviw_taste = mean(review_taste),
sd_review_overall = sd(review_overall),
sd_review_aroma = sd(review_overall),
sd_review_appearance = sd(review_appearance),
sd_review_palate = sd(review_palate),
sd_review_taste = sd(review_taste)),
by = beer_name_unique]
## Get only IPAs with less than 100 reviews
less.reviewed.beers <- number.of.reviews[NumberOfReviews <= 100 & NumberOfReviews >= 30]
## Make vector to help find IPAs
find.IPA <- str_detect(string = less.reviewed.beers$beer_name_unique, pattern = "Imperial IPA")
bizzaro.candidates <- less.reviewed.beers[find.IPA]
#Create Table
bizzaro.candidates.metrics <- bizzaro.candidates[beer.metrics, on = "beer_name_unique", nomatch=0]
Of these less reviewed beers, I now needed to find the one that was “closest” on the few dimensions I had to work with. The simplest way to do this would be to just subtract our target beer (Pliny The Elder), from every other beer in our interested list, then check out the results.
## Get metrics for our target beer
rrbcpteadii.metrics <- beer[beer_name_unique == "Russian River Brewing Company Pliny The Elder American Double / Imperial IPA",
.(mean_review_overall = mean(review_overall),
mean_review_aroma = mean(review_overall),
mean_review_appearance = mean(review_appearance),
mean_review_palate = mean(review_palate),
mean_reviw_taste = mean(review_taste),
sd_review_overall = sd(review_overall),
sd_review_aroma = sd(review_overall),
sd_review_appearance = sd(review_appearance),
sd_review_palate = sd(review_palate),
sd_review_taste = sd(review_taste))]
## Create vector for looping over
key.vector <- as.vector(rrbcpteadii.metrics)
## Pull off the tags of our search
search.vector <- bizzaro.candidates.metrics[, -c(1,2)]
## Sanity check that what we are going to subtract has same names
names(key.vector)
## [1] "mean_review_overall" "mean_review_aroma"
## [3] "mean_review_appearance" "mean_review_palate"
## [5] "mean_reviw_taste" "sd_review_overall"
## [7] "sd_review_aroma" "sd_review_appearance"
## [9] "sd_review_palate" "sd_review_taste"
names(search.vector)
## [1] "mean_review_overall" "mean_review_aroma"
## [3] "mean_review_appearance" "mean_review_palate"
## [5] "mean_reviw_taste" "sd_review_overall"
## [7] "sd_review_aroma" "sd_review_appearance"
## [9] "sd_review_palate" "sd_review_taste"
## And that the apply function I am going to run is doing what I think it will
search.vector[1]- key.vector
## mean_review_overall mean_review_aroma mean_review_appearance
## 1: -0.7900277 -0.7900277 -0.6386031
## mean_review_palate mean_reviw_taste sd_review_overall sd_review_aroma
## 1: -0.6263257 -0.8393187 0.09103239 0.09103239
## sd_review_appearance sd_review_palate sd_review_taste
## 1: 0.1273011 0.11882 0.1073594
## Run apply function
ipa.distances <- apply(search.vector, 1, function(x) x - key.vector)
ipa.distances.dt <- data.table(do.call(rbind.data.frame,ipa.distances))
## Combine this back with vector with names
bizzaro.candidates.distances <- cbind(bizzaro.candidates.metrics, ipa.distances.dt)
## Sort our data by overall and see if we have a good match!
bizzaro.candidates.distances[order(-mean_review_overall)]
## beer_name_unique
## 1: Hill Farmstead Brewery Galaxy Imperial Single Hop IPA American Double / Imperial IPA
## 2: Lawson's Finest Liquids Double Sunshine IPA American Double / Imperial IPA
## 3: Kern River Brewing Company 5th Anniversary Ale American Double / Imperial IPA
## 4: Alpine Beer Company Bad Boy American Double / Imperial IPA
## 5: Iron Hill Brewery & Restaurant Kryptonite American Double / Imperial IPA
## ---
## 132: BrewDog Sink The Bismarck! American Double / Imperial IPA
## 133: Blue Frog Grog & Grill The Big DIPA American Double / Imperial IPA
## 134: Hermitage Brewing Hoptopia American Double / Imperial IPA
## 135: Florida Beer Company Swamp Ape IPA American Double / Imperial IPA
## 136: BrewDog Storm (Islay Whisky Cask Aged IPA) American Double / Imperial IPA
## NumberOfReviews mean_review_overall mean_review_aroma
## 1: 76 4.592105 4.592105
## 2: 85 4.588235 4.588235
## 3: 41 4.475610 4.475610
## 4: 79 4.468354 4.468354
## 5: 44 4.443182 4.443182
## ---
## 132: 76 3.197368 3.197368
## 133: 53 2.867925 2.867925
## 134: 32 2.687500 2.687500
## 135: 52 2.615385 2.615385
## 136: 92 2.440217 2.440217
## mean_review_appearance mean_review_palate mean_reviw_taste
## 1: 4.368421 4.440789 4.559211
## 2: 4.317647 4.311765 4.552941
## 3: 4.329268 4.219512 4.500000
## 4: 4.234177 4.335443 4.474684
## 5: 4.284091 4.318182 4.420455
## ---
## 132: 3.835526 3.401316 3.539474
## 133: 3.433962 3.047170 2.801887
## 134: 3.500000 2.890625 2.500000
## 135: 3.442308 3.009615 2.586538
## 136: 2.902174 2.836957 2.706522
## sd_review_overall sd_review_aroma sd_review_appearance
## 1: 0.3337716 0.3337716 0.3861642
## 2: 0.3289275 0.3289275 0.3845766
## 3: 0.3865103 0.3865103 0.3641730
## 4: 0.3698733 0.3698733 0.3741267
## 5: 0.3768892 0.3768892 0.3796836
## ---
## 132: 1.2438621 1.2438621 0.7136206
## 133: 0.8995241 0.8995241 0.6866707
## 134: 1.2427207 1.2427207 0.4918694
## 135: 0.9108033 0.9108033 0.5994593
## 136: 0.9829379 0.9829379 0.6843587
## sd_review_palate sd_review_taste mean_review_overall
## 1: 0.3997258 0.3826844 0.002077562
## 2: 0.4293993 0.3620669 -0.001792407
## 3: 0.4749840 0.4873397 -0.114417945
## 4: 0.4060561 0.3660140 -0.121673270
## 5: 0.4586495 0.4026537 -0.146845883
## ---
## 132: 1.1431528 1.1277209 -1.392659280
## 133: 0.7355280 0.8165336 -1.722103173
## 134: 0.8005479 0.9418581 -1.902527701
## 135: 0.7637009 1.0035288 -1.974643085
## 136: 0.7883377 1.0086226 -2.149810310
## mean_review_aroma mean_review_appearance mean_review_palate
## 1: 0.002077562 -0.02018203 -0.01053621
## 2: -0.001792407 -0.07095603 -0.13956098
## 3: -0.114417945 -0.05933479 -0.23181349
## 4: -0.121673270 -0.15442587 -0.11588264
## 5: -0.146845883 -0.10451218 -0.13314386
## ---
## 132: -1.392659280 -0.55307677 -1.05000989
## 133: -1.722103173 -0.95464082 -1.40415587
## 134: -1.902527701 -0.88860309 -1.56070068
## 135: -1.974643085 -0.94629539 -1.44171030
## 136: -2.149810310 -1.48642917 -1.61436916
## mean_reviw_taste sd_review_overall sd_review_aroma
## 1: -0.07177483 -0.12136909 -0.12136909
## 2: -0.07804418 -0.12621327 -0.12621327
## 3: -0.13098536 -0.06863039 -0.06863039
## 4: -0.15630181 -0.08526747 -0.08526747
## 5: -0.21053081 -0.07825155 -0.07825155
## ---
## 132: -1.09151167 0.78872139 0.78872139
## 133: -1.82909857 0.44438341 0.44438341
## 134: -2.13098536 0.78758001 0.78758001
## 135: -2.04444690 0.45566254 0.45566254
## 136: -1.92446362 0.52779720 0.52779720
## sd_review_appearance sd_review_palate sd_review_taste
## 1: -0.01935577 -0.04762635 -0.03307969
## 2: -0.02094339 -0.01795284 -0.05369722
## 3: -0.04134702 0.02763182 0.07157561
## 4: -0.03139329 -0.04129607 -0.04975012
## 5: -0.02583641 0.01129741 -0.01311039
## ---
## 132: 0.30810063 0.69580063 0.71195677
## 133: 0.28115074 0.28817587 0.40076950
## 134: 0.08634938 0.35319581 0.52609404
## 135: 0.19393929 0.31634876 0.58776473
## 136: 0.27883874 0.34098558 0.59285853
Of course if I were building a real recommendation machine I could start talking about what factors are more important for what users and what factors are more predictive than others, but this seems like an OK enough solution to at least have completed my a priori goal.
Based on this solution, it looks like I will have to find myself a bottle of Pliny The Elder and the Hill Farmstead Brewery Galaxy Imperial Single Hop IPA American Double / Imperial IPA and do some of my own empirical work to see if this was a good idea.
Beer sans Booze
The last beer that I think I wanted to recommend would be one that tastes great, but does not have a lot of alcohol in it. The reason this question kind of interests me is because if we are really going to talk about how tasty a beer is, it would be nice to be able to factor out of the equation how drunk we are actually getting from it.
I can see first of all IF this relationship exists if we look at the mean overall rating of a beer as a function of its ABV content.
beer.complete[, beer_name_unique := paste(brewery_name,beer_name, beer_style) ]
# ABVs and Mean Scores
abv.vs.mean <- beer.complete[, .(Abv = mean(beer_abv), MeanOverall = mean(review_overall)), by = beer_name_unique]
ggplot(abv.vs.mean[Abv < 20], aes(x = Abv, y = MeanOverall)) +
geom_point() +
geom_smooth(method = "lm", color = "blue") +
geom_smooth(method = "lm", formula = y ~ poly(x,2), color = "orange") +
labs(title = "Rating as Function of ABV (Beers with than 20% ABV)",
x = "ABV Content",
y = "Mean Overall Rating")
Surprisingly, when I ran some quick and dirty regression models (that yes, I know violate tons of assumptions) I saw that only a very small amount of variance was being explained by its ABV. Note that although the models were significant, the R squared values hovered around 3-5%!
# "The More Booze The Better" Model
abv.linear <- lm(MeanOverall ~ Abv, data = abv.vs.mean[Abv < 20])
# The "Diminishing Returns Model "
abv.poly <- lm(MeanOverall ~ poly(Abv,2), data = abv.vs.mean[Abv < 20])
# The "Dissapointing Amount of Variance Explained Summaries"
summary(abv.linear)
##
## Call:
## lm(formula = MeanOverall ~ Abv, data = abv.vs.mean[Abv < 20])
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.06793 -0.27278 0.09684 0.38850 1.72081
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.276138 0.008995 364.20 <2e-16 ***
## Abv 0.060975 0.001369 44.55 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6013 on 48822 degrees of freedom
## Multiple R-squared: 0.03906, Adjusted R-squared: 0.03904
## F-statistic: 1984 on 1 and 48822 DF, p-value: < 2.2e-16
summary(abv.poly)
##
## Call:
## lm(formula = MeanOverall ~ poly(Abv, 2), data = abv.vs.mean[Abv <
## 20])
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.88738 -0.28351 0.09695 0.37907 2.17585
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.658087 0.002706 1351.73 <2e-16 ***
## poly(Abv, 2)1 26.785156 0.597970 44.79 <2e-16 ***
## poly(Abv, 2)2 -13.922969 0.597970 -23.28 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.598 on 48821 degrees of freedom
## Multiple R-squared: 0.04961, Adjusted R-squared: 0.04957
## F-statistic: 1274 on 2 and 48821 DF, p-value: < 2.2e-16
This actually surprised me and might be worth looking into at a deeper level another time, but for now I want to keep going on and find a beer knowing that how much booze is in it doesn’t really affect how good it is.
So let’s take one final dive into the dataset, grab only our quality reviews then plot a subset of our data so I can see beers that have a very high overall rating with a very small amount of booze in them.
# Quality Assurance Step
reliable.and.abv.beers <- reliable.beers.list[beer.complete, on = "beer_name_unique", nomatch=0]
## Get mean ratings and keep ABV (which won't change if I average it)
dd.beers <- reliable.and.abv.beers[, .(mean_overall = mean(review_overall), abv = mean(beer_abv)), by = "beer_name_unique"]
# Only Beers that Fit Our Criterion
dd.beers.2 <- dd.beers[mean_overall > 4.6 & abv < 10]
# Plot It!
ggplot(dd.beers.2, aes(x = abv, y = mean_overall, label = beer_name_unique, color = beer_name_unique)) +
geom_point() +
geom_text(aes(label=beer_name_unique),hjust=-.01, vjust=0) +
labs(title = "High Quality Beers with Low ABV",
x = "ABV",
y = "Mean Overall Rating") + theme(legend.position = "none") +
xlim(0, 20) +
scale_y_continuous(breaks = c(seq(4.6,5,.1)), limits = c(4.6,4.85))
These are all OK choices (most of the beers are still above 5% ABV), but we do have one beer clocking in at 2.0% ABV giving us our final beer recommendation – the Southampton Publick House Southampton Berliner Weisse Berliner Weissbier!
Summary
After all of this, I know have three beers to check out. Pliny The Elder is our winner for the top rated beer among our Super Users of the site, the Hill Farmstead Brewery Galaxy Imperial Single Hop IPA American Double / Imperial IPA is a beer to maybe follow up on from our first choice, and then lastly we have the the Southampton Publick House Southampton Berliner Weisse Berliner Weissbier which supposedly tastes great, despite its lack of alcohol content.


sqlsrv_errors
(No version information available, might only be in Git)
sqlsrv_errors — Returns error and warning information about the last SQLSRV
operation performed
说明
mixed sqlsrv_errors ([ int $errorsOrWarnings ] )
Returns error and warning information about the last SQLSRV operation
performed.
参数
errorsOrWarnings
Determines whether error information, warning information, or both are
returned. If this parameter is not supplied, both error information and
warning information are returned. The following are the supported values
for this parameter: SQLSRV_ERR_ALL, SQLSRV_ERR_ERRORS, SQLSRV_ERR_WARNINGS.
返回值
If errors and/or warnings occurred on the last sqlsrv operation, an array of
arrays containing error information is returned. If no errors and/or warnings
occurred on the last sqlsrv operation, NULL is returned. The following table
describes the structure of the returned arrays:
Array returned by sqlsrv_errors
Key Description
For errors that originate from the ODBC driver, the SQLSTATE returned
SQLSTATE by ODBC. For errors that originate from the Microsoft Drivers for PHP
for SQL Server, a SQLSTATE of IMSSP. For warnings that originate from
the Microsoft Drivers for PHP for SQL Server, a SQLSTATE of 01SSP.
For errors that originate from SQL Server, the native SQL Server error
code. For errors that originate from the ODBC driver, the error code
code returned by ODBC. For errors that originate from the Microsoft Drivers
for PHP for SQL Server, the Microsoft Drivers for PHP for SQL Server
error code.
message A description of the error.
范例
Example #1 functionname() example
"dbName", "UID"=>"username", "PWD"=>
"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
die( print_r( sqlsrv_errors(), true));
}
/* Set up a query to select an invalid column name. */
$sql = "SELECT BadColumnName FROM Table_1";
/* Execution of the query will fail because of the bad column name. */
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt === false ) {
if( ($errors = sqlsrv_errors() ) != null) {
foreach( $errors as $error ) {
echo "SQLSTATE: ".$error[ 'SQLSTATE']."
";
echo "code: ".$error[ 'code']."
";
echo "message: ".$error[ 'message']."
";
}
}
}
?>
注释
By default, warnings generated on a call to any SQLSRV function are treated as
errors. This means that if a warning occurs on a call to a SQLSRV function, the
function returns FALSE. However, warnings that correspond to SQLSTATE values
01000, 01001, 01003, and 01S02 are never treated as errors. For information
about changing this behavior, see sqlsrv_configure() and the
WarningsReturnAsErrors setting.
参见
• sqlsrv_configure() - Changes the driver error handling and logging
configurations


Tell us who you are:
Set up your account:
Check this box if Whatsapp number and Contact Number are the same


Bourbon or Scotch? A droplet’s dynamics reveal the truth
A whisky’s country of origin can be gleaned from the residue of an evaporated droplet.
American whiskies that evaporate off a surface leave distinctive, web-like patterns that distinguish them from Scotch whisky and from each other.
When a drop of Scotch whisky evaporates, it leaves behind a uniform film of particles that were suspended in the liquid and were imparted by the oak cask in which it aged. However, bourbon, an American type of whisky, is aged in charred oak containers, which impart more particles than their uncharred Scottish counterparts.
Stuart Williams and his colleagues at the University of Louisville in Kentucky found that if bourbon is slightly diluted, it too leaves a uniform mark following evaporation. But when bourbon is diluted to roughly 20% alcohol by volume, the particles that remain after evaporation assemble into strikingly intricate webs of filaments.
The particles initially form a film that is a single molecule thick on the drop’s surface. During evaporation, turbulent internal flows cause the drop to collapse into twisted strands.
Each brand of bourbon leaves its own unique pattern of filaments. These could be used to spot counterfeit bourbon whisky, the team writes.


route -n
sudo route add -net ip_address netmask netmask_address gw gw_address
sudo route del -net ip_address netmask netmask_address dev gw_address


A collection of coding functions as alternatives to the standard functions in the stats package, which have names starting with 'contr.'. Their main advantage is that they provide a consistent method for defining marginal effects in factorial models. In a simple one-way ANOVA model the intercept term is always the simple average of the class means.
| Version: | 0.3.2 |
| Depends: | stats |
| Imports: | Matrix, methods, fractional, utils |
| Suggests: | knitr, MASS, dplyr, car, ggplot2, xtable |
| Published: | 2018-02-18 |
| Author: | Bill Venables |
| Maintainer: | Bill Venables <Bill.Venables at gmail.com> |
| License: | GPL-2 | GPL-3 [expanded from: GPL (≥ 2)] |
| NeedsCompilation: | no |
| CRAN checks: | codingMatrices results |
| Reference manual: | codingMatrices.pdf |
| Vignettes: |
Coding and Contrast Matrices |
| Package source: | codingMatrices_0.3.2.tar.gz |
| Windows binaries: | r-devel: codingMatrices_0.3.2.zip, r-release: codingMatrices_0.3.2.zip, r-oldrel: codingMatrices_0.3.2.zip |
| OS X binaries: | r-release: codingMatrices_0.3.2.tgz, r-oldrel: codingMatrices_0.3.2.tgz |
| Old sources: | codingMatrices archive |
Please use the canonical form https://CRAN.R-project.org/package=codingMatrices to link to this page.


Videojs-hlsjs demo page.
Your browser doesn't support video. Please upgrade your browser to see the example.


Jose Mourinho to earn £15m-a-year at Tottenham, double of Pochettino's salary
- Jose Mourinho salary at Tottenham Hotspur has been revealed
- The Portuguese manager was appointed new boss of the Premier League giant after the sack of Pochettino
- Mourinho will now earn £15m-a-year at the club - double of the former manager's wages at the club
Tottenham Hotspur confirmed Jose Mourinho as their new manager after sacking their former boss Mauricio Pochettino.
The Argentine tactician was shown the exit door barely five years after leading them to their first-ever Champions League final last season.
Although they lost 2-0 to Liverpool after regulation period - his start to the new season has been awful as they currently rank 14th on the Premier League table.
Pochettino's struggles, however, led Spurs' chiefs to relieve him of his duty and hire Mourinho as his replacement.
READ ALSO: NAIJ.com upgrades to Legit.ng
And the former Manchester United manager will earn double the price of his predecessor (£15m-a-year) earned at the club until the expiration of his contract in 2023.
Super Eagles star beats Chelsea's N'Golo Kante to another EPL landmark
Mourinho's reign at the club begins this weekend with a trip to West Ham United as he hopes to revive their chances of finishing among the top four at the end of the season.
While reacting to his new appointment, the Portuguese tactician said: "I am excited to be joining a club with such a great heritage and such passionate supporters.
"The quality in both the squad and the academy excites me. Working with these players is what has attracted me."
Mourinho is not new to the Premier League, having won three Premier League titles while in charge of Chelsea FC.
PAY ATTENTION: Install Pitch Football App for FREE to get the latest football News & Scores
During his two and a half years reign as Manchester United boss, he won Europa League and EFL Cup titles before his relationship with the club's management went south.
Super Eagles star set to sign new bumper deal at top European club with release clause set at €100m
He has also won two Champions Leagues at FC Porto and Inter Milan, while his impact was felt at Real Madrid having led them to La Liga title with an incredible finish on the log.
Tottenham chairman Daniel Levy added after securing the services of the manager that: "In Jose we have one of the most successful managers in football.
"He has a wealth of experience, can inspire teams and is a great tactician. He has won honours at every club he has coached. We believe he will bring energy and belief to the dressing room."
Mourinho will be returning to football management for the first time since about a year he was sacked by Manchester United last December.
Legit.ng earlier reported that newly appointed Tottenham Hotspur boss Jose Mourinho has expressed delight after joining the Premier League side.
The Portuguese born tactician was named the new Spurs manager earlier today - few hours after the club sacked Mauricio Pochettino on Tuesday.
Out of favour Super Eagles striker set to join Turkish champions in January on 1 condition
Tottenham are currently 14th on the EPL table with 14 points after 12 matches, though, they are on course to reaching the Champions League knockout stage so far.
Abu Azeez: Meet the only Nigerian rated among top 50 beach soccer players worldwide | Legit TV


Such a perfect end to #cascadiaruby from @listrophy, telling us about SPAAAAAAACE!
8/12/2014, 5:32:10 PM
Favs: 1
Retweets: 1
link--- layout: tweet ---
Such a perfect end to #cascadiaruby from @listrophy, telling us about SPAAAAAAACE!
8/12/2014, 5:32:10 PM
Favs: 1
Retweets: 1
link


POC for an Angular 1.5.8 Wizard with declarative, user customizable steps
Required
Required
Required
Add
Required


[Gecode] Subversion
Mikael 'Zayenz' Lagerkvist
d00-mla at nada.kth.se
Wed Aug 17 15:21:26 CEST 2005
On Wed, 17 Aug 2005, Guido Tack wrote:
> Subversion has a lot of advantages over CVS. In my opinion, the most important
> improvements for us are
> * providing versioning for directories
> * proper handling of moving and removing files and directories
> * proper handling of branches and tags
> * offline diff and status - no need to contact the server to see your changes
> * better access control
<snip/>
> Of course this is a major decision, and we have to decide on this
> before the release. So, please try it out and tell me what you
> think of it.
I have tried the subversion repository now, and my first impression
is that it is easier to handle than cvs.
I think that the previously mentioned improvements over cvs are a
good motivation for switching.
The only issue that I have found is that some commands seem to be
rather slow. One example is viewing log-messages, doing 'svn log
int.hh --limit 2' takes 20 seconds on my machine, 7 seconds to
display the information and 13 seconds after. For a simple
log-request, like 'svn log INSTALL' (recently added, no changes), it
takes almost a second. I don't know if this is an issue with
subversion, my machine, or something else.
Regards,
Mikael
--
Mikael 'Zayenz' Lagerkvist, http://www.imit.kth.se/~zayenz/
More information about the gecode-users
mailing list


My name is Daniel Archibong, I'm a Front-End web developer from Akwa Ibom State. Currently studying computer science in University of Uyo, Uyo - Aks.
I code in HTML, CSS & JS + PHP
HNG Slack username:- @danielcomputer
link to #stage1
Reach me via mail


Use this form to show Montreal how great your lease offer is!
The main selling points of your offer. (ex. Renovated 4½ downtown)
# of rooms
$ / month
Any important information about the apartment or the lease
(ex. 5363 Lasalle Boul. H4H 1P2, Verdun)


--- layout: post title: |- Getting our green on at the PCL. Day 1 of the laser install. Check out first light here: date: '2011-03-07T19:14:00.000-05:00' author: Bob Sica tags: - LITRON - installation - laser modified_time: '2011-12-21T12:48:50.392-05:00' blogger_id: tag:blogger.com,1999:blog-736339229338318027.post-6291892580287550241 blogger_orig_url: http://blog.purplecrowlidar.ca/2011/03/getting-our-green-on-at-pcl-day-1-of.html ---


- A Message From Warren E. Buffett
- News Releases Updated July 1, 2014
- Annual & Interim Reports Updated May 2, 2014
- Warren Buffet's Letters to Berkshire Shareholders Updated March 1, 2014
- Link to SEC Filings
- Charlie Munger's Letters to Wesco Shareholders
- Corporate Governance
- Annual Meeting Information
- Links to Berkshire Subsidiary Companies
- Comparative Rights and Relative Prices of Class A and B Stock Updated January 20, 2010
- Owner's Manual To view the Owner's Manual you may use Adobe Acrobat Reader software. Click here to download. Updated March 1, 2014
- Order Berkshire Activewear On-line
- Letters from Warren E. Buffet Regarding Pledges to Make Gifts of Berkshire Stock Updated August 30, 2012
FOR A FREE CAR INSURANCE RATE QUOTE THAT COULD SAVE YOU SUBSTANTIAL MONEY http://www.GEICO.COM OR CALL 1-800-395-6349, 24 HOURS A DAY
If you have any comments about our WEB page, you can either write us at the address shown above or e-mail us at<EMAIL_ADDRESS>However, due to the limited number of personnel in our corporate office, we are unable to provide a direct response.
Legal Disclaimer
Copyright © 1978-2014Berkshire Hathaway Inc.


Ascendas Bike Pass Check Alerts
Inform about Checking
Anonymously notify other app users about checking
Is Checking happening at Gate #1?
{{ gate1Message }}
Is Checking happening at Gate #2?
{{ gate2Message }}
Subscribe for Alerts
You have subscribed to our services
You have not subscribed to our services yet
Subscribe
UnSubscribe


We, a group of coffee loving students, are discussing all of the ideas and good coffee beans to serve the world if we open a coffee house. Then, suddenly, one person said, why not go with our dreams and open a coffee house! And that is the beginning of coffee houses.
Our first coffee house was a success! It was opened at 2012, and gain high popularity within months! We were all over the local newspaper and food blogs. Soon our coffee house is always full of customers, and many have come up to offer more amazing ideas for mixed coffee beans. That’s when we have the idea to allow customers to selective the different kind of beans they want for the coffees. This have made our coffee house an even hotter spot for coffee lovers! And many good combination have been made into official menu to impress the world!
The objective of this project is to expand our coffee house, make it an international franchise and let the world taste our wonderful coffee!
Other objectives are:


Scrollback Keys
---------------
UpArrow Scroll a line back in the
buffer.
DownArrow Scroll a line forward in the buffer.
PageUp Scroll 24 lines back
in the buffer.
PageDn Scroll 24 lines forward
in the buffer.
Home Top of the
buffer.
End Bottom
of the buffer.
ESC Exit scrollback.
Editing
-------
RightArrow Move cursor right.
LeftArrow Move cursor left.
Home Move to the
start of the line.
End Move to
the end of the line.
Insert Toggle insert mode on/off.
DownArrow Clear the input line.
Ctrl+C Insert a break character.
Ctrl+] Insert an escape character.
Click here to return to previous page.


I was surprised how quickly I caught on to asking good questions in the Google+ community we utilized during Phase 0. Asking good questions has a purpose way beyond being curteous to your audience- it is completely in your self interest to do it if you ever want to get unstuck on your problem. Don't have a lot of time to kill waiting for an answer? Great- then be specific, include error messages, copy/paste your solution directly from your worksheet, and write a specific title/intro to your question.
I found the best way for me to get a clear answer was to post a question as concise and clear as possible. Including the link to my Github for longer code proved effective, especially since I could comment within the doc where I thought the problem was going wrong (or previous attempts).


{% extends 'administrator/main.html' %} {% load static %} {% load extra_tags %} {% load encrypt_tags %} {% block content %}
Selected courses would need to be reviewed by the course lecturer! After submission, you will not be allowed to select courses thereafter. So, you are advised to select all preferred courses.
Your Courses