From 3bce6f1ed005f14f6ad014ca124b0638e1741a3a Mon Sep 17 00:00:00 2001 From: Francisco Bischoff Date: Sat, 18 Aug 2018 11:32:08 +0100 Subject: [PATCH 1/7] docs --- DESCRIPTION | 2 +- R/tsmp-package.R | 2 +- README.Rmd | 6 +- README.html | 658 +++++++++++++++++++++++++ README.md | 10 +- docs/CODE_OF_CONDUCT.html | 178 +++++++ docs/LICENSE-text.html | 2 +- docs/LICENSE.html | 2 +- docs/authors.html | 2 +- docs/favicon.ico | Bin 0 -> 1083 bytes docs/index.html | 13 +- docs/news/index.html | 2 +- docs/reference/compute.f.meas.html | 2 +- docs/reference/fast.movavg.html | 2 +- docs/reference/fast.movsd.html | 2 +- docs/reference/fluss.cac.html | 2 +- docs/reference/fluss.extract.html | 2 +- docs/reference/fluss.html | 2 +- docs/reference/fluss.score.html | 2 +- docs/reference/fluss_data.html | 2 +- docs/reference/golden.section.2.html | 2 +- docs/reference/golden.section.html | 2 +- docs/reference/guide.search.html | 2 +- docs/reference/index.html | 4 +- docs/reference/mass.html | 2 +- docs/reference/mass.pre.html | 2 +- docs/reference/mode.html | 2 +- docs/reference/mstomp.html | 2 +- docs/reference/mstomp.par.html | 2 +- docs/reference/sdts.f.score.html | 2 +- docs/reference/sdts.predict.html | 2 +- docs/reference/sdts.train.html | 2 +- docs/reference/stamp.html | 2 +- docs/reference/stamp.par.html | 2 +- docs/reference/std.html | 2 +- docs/reference/test_data.html | 2 +- docs/reference/toy_data.html | 2 +- docs/reference/tsmp.html | 32 +- docs/reference/unconstrain.search.html | 2 +- man/tsmp.Rd | 2 +- 40 files changed, 889 insertions(+), 76 deletions(-) create mode 100644 README.html create mode 100644 docs/CODE_OF_CONDUCT.html create mode 100644 docs/favicon.ico diff --git a/DESCRIPTION b/DESCRIPTION index 6feaaef..8dbcb38 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: tsmp Type: Package Title: Time Series with Matrix Profile -Version: 0.2.13.9004 +Version: 0.2.13.9011 Authors@R: c( person("Francisco", "Bischoff", email = "fbischoff@med.up.pt", role = c("aut", "cre"), comment = c(ORCID = "https://orcid.org/0000-0002-5301-8672")), person("Michael", "Yeh", email = "myeh003@ucr.edu", role = c("res", "ccp", "ctb")) diff --git a/R/tsmp-package.R b/R/tsmp-package.R index 5dde173..320e0ed 100644 --- a/R/tsmp-package.R +++ b/R/tsmp-package.R @@ -1,4 +1,4 @@ -#' +#' @title Time Series with Matrix Profile #' @docType package #' @name tsmp #' @references diff --git a/README.Rmd b/README.Rmd index f2bcec2..4d4607d 100644 --- a/README.Rmd +++ b/README.Rmd @@ -15,7 +15,7 @@ knitr::opts_chunk$set( ) ``` -# Time Series Matrix-Profile +# Time Series with Matrix Profile ```{r include=FALSE} library(git2r) @@ -76,14 +76,14 @@ devtools::install_github("franzbischoff/tsmp") * Time Series Chains * FLUSS Arc Plot and SiMPle Arc Plot * Annotation vectors (e.g.: Stop-word MOTIF bias, Actionability bias) -* SiMPle-Fast (Fast Similarity Matrix-Profile for Music Analysis and Exploration) +* SiMPle-Fast (Fast Similarity Matrix Profile for Music Analysis and Exploration) * MOTIFs under Uniform Scaling * GPU-STOMP * Real-time version of previous algorithms (STAMPI, FLOSS, etc) * MASS Extensions (ADP, WQ, QwG) * SCRIMP (waiting for publication) -## Other projects with Matrix-Profile +## Other projects with Matrix Profile - Python: https://github.com/ZiyaoWei/pyMatrixProfile ## Code of Conduct diff --git a/README.html b/README.html new file mode 100644 index 0000000..d5ab71a --- /dev/null +++ b/README.html @@ -0,0 +1,658 @@ + + + + + + + + + + + + + + + + + + +

README

+

Francisco Bischoff - 18 Aug 2018

+ + +

Time Series with Matrix Profile

+

Packagist lifecycle Build Status codecov CRAN version

+

Overview

+

R Functions implementing UCR Matrix Profile Algorithm (http://www.cs.ucr.edu/~eamonn/MatrixProfile.html).

+

This is under development and is intended to be a general purpose MP toolkit

+

After basic tools are finished and API is mature, further functions for ‘Classification’, ‘MOTIF extraction’, ‘MDS visualization’ etc. will be added.

+

Please be welcome to suggest improvements.

+

Installation

+ +

Currently available Features

+ +

Road map

+ +

Other projects with Matrix Profile

+ +

Code of Conduct

+

Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

+ + + diff --git a/README.md b/README.md index f8aa9a3..27548d4 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Francisco Bischoff -# Time Series Matrix-Profile +# Time Series with Matrix Profile [![Packagist](https://img.shields.io/packagist/l/doctrine/orm.svg)](https://choosealicense.com/licenses/mit) [![lifecycle](https://img.shields.io/badge/lifecycle-maturing-blue.svg)](https://www.tidyverse.org/lifecycle/#maturing) @@ -60,7 +60,7 @@ devtools::install_github("franzbischoff/tsmp") - Time Series Chains - FLUSS Arc Plot and SiMPle Arc Plot - Annotation vectors (e.g.: Stop-word MOTIF bias, Actionability bias) - - SiMPle-Fast (Fast Similarity Matrix-Profile for Music Analysis and + - SiMPle-Fast (Fast Similarity Matrix Profile for Music Analysis and Exploration) - MOTIFs under Uniform Scaling - GPU-STOMP @@ -68,12 +68,12 @@ devtools::install_github("franzbischoff/tsmp") - MASS Extensions (ADP, WQ, QwG) - SCRIMP (waiting for publication) -## Other projects with Matrix-Profile +## Other projects with Matrix Profile - Python: ## Code of Conduct Please note that this project is released with a [Contributor Code of -Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to -abide by its terms. +Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree +to abide by its terms. diff --git a/docs/CODE_OF_CONDUCT.html b/docs/CODE_OF_CONDUCT.html new file mode 100644 index 0000000..ccf3621 --- /dev/null +++ b/docs/CODE_OF_CONDUCT.html @@ -0,0 +1,178 @@ + + + + + + + + +Contributor Covenant Code of Conduct • tsmp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ +
+
+ + +
+ +
+

+Our Pledge

+

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.

+
+
+

+Our Standards

+

Examples of behavior that contributes to creating a positive environment include:

+
    +
  • Using welcoming and inclusive language
  • +
  • Being respectful of differing viewpoints and experiences
  • +
  • Gracefully accepting constructive criticism
  • +
  • Focusing on what is best for the community
  • +
  • Showing empathy towards other community members
  • +
+

Examples of unacceptable behavior by participants include:

+
    +
  • The use of sexualized language or imagery and unwelcome sexual attention or advances
  • +
  • Trolling, insulting/derogatory comments, and personal or political attacks
  • +
  • Public or private harassment
  • +
  • Publishing others’ private information, such as a physical or electronic address, without explicit permission
  • +
  • Other conduct which could reasonably be considered inappropriate in a professional setting
  • +
+
+
+

+Our Responsibilities

+

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

+

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

+
+
+

+Scope

+

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

+
+
+

+Enforcement

+

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

+

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project’s leadership.

+
+
+

+Attribution

+

This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at http://contributor-covenant.org/version/1/4

+
+
+ +
+ +
+ + +
+ + +
+

Site built with pkgdown.

+
+ +
+
+ + + + + + diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html index c54b96b..c71fd24 100644 --- a/docs/LICENSE-text.html +++ b/docs/LICENSE-text.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/LICENSE.html b/docs/LICENSE.html index 9f5ec63..18239d4 100644 --- a/docs/LICENSE.html +++ b/docs/LICENSE.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/authors.html b/docs/authors.html index 005f86e..77faa61 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/favicon.ico b/docs/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..10b994ac977af701985b51fb50e7c08058b6f1ce GIT binary patch literal 1083 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?gFHN;HUHMdLYGF z;1OBOz`!jG!i)^F=12eq*-JcqUD+RT@NvrutgPJc#K6F;<>}%W5^?zKw7uEEi6Y19 z&G-7gxvJso?aaDS^kDzNwNw18c9gt)5K^MqQQxAF*HrrQ(m~IH7dp4jDlF@`(Dgvc z%T+2z^iycg9y8zBw`JOon{cj`_f`Jb=>4v?_`K!$pB3}JTcxFK5nNctmM`1rv#gip z%!AL*&B7HpZh0(-XbD-x%Az&(nN5gRmgD5vE8P+*CC$vG|DR2(m#?Ue-QU`DYlC>F zLc`m)duvlR?-1eo@OSsA8D|gO++6hKX*W-|t3{1OSop&A{9dXZE-9aXney;C+3_12 z7d&F&;n#lgO3Q*zNB5+EynIQCgMa@uZ`Bje3*X!_eSC-o8pYIEDx>b`gvc00*Xruy@- z6VDTKdHdvAgO^W<)nkv14bbae`~2k2_s$kP@9%40HcnTVcwzVP{=+9aI-V7M+PQ7n z_v$K_6}zLKez*BhJ4aUYT*`wRhM^0(eApg+jLMf?{_Xzt^-=HNw6OC(I3>#ZanCWk z{5-Ad>whgv6}K`S_+D5Z*K@p_-?MbBU4iITpBi~Kwkfq&3vHDq#`71M+)`5HYX8pn zPu#+y(PK$iuiAqxPb}`;xFE2t_W&ik!?#k2KtRkru} zrISkZreFSi&dg-;Gaa1+x3?GkGO78)(JyzfoxdtBzWrk0j*5+j2^%$%K7THFIq6Dy zk@urji=GBndR nFtjo-*uLkG5sHS~{FKbJO57TbJ*?^jYGCkm^>bP0l+XkKfECs7 literal 0 HcmV?d00001 diff --git a/docs/index.html b/docs/index.html index 6581c08..a98128b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -30,7 +30,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 @@ -72,9 +72,9 @@ -
+
@@ -123,7 +123,7 @@

  • Time Series Chains
  • FLUSS Arc Plot and SiMPle Arc Plot
  • Annotation vectors (e.g.: Stop-word MOTIF bias, Actionability bias)
  • -
  • SiMPle-Fast (Fast Similarity Matrix-Profile for Music Analysis and Exploration)
  • +
  • SiMPle-Fast (Fast Similarity Matrix Profile for Music Analysis and Exploration)
  • MOTIFs under Uniform Scaling
  • GPU-STOMP
  • Real-time version of previous algorithms (STAMPI, FLOSS, etc)
  • @@ -133,7 +133,7 @@

    -Other projects with Matrix-Profile

    +Other projects with Matrix Profile
    @@ -181,6 +181,7 @@

    Dev status

  • lifecycle
  • Build Status
  • codecov
  • +
  • CRAN version
  • diff --git a/docs/news/index.html b/docs/news/index.html index fe4e80c..9be83df 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/compute.f.meas.html b/docs/reference/compute.f.meas.html index 92b88d4..b56bcfe 100644 --- a/docs/reference/compute.f.meas.html +++ b/docs/reference/compute.f.meas.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/fast.movavg.html b/docs/reference/fast.movavg.html index 118467b..ac2a71b 100644 --- a/docs/reference/fast.movavg.html +++ b/docs/reference/fast.movavg.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/fast.movsd.html b/docs/reference/fast.movsd.html index 1674e73..1ed6312 100644 --- a/docs/reference/fast.movsd.html +++ b/docs/reference/fast.movsd.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/fluss.cac.html b/docs/reference/fluss.cac.html index 6f70057..c8f6cc2 100644 --- a/docs/reference/fluss.cac.html +++ b/docs/reference/fluss.cac.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/fluss.extract.html b/docs/reference/fluss.extract.html index be4511c..2dca8a6 100644 --- a/docs/reference/fluss.extract.html +++ b/docs/reference/fluss.extract.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/fluss.html b/docs/reference/fluss.html index c49815d..926755f 100644 --- a/docs/reference/fluss.html +++ b/docs/reference/fluss.html @@ -64,7 +64,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/fluss.score.html b/docs/reference/fluss.score.html index e17aa67..ac6705c 100644 --- a/docs/reference/fluss.score.html +++ b/docs/reference/fluss.score.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/fluss_data.html b/docs/reference/fluss_data.html index 40cab54..e1f44be 100644 --- a/docs/reference/fluss_data.html +++ b/docs/reference/fluss_data.html @@ -64,7 +64,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/golden.section.2.html b/docs/reference/golden.section.2.html index a6de8cb..39e9ce3 100644 --- a/docs/reference/golden.section.2.html +++ b/docs/reference/golden.section.2.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/golden.section.html b/docs/reference/golden.section.html index e75dff6..b60d6ef 100644 --- a/docs/reference/golden.section.html +++ b/docs/reference/golden.section.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/guide.search.html b/docs/reference/guide.search.html index f440828..16a1588 100644 --- a/docs/reference/guide.search.html +++ b/docs/reference/guide.search.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/index.html b/docs/reference/index.html index 5f60717..cc0aeea 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 @@ -237,7 +237,7 @@

    tsmp

    -

    Package development tools for R.

    +

    Time Series with Matrix Profile

    diff --git a/docs/reference/mass.html b/docs/reference/mass.html index 1c7f53b..3339de0 100644 --- a/docs/reference/mass.html +++ b/docs/reference/mass.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/mass.pre.html b/docs/reference/mass.pre.html index 453f4bc..aae4dd7 100644 --- a/docs/reference/mass.pre.html +++ b/docs/reference/mass.pre.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/mode.html b/docs/reference/mode.html index 1224df2..40681a3 100644 --- a/docs/reference/mode.html +++ b/docs/reference/mode.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/mstomp.html b/docs/reference/mstomp.html index e13dd24..0cb7ff4 100644 --- a/docs/reference/mstomp.html +++ b/docs/reference/mstomp.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/mstomp.par.html b/docs/reference/mstomp.par.html index 2fc40aa..0a32081 100644 --- a/docs/reference/mstomp.par.html +++ b/docs/reference/mstomp.par.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/sdts.f.score.html b/docs/reference/sdts.f.score.html index 5a424ab..dc02bb5 100644 --- a/docs/reference/sdts.f.score.html +++ b/docs/reference/sdts.f.score.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/sdts.predict.html b/docs/reference/sdts.predict.html index 244a42d..84e80ab 100644 --- a/docs/reference/sdts.predict.html +++ b/docs/reference/sdts.predict.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/sdts.train.html b/docs/reference/sdts.train.html index 4a2097c..d1f24c4 100644 --- a/docs/reference/sdts.train.html +++ b/docs/reference/sdts.train.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/stamp.html b/docs/reference/stamp.html index 80f04fa..3e0581d 100644 --- a/docs/reference/stamp.html +++ b/docs/reference/stamp.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/stamp.par.html b/docs/reference/stamp.par.html index 27b219f..c1bc8ca 100644 --- a/docs/reference/stamp.par.html +++ b/docs/reference/stamp.par.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/std.html b/docs/reference/std.html index 504caef..b37d56c 100644 --- a/docs/reference/std.html +++ b/docs/reference/std.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/test_data.html b/docs/reference/test_data.html index e45ab6e..753146b 100644 --- a/docs/reference/test_data.html +++ b/docs/reference/test_data.html @@ -65,7 +65,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/toy_data.html b/docs/reference/toy_data.html index fc38ef7..34c1116 100644 --- a/docs/reference/toy_data.html +++ b/docs/reference/toy_data.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 diff --git a/docs/reference/tsmp.html b/docs/reference/tsmp.html index 3280b07..26491cc 100644 --- a/docs/reference/tsmp.html +++ b/docs/reference/tsmp.html @@ -6,7 +6,7 @@ -Package development tools for R. — tsmp • tsmp +Time Series with Matrix Profile — tsmp • tsmp @@ -30,7 +30,7 @@ - + @@ -64,7 +64,7 @@ tsmp - 0.2.13.9004 + 0.2.13.9011 @@ -103,7 +103,7 @@
    @@ -116,28 +116,6 @@

    Package development tools for R.

    -

    Package options

    - - -

    Devtools uses the following options to configure behaviour:

    -
      -
    • devtools.path: path to use for dev_mode

    • -
    • devtools.name: your name, used when signing draft -emails.

    • -
    • devtools.install.args: a string giving extra arguments passed -to R CMD install by install.

    • -
    • devtools.desc.author: a string providing a default Authors@R -string to be used in new DESCRIPTIONs. Should be a R code, and -look like "Hadley Wickham <h.wickham@gmail.com> [aut, cre]". See -as.person for more details.

    • -
    • devtools.desc.license: a default license string to use for -new packages.

    • -
    • devtools.desc.suggests: a character vector listing packages to -to add to suggests by defaults for new packages.

    • -
    • devtools.desc: a named list listing any other -extra options to add to DESCRIPTION

    • -
    -

    References

    http://www.cs.ucr.edu/~eamonn/MatrixProfile.html

    @@ -155,8 +133,6 @@

    See a

    Contents

    diff --git a/man/tsmp.Rd b/man/tsmp.Rd index aed565d..81f008a 100644 --- a/man/tsmp.Rd +++ b/man/tsmp.Rd @@ -4,7 +4,7 @@ \name{tsmp} \alias{tsmp} \alias{tsmp-package} -\title{tsmp: Time Series with Matrix Profile} +\title{Time Series with Matrix Profile} \description{ \if{html}{\figure{logo.png}{options: align='right'}} From d2376aecced7f01860aa0b4351fc7438684b8ab5 Mon Sep 17 00:00:00 2001 From: Francisco Bischoff Date: Sat, 18 Aug 2018 17:48:07 +0100 Subject: [PATCH 2/7] increase coverage --- DESCRIPTION | 2 +- tests/testthat/test.mstomp.search.R | 18 ++++++++++++++++++ tests/testthat/test.sdts.R | 29 +++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 tests/testthat/test.mstomp.search.R create mode 100644 tests/testthat/test.sdts.R diff --git a/DESCRIPTION b/DESCRIPTION index 8dbcb38..7ba4774 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: tsmp Type: Package Title: Time Series with Matrix Profile -Version: 0.2.13.9011 +Version: 0.2.13.9015 Authors@R: c( person("Francisco", "Bischoff", email = "fbischoff@med.up.pt", role = c("aut", "cre"), comment = c(ORCID = "https://orcid.org/0000-0002-5301-8672")), person("Michael", "Yeh", email = "myeh003@ucr.edu", role = c("res", "ccp", "ctb")) diff --git a/tests/testthat/test.mstomp.search.R b/tests/testthat/test.mstomp.search.R new file mode 100644 index 0000000..8ee8504 --- /dev/null +++ b/tests/testthat/test.mstomp.search.R @@ -0,0 +1,18 @@ +context("Testing FLUSS functions") +library(tsmp) + +w <- toy_data$sub.len +mp <- mstomp(toy_data$data[1:200, ], w, verbose = 0) +motifs <- guide.search(toy_data$data[1:200, ], w, mp$mp, mp$pi, 2) +motifs.u <- unconstrain.search(toy_data$data[1:200, ], w, mp$mp, mp$pi, 2) + + +test_that("Guide Search", { + expect_equal(motifs$motif.idx, c(44, 108)) + expect_equal(motifs$motif.dim, list(c(2,3), c(2,3))) +}) + +test_that("Unguide Search", { + expect_equal(motifs.u$motif.idx, c(33, 102, 57, 9, 127, 81)) + expect_equal(motifs.u$motif.dim, list(1, 1, 1, 1, 1, 3)) +}) diff --git a/tests/testthat/test.sdts.R b/tests/testthat/test.sdts.R new file mode 100644 index 0000000..549d84e --- /dev/null +++ b/tests/testthat/test.sdts.R @@ -0,0 +1,29 @@ +context("Testing SDTS functions") +library(tsmp) + +w <- c(110, 220) +subs <- 11000:20000 +tr_data <- test_data$train$data[subs] +tr_label <- test_data$train$label[subs] +te_data <- test_data$test$data[subs] +te_label <- test_data$test$label[subs] +model <- sdts.train(tr_data, tr_label, w, verbose = 0) +predict <- sdts.predict(model, te_data, round(mean(w))) +pred.score <- sdts.f.score(te_label, predict, 1) + +test_that("SDTS Train", { + expect_equal(round(model$score, 3) , 0.353) + expect_equal(round(model$score.hist, 3), 0.353) + expect_equal(round(sum(model$pattern[[1]])/sd(model$pattern[[1]]), 3), -4847.100) + expect_equal(round(model$thold, 3), 8.726) +}) + +test_that("SDTS Predict", { + expect_known_hash(predict, "1c340d263b") +}) + +test_that("SDTS F Score", { + expect_equal(pred.score$f.score, 0.125) + expect_equal(round(pred.score$precision, 4), 0.0667) + expect_equal(pred.score$recall, 1) +}) From 21bff9891fc279eed2fcd6467a840c655efba0e0 Mon Sep 17 00:00:00 2001 From: Francisco Bischoff Date: Sun, 19 Aug 2018 03:09:28 +0100 Subject: [PATCH 3/7] find chains increase codecov --- DESCRIPTION | 5 +- NAMESPACE | 1 + NEWS.md | 2 +- R/find_chains.R | 58 +++ R/fluss.R | 1 + R/gait_data.R | 9 + README.html | 658 ------------------------- README.md | 2 +- data/datalist | 1 + data/gait_data.rda | Bin 0 -> 6981 bytes docs/CODE_OF_CONDUCT.html | 2 +- docs/LICENSE-text.html | 2 +- docs/LICENSE.html | 2 +- docs/authors.html | 8 +- docs/index.html | 2 +- docs/news/index.html | 2 +- docs/reference/compute.f.meas.html | 2 +- docs/reference/fast.movavg.html | 2 +- docs/reference/fast.movsd.html | 2 +- docs/reference/find.chains.html | 357 ++++++++++++++ docs/reference/fluss.cac.html | 2 +- docs/reference/fluss.extract.html | 2 +- docs/reference/fluss.html | 2 +- docs/reference/fluss.score.html | 2 +- docs/reference/fluss_data.html | 2 +- docs/reference/gait_data.html | 164 ++++++ docs/reference/golden.section.2.html | 2 +- docs/reference/golden.section.html | 2 +- docs/reference/guide.search.html | 2 +- docs/reference/index.html | 14 +- docs/reference/mass.html | 2 +- docs/reference/mass.pre.html | 2 +- docs/reference/mode.html | 2 +- docs/reference/mstomp.html | 2 +- docs/reference/mstomp.par.html | 2 +- docs/reference/sdts.f.score.html | 2 +- docs/reference/sdts.predict.html | 2 +- docs/reference/sdts.train.html | 2 +- docs/reference/stamp.html | 2 +- docs/reference/stamp.par.html | 2 +- docs/reference/std.html | 2 +- docs/reference/test_data.html | 2 +- docs/reference/toy_data.html | 2 +- docs/reference/tsmp.html | 5 +- docs/reference/unconstrain.search.html | 2 +- man/find.chains.Rd | 33 ++ man/fluss.cac.Rd | 1 + man/gait_data.Rd | 22 + man/tsmp.Rd | 3 +- tests/testthat/test.basics.R | 14 +- tests/testthat/test.find.chains.R | 14 + tests/testthat/test.fluss.R | 27 +- tests/testthat/test.mstomp.search.R | 24 +- tests/testthat/test.sdts.R | 33 +- tests/testthat/test.stamps.R | 58 +-- 55 files changed, 827 insertions(+), 747 deletions(-) create mode 100644 R/find_chains.R create mode 100644 R/gait_data.R delete mode 100644 README.html create mode 100644 data/gait_data.rda create mode 100644 docs/reference/find.chains.html create mode 100644 docs/reference/gait_data.html create mode 100644 man/find.chains.Rd create mode 100644 man/gait_data.Rd create mode 100644 tests/testthat/test.find.chains.R diff --git a/DESCRIPTION b/DESCRIPTION index 7ba4774..3ac25d4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,10 +1,11 @@ Package: tsmp Type: Package Title: Time Series with Matrix Profile -Version: 0.2.13.9015 +Version: 0.2.13.9048 Authors@R: c( person("Francisco", "Bischoff", email = "fbischoff@med.up.pt", role = c("aut", "cre"), comment = c(ORCID = "https://orcid.org/0000-0002-5301-8672")), - person("Michael", "Yeh", email = "myeh003@ucr.edu", role = c("res", "ccp", "ctb")) + person("Michael", "Yeh", email = "myeh003@ucr.edu", role = c("res", "ccp", "ctb"), comment = c(ORCID = "https://orcid.org/0000-0002-9807-2963")), + person("Yan", "Zhu", email = "yzhu015@ucr.edu", role = c("res", "ccp", "ctb")) ) Maintainer: Francisco Bischoff Description: A toolkit implementing the Matrix Profile concept that was created by CS-UCR . diff --git a/NAMESPACE b/NAMESPACE index 1721b2c..917f5ea 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -2,6 +2,7 @@ export(fast.movavg) export(fast.movsd) +export(find.chains) export(fluss) export(fluss.cac) export(fluss.extract) diff --git a/NEWS.md b/NEWS.md index e5199ad..175931e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,7 +1,7 @@ NEWS ================ Francisco Bischoff -\- 18 Aug 2018 +\- 19 Aug 2018 diff --git a/R/find_chains.R b/R/find_chains.R new file mode 100644 index 0000000..46fcff6 --- /dev/null +++ b/R/find_chains.R @@ -0,0 +1,58 @@ +#' Find Time Series Chains +#' +#' @param matrices a result from STAMP or STOMP algorithms +#' +#' @return Returns `chains`, a `list` of chains founded with more than 2 patterns and `best` +#' with the best one. +#' @export +#' @references 1. Zhu Y, Imamura M, Nikovski D, Keogh E. Introducing time series chains: a new +#' primitive for time series data mining. Knowl Inf Syst. 2018 Jun 2;1–27. +#' @references Website: +#' @examples +#' w <- 50 +#' data <- gait_data +#' mp <- stamp(data, window.size = w, exclusion.zone = 1/4, verbose = 0) +#' find.chains(mp) +#' +find.chains <- function(matrices) { + size <- length(matrices$rpi) + chain.length <- rep(1, size) + chain.set <- list() + + k <- 1 + + for (i in 1:size) { + if (chain.length[i] == 1) { + j <- i + chain <- j + + while (matrices$rpi[j] > 0 && matrices$lpi[matrices$rpi[j]] == j) { + j <- matrices$rpi[j] + chain.length[j] <- -1 + chain.length[i] <- chain.length[i] + 1 + chain <- c(chain, j) + } + + if (length(chain) > 2) { + chain.set[[k]] <- chain + k <- k + 1 + } + } + } + + l <- max(chain.length) + + best.chain <- NULL + mean <- Inf + for (i in 1:length(chain.set)) { + if (length(chain.set[[i]]) == l) { + n <- mean(matrices$rmp[chain.set[[i]]]) + if (n < mean) { + mean <- n + best.chain <- chain.set[[i]] + } + } + } + + return(list(chains = chain.set, best = best.chain)) +} diff --git a/R/fluss.R b/R/fluss.R index 0169241..2a94c17 100644 --- a/R/fluss.R +++ b/R/fluss.R @@ -147,6 +147,7 @@ fluss.extract <- function(arc.counts, num.segments, window.size, exclusion.zone #' w <- 210 #' mp <- mstomp(data, w, verbose = 0) #' cac <- fluss.cac(mp$pi, w) +#' #' \dontrun{ #' data <- fluss_data$walkjogrun$data #' w <- fluss_data$walkjogrun$window # 80 diff --git a/R/gait_data.R b/R/gait_data.R new file mode 100644 index 0000000..085c369 --- /dev/null +++ b/R/gait_data.R @@ -0,0 +1,9 @@ +#' Original data used in the Time Series Chain demo +#' +#' @docType data +#' @format A `matrix` with 904 rows and 1 column with the Y data from an accelerometer +#' @source \url{https://sites.google.com/site/timeserieschain/} +#' +#' @references 1. Zhu Y, Imamura M, Nikovski D, Keogh E. Introducing time series chains: a new primitive for time series data mining. Knowl Inf Syst. 2018 Jun 2;1–27. +#' @keywords datasets +"gait_data" diff --git a/README.html b/README.html deleted file mode 100644 index d5ab71a..0000000 --- a/README.html +++ /dev/null @@ -1,658 +0,0 @@ - - - - - - - - - - - - - - - - - - -

    README

    -

    Francisco Bischoff - 18 Aug 2018

    - - -

    Time Series with Matrix Profile

    -

    Packagist lifecycle Build Status codecov CRAN version

    -

    Overview

    -

    R Functions implementing UCR Matrix Profile Algorithm (http://www.cs.ucr.edu/~eamonn/MatrixProfile.html).

    -

    This is under development and is intended to be a general purpose MP toolkit

    -

    After basic tools are finished and API is mature, further functions for ‘Classification’, ‘MOTIF extraction’, ‘MDS visualization’ etc. will be added.

    -

    Please be welcome to suggest improvements.

    -

    Installation

    - -

    Currently available Features

    -
      -
    • STAMP (single and multi-thread versions)
    • -
    • STOMP (single and multi-thread versions)
    • -
    • Multivariate STOMP (mSTOMP)
    • -
    • Multivariate MOTIF Search (from mSTOMP)
    • -
    • Scalable Dictionary learning for Time Series (SDTS) prediction
    • -
    • FLUSS (Fast Low-cost Unipotent Semantic Segmentation)
    • -
    • Misc: -
        -
      • MASS v2.0
      • -
      • Fast moving average
      • -
      • Fast moving SD
      • -
    • -
    -

    Road map

    -
      -
    • Improve Joins outputs
    • -
    • Multidimensional Space
    • -
    • Time Series Chains
    • -
    • FLUSS Arc Plot and SiMPle Arc Plot
    • -
    • Annotation vectors (e.g.: Stop-word MOTIF bias, Actionability bias)
    • -
    • SiMPle-Fast (Fast Similarity Matrix Profile for Music Analysis and Exploration)
    • -
    • MOTIFs under Uniform Scaling
    • -
    • GPU-STOMP
    • -
    • Real-time version of previous algorithms (STAMPI, FLOSS, etc)
    • -
    • MASS Extensions (ADP, WQ, QwG)
    • -
    • SCRIMP (waiting for publication)
    • -
    -

    Other projects with Matrix Profile

    - -

    Code of Conduct

    -

    Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

    - - - diff --git a/README.md b/README.md index 27548d4..a71161f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ README ================ Francisco Bischoff -\- 18 Aug 2018 +\- 19 Aug 2018 diff --git a/data/datalist b/data/datalist index 818d7bb..5f4867d 100644 --- a/data/datalist +++ b/data/datalist @@ -1,3 +1,4 @@ test_data toy_data fluss_data +gait_data diff --git a/data/gait_data.rda b/data/gait_data.rda new file mode 100644 index 0000000000000000000000000000000000000000..235d48cf803b9766033d59fbdc33c7e1fa24f053 GIT binary patch literal 6981 zcmV-L8@l8liwFP!0000023>h~JQh&<{xj@ZDW#N_wn|efhayd-ElorVNtDb7p@fX= zz4y$@xa{ohK?+T!MK;g)df)f=*YA&W?(_Ma^ErRq=f3ajy3T!C_2M?6i$W9%g+`(C zQYke0?2?BzJ5eb-6v0_5XmI29!)tms9^RNeBSxXnT~Iz$7Oo-j8pYNdEtr=|Q0&}c zK4>V7;<(M!N_Gp1f9*C`_@xc#`8g{4j-rI-Q1o@3E=u%%+m5CBqokYUo)Yatsg73R z)t{y)6AoA3R`D2RAC&|wj;W!1R7|x{Jph$zxA1;i1y#LY_HuV5pt@>j#g(}Us2x%{ zw8T&q4VSsk_0+A=%)ip+(kc z_I1l=@J>4c8>1iMz0@5H+*pMVFRN4*KDvuuZv#uclh@HZmNV0_N&vmjQ&%t8z6c*y z{I#)uW`uVcdrK$z-O*_tUwksd2yNp&R;vs|(F~!oQ*ZyG{^G&B0fSUjm)$cDuiAmC z)X&u4ci5=>*!?B%)F7(nNX3Wv+oS5YtH5Q|X;g1@E4-T&jvBWBwVZNu)aEMsoN}~A z-96cbd((SR=dS-e%GnWh8$a<$jhUfV-^60R1V3sHE9`%^(gtsf0y|QxlTZoafH{{d zP=3~hw$ND{C2y>XC1YJt=$=bGajX@2q5FOr+ulLW{O6VdHusRdy1O{C=qa)_Bd%OI za{xKj0yg48RmlGu=OG)Zi4xPuFT?NSP_;(-4%Fe8>)Tuj4QewKPx3{Uw}^SKGmg#>(L%;#&~f#5G}qp z<+CWJXb}Ij{Lm7Ay!GAozJ8e|%9559rUtvBNNSO7TUax43PkxDV^xsxb=#Oss~l1` zWz&PVdLdECg&vt`hy>7l?KQxy_XnrI`Lu4yF2dp{#DTndsXcy0Eg$ZIL zL7@d7rx6EhiP2-C2E;*Wf<;t0J{39C3Gw#W$9h6IWFyCXO>~K5$ zdbByRl+TE@@n$XBbrKmHO2-^dob+^8eL#VIqgPx48U)P*l-g&Ad}zQcU8|3j15;Gb)FsHJ$Oxv}527@|kMpH|6g4$+YA$A%&~nG3 zAf?0~9nUl)`+i(Qm&rE(<#e+R+)6M4cL{ou_m znAW4N$E#wg$>DFC5xVF-Wm85SqC4KRsqgrZ*c->H7&(UYIXaK4#Epj!lk%xZ=?I}v?7ES#do#;=<`rT>&hSulmLht-GB^6A5n>*# z;0P%$Lt@(|`p1j+kl9OYb6hTIm7R@sb0CRP& zv7xyvI)5Zs-AvwuE}@Bj^M)cYQ_fs#G$}?qkIWGh-Nk5r_^9+kR1&J|C2T(R37{nE zxLMOpIx?M}&{l^SAyB%C(y-<|VbIr(2}~N35T7GcriUjpOO@tvHHL{%koiL2FIdXnKh*Rna%XrIO z;wEV)I=pNHd8wf_;qlUfxFwee8k|)n_HrVk-yDi@VM!mWzHl8ptZ(D{r=5_F-X{ z?mKkcGwv6ubVY|CtTr9fL0gNRrJ~Dsv@~_IcTIdjX%tb zvfkqL_%-giLw688rO7SnE{3Ba4`11KUE>@Fcn6smlKBAgetjZJ5sM)2@i9_!AJNHQp(wLS7d z?xj*rRAmCnoSPlK+06Q3qGsmB+FxjitNVE8RwCLv6t(BjqS=b>}gg%a(P zm%+4JwrthL1hn7omFY2<#glU`(iKi!sEg^e9%=A0S9%6NNIbEY9k38FUhBL|#CeM3=ro6%?$x{kp zQ?=xXnMW=+__hSudd!XoEhV_!ifNjvJ|3jSO?LkFf~oWX#~?cerWgHbEv?D0xI4fa zzmS5b+9ec|7IAo0Z>9zbWg#psSYRVrfP`E6)D_dakrfJ4_3=F@x+E-iY9TDBkJXts&>u0S1hQVJK=mt$`}m%FWFm;f z?%;^IE9@uHMuC*;o*g98)L7K!Pbdi&Ud)}oX-NVG!g=-_5G9_SZc|T(rie{>(>NhLe97GwKUz?$R_QFD z{s>J6HQjHCZbi%7>01Lw*P_K-c&yW99$NVGi!99-p{ZlMOd>}a^%@%XQZhI2*78hs z`;ZGtJyWcnSo}qf)OwTRt49&JL2c^w4HNS8;N9`GOU@+TWiij1zau2;oXSkYuWcmv zix5LpJBz$I`de&gLm4TUlkNCEbPahER6DUF@dC+L3#CYYI!|(MGEIFV_mFJT#lPQ` zO)|&(DEp2tCF!r&_6@6VkYt6ABh4n&B(|eNQ2xRk5}y8s#_ZWZyq6bojWihKc6l?^ zdutrrBs!;Ls}vBqHH>FpOcc^D54`Y=t-~AD2JV9V`6xeMZ#&lQikk0*Ww!!r&}30w zaDLMVw77rMIl5AG7B4M7Y4|9hb$dsQ!n5sY*>3hZ<7YS;bNHufo-Rg>Ub98w%g-qL z?V-3>ZXNRW$c^$WJB&D!$JA|yXKQf(!3mb7K6w=qHZZWkh<*?pXkCj*G@ne`(9 zcaD;mQf(8pZa&1h^98?#Uov5QTFb5-wj+-%hG-!N^~v?8Tc!@Cc){fR-|^Um*>HP6 zp=^J?8lfxe`8z%xMdHz0^kx1g$d=m4tEQ)bl4WTJqV{LvZT|Fbr7eYMei^#-#@8rx zoIDWHr|}eBBkKK7=i*(zev!u6Nc7OM_lcOLq1#N<`qy9+m`>M7lILuGAoN@R!y{<8 zEj=wL>FS3`s;`>y+8)>Jf9<6TjM>O*f=XPlVLSijgReN&a z@AQ+iCS(WvFPn}Ye0BgqH>Ado9lMC|Rg!El_aXAXF8k3FRR-49o6pS5>Kp z(F;WsO+ma{oc`44_8q)iFKb;iG=Q$+7DkcQcQ9A@TBmDGqcwffa*h5!G$h74@2|g& z%CUw=lDVxYV!yF7n%RlW^m&X=`+@So}GmvD0UF0|CY z4(?fYVkQ#~@O2%f-#D>v*2`BoVG?r@H78~!uR9mf-*f2gf7T%S_(fK${9uL=GeAR+(y-Bx*GkbG@7M0Egw>RiT2&Yre+5s!Te=Y-f`hNI=_+W zUzLUE+`GANK)V7R>np+-1yr>1zmKBF#G(GFKJTCN&ruO+p8H!R7jJx5+i7f2L2|MP z+hJcbd}h3-t{WPXE2;gw_q0}$=jZA;JG?@P+Z^Mu-?y@fJ)M8Lt+5pDbfoYSSy+YkiXd8O~FkO zWs|)MTb7uk&h0o|H#ZxtE(;Dg>xqJyXKH&ghI?ux5I^3S?sQp65NWu@SJ7LhuiSTWOi03p7qv?{Toq$W5avV z_WA>G*qbg&T{!}mt_jYWE@OC4s`9QXbVPX7LVCK27E(QU=-U&2A=kQOj5DT$GMaDJ z&g1h?tCL_ql%0(hR#?>GzrA3d6zc2zrH^jeYVF1kHFzglU+9$j6y4&>zp(zE1@qY+ zRb#a*w29rnpQKxbMxCiKjR`?iRoj{+aUw7)Sa>8A*W>lMG{J>-&4?4p;-vQ!!uP-o zXCB7ku=XxD5*V^exx=rxE_hG8CeJ7#?MTb&tE+YBIGKwI#0hvE- ziX*;NBBy4(?S>0}$k!Fz^TxFcZ-OFS&P6{${;zEZsx`fln^0$GV*3!UEjHQNU9LmM z%1B0S;2$JEZ>LXY@glylhCaf78u6x=Sh;+Uk@Dy(tw`4Z*}JzL(m2S2l1nk1^BEF! zvw3ifJ^Am%L4==@r_SLEMEK2HVwp0J5PJG1=SJX31UXP>xz(Q#*qX>^q1=a%nQ!!p zBhL{fEX46Sk%dIvHS{mGACV=WP4ChyK;cz;M$^=3RK)Zg(oy6`eTMJMJH}nKG7{-y zv{`=j{!#Oio!`(|n-e1BHLJTe_wQHXcA!)4J4;T-105?>ObwU`XsOX&r&<<|y6-L} zG04^DTlvBxCM;kCPz#rg0QzD-;CMedz}zv&#l zhI!8LyU!TeQDOz3zKDtH9f#qina{a?a~?eX_HgG|i@>{Qg!4k{69P=HOeringNXYN zXsp-4NKhA{FLGBwmbfZI?20~$sM-%Jn^I6|7Nw>%brTJ}@(P)&)}d|1Kv2)T>tNno z*0#QP`D|QV+PkAq8(sRnRkdeNpi|+WYLZxp{ow;~pZs)Pd^}{|%ucQS77Tqwr1H zKVcYTh8Nr3i?3?jfG4S89O+Fw(7)SE^FKWflSXAak+8$FK$(%uTq%T9lu3Ni|HjVQqs}3z%CFsYR%d=Ef8Q-a`)}3v@t;0}X>YVz=5HUE z=5OBjE32b@Tuuy|FmIBA6Tmfa*%eU@*$@wTWKV4*Gisdkv? z3bZ(iv`_ozp?)+z>wEJo&n(cZv@$nE;Y=rclP4YN&z&gOB2FPVS%^y8Fot_HX~A|RkJ6_%YiI0eSNvAP?n%K!vVuCE+PF?g#hJiEEm}x@ z?kN03cXMqn+8|=<4%%NUIV48XM&tPIAX{fKTi(bGr3;U^>`<{p&ES^9WdkN?8Tu7$ z_UqRyj&3`k{#X&+%art#%KPz7^1>yp?}_NvI6ot16AI>xL}A_WA+*^(SDm}&FB+Lo z)mz!OP?Zo;9e?sCiW|dUSk2hrH9h`6A3%szVTuuc4t%~Q^9H?{{ROZ3I=xPj5mb({@?mhv9 zteDs6Ud_~vz9R?bUzCg`h@&m0+KP9FG@2~eawhyV@%D+IS?k~^N;U{s#U8B3Yn>u7 z?^18X#hl_>n|l_4Q`gv~FHXZ-YaYGz#won=SVU`ZUXRcS7y62p`G~opOjl2ILQ=vF zo+I1TknVQP!fi(eGVNr>e#Ay1>)ikT=^&Tpju2NBiw;(Ett`NV(FU}YgPCr;RW?k_;mbSNXc zVH2u8I@5jn#?id76ULGXXb%xD5Tx*+GgHU9@x{+s9rn(??E3?B8J88Dnlc3Q+K$vK zW^A;bnxbA^HHoGxxpvv=GN|@ss*r*UDE;>7QR-(onD`E%N2 zN((Y%G%WgkQ<1@!&5BLigfveb>fMAKB)#q9P$#*FyLOBvAsvmVKW%)Ie#wa3;=|o{ z=m#Qe&QJ!IOd&Su5ruJt7imY>)4!KQB3ItmlDcjgN-l&eKJbgg+cSm*s(Rbel(
    GbszE_7bnl+q}K|jLuIlF2>!p(L!Tf)Tj8PJF z&y4-D%$>Z-T_)CBGM{+Ft5ReC(Yx3cL}QJsP8mQR7cZ+Iu-fHp=cd`wB*k1 zBy`;DJ8*v=7tG@Qr|*B0Mkmh;N_*iJFg2ATEN^O}z2H#~ZOH8ZYcSIFZX3=T(f{@! XDRh_rZc!+l|BU|wLXIelpBw-HY_#fz literal 0 HcmV?d00001 diff --git a/docs/CODE_OF_CONDUCT.html b/docs/CODE_OF_CONDUCT.html index ccf3621..06f626b 100644 --- a/docs/CODE_OF_CONDUCT.html +++ b/docs/CODE_OF_CONDUCT.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html index c71fd24..e1ddfc3 100644 --- a/docs/LICENSE-text.html +++ b/docs/LICENSE-text.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/LICENSE.html b/docs/LICENSE.html index 18239d4..1880510 100644 --- a/docs/LICENSE.html +++ b/docs/LICENSE.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/authors.html b/docs/authors.html index 77faa61..64590ad 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 @@ -109,7 +109,11 @@

    Authors

  • -

    Michael Yeh. Researcher, conceptor, contributor. +

    Michael Yeh. Researcher, conceptor, contributor. +

    +
  • +
  • +

    Yan Zhu. Researcher, conceptor, contributor.

  • diff --git a/docs/index.html b/docs/index.html index a98128b..c789e51 100644 --- a/docs/index.html +++ b/docs/index.html @@ -30,7 +30,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/news/index.html b/docs/news/index.html index 9be83df..4eff28f 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/compute.f.meas.html b/docs/reference/compute.f.meas.html index b56bcfe..bed846e 100644 --- a/docs/reference/compute.f.meas.html +++ b/docs/reference/compute.f.meas.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/fast.movavg.html b/docs/reference/fast.movavg.html index ac2a71b..d51e696 100644 --- a/docs/reference/fast.movavg.html +++ b/docs/reference/fast.movavg.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/fast.movsd.html b/docs/reference/fast.movsd.html index 1ed6312..1d0b575 100644 --- a/docs/reference/fast.movsd.html +++ b/docs/reference/fast.movsd.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/find.chains.html b/docs/reference/find.chains.html new file mode 100644 index 0000000..4ef4dae --- /dev/null +++ b/docs/reference/find.chains.html @@ -0,0 +1,357 @@ + + + + + + + + +Find Time Series Chains — find.chains • tsmp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + +
    + +

    Find Time Series Chains

    + +
    + +
    find.chains(matrices)
    + +

    Arguments

    + + + + + + +
    matrices

    a result from STAMP or STOMP algorithms

    + +

    Value

    + +

    Returns chains, a list of chains founded with more than 2 patterns and best +with the best one.

    + +

    References

    + +
      +
    1. Zhu Y, Imamura M, Nikovski D, Keogh E. Introducing time series chains: a new +primitive for time series data mining. Knowl Inf Syst. 2018 Jun 2;1–27.

    2. +
    +

    Website: https://sites.google.com/site/timeserieschain/

    + + +

    Examples

    +
    w <- 50 +data <- gait_data +mp <- stamp(data, window.size = w, exclusion.zone = 1/4, verbose = 0) +find.chains(mp)
    #> $chains +#> $chains[[1]] +#> [1] 1 145 377 +#> +#> $chains[[2]] +#> [1] 2 111 344 712 +#> +#> $chains[[3]] +#> [1] 3 112 345 713 +#> +#> $chains[[4]] +#> [1] 4 113 346 714 +#> +#> $chains[[5]] +#> [1] 5 114 347 715 +#> +#> $chains[[6]] +#> [1] 6 115 348 716 +#> +#> $chains[[7]] +#> [1] 30 67 168 668 +#> +#> $chains[[8]] +#> [1] 31 68 169 669 +#> +#> $chains[[9]] +#> [1] 102 335 703 +#> +#> $chains[[10]] +#> [1] 103 336 704 +#> +#> $chains[[11]] +#> [1] 104 337 705 +#> +#> $chains[[12]] +#> [1] 105 338 706 +#> +#> $chains[[13]] +#> [1] 106 339 707 +#> +#> $chains[[14]] +#> [1] 107 340 708 +#> +#> $chains[[15]] +#> [1] 108 341 709 +#> +#> $chains[[16]] +#> [1] 109 342 710 +#> +#> $chains[[17]] +#> [1] 110 343 711 +#> +#> $chains[[18]] +#> [1] 117 349 717 +#> +#> $chains[[19]] +#> [1] 148 380 614 746 778 811 +#> +#> $chains[[20]] +#> [1] 192 491 592 +#> +#> $chains[[21]] +#> [1] 193 492 593 +#> +#> $chains[[22]] +#> [1] 194 493 594 +#> +#> $chains[[23]] +#> [1] 195 494 595 +#> +#> $chains[[24]] +#> [1] 196 495 596 +#> +#> $chains[[25]] +#> [1] 197 496 597 +#> +#> $chains[[26]] +#> [1] 198 497 598 +#> +#> $chains[[27]] +#> [1] 199 498 599 +#> +#> $chains[[28]] +#> [1] 200 499 600 +#> +#> $chains[[29]] +#> [1] 201 500 601 +#> +#> $chains[[30]] +#> [1] 202 501 602 +#> +#> $chains[[31]] +#> [1] 215 248 615 747 779 812 +#> +#> $chains[[32]] +#> [1] 216 282 314 +#> +#> $chains[[33]] +#> [1] 217 283 315 +#> +#> $chains[[34]] +#> [1] 218 284 316 +#> +#> $chains[[35]] +#> [1] 219 285 317 +#> +#> $chains[[36]] +#> [1] 220 253 719 +#> +#> $chains[[37]] +#> [1] 221 254 720 +#> +#> $chains[[38]] +#> [1] 227 260 560 +#> +#> $chains[[39]] +#> [1] 228 261 561 +#> +#> $chains[[40]] +#> [1] 229 262 562 +#> +#> $chains[[41]] +#> [1] 230 263 563 +#> +#> $chains[[42]] +#> [1] 231 264 564 +#> +#> $chains[[43]] +#> [1] 232 265 565 +#> +#> $chains[[44]] +#> [1] 233 266 566 +#> +#> $chains[[45]] +#> [1] 234 267 567 +#> +#> $chains[[46]] +#> [1] 235 333 701 +#> +#> $chains[[47]] +#> [1] 249 616 748 +#> +#> $chains[[48]] +#> [1] 250 617 749 +#> +#> $chains[[49]] +#> [1] 443 775 808 +#> +#> $chains[[50]] +#> [1] 444 776 809 +#> +#> $chains[[51]] +#> [1] 445 777 810 +#> +#> $chains[[52]] +#> [1] 552 685 849 +#> +#> $chains[[53]] +#> [1] 553 686 850 +#> +#> $chains[[54]] +#> [1] 554 687 851 +#> +#> $chains[[55]] +#> [1] 555 688 852 +#> +#> $chains[[56]] +#> [1] 556 689 853 +#> +#> $chains[[57]] +#> [1] 557 690 854 +#> +#> $chains[[58]] +#> [1] 558 691 855 +#> +#> +#> $best +#> [1] 148 380 614 746 778 811 +#>
    +
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + + + + diff --git a/docs/reference/fluss.cac.html b/docs/reference/fluss.cac.html index c8f6cc2..dc2ee41 100644 --- a/docs/reference/fluss.cac.html +++ b/docs/reference/fluss.cac.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/fluss.extract.html b/docs/reference/fluss.extract.html index 2dca8a6..57d196a 100644 --- a/docs/reference/fluss.extract.html +++ b/docs/reference/fluss.extract.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/fluss.html b/docs/reference/fluss.html index 926755f..b58bdb1 100644 --- a/docs/reference/fluss.html +++ b/docs/reference/fluss.html @@ -64,7 +64,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/fluss.score.html b/docs/reference/fluss.score.html index ac6705c..860ebe6 100644 --- a/docs/reference/fluss.score.html +++ b/docs/reference/fluss.score.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/fluss_data.html b/docs/reference/fluss_data.html index e1f44be..16a2ab3 100644 --- a/docs/reference/fluss_data.html +++ b/docs/reference/fluss_data.html @@ -64,7 +64,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/gait_data.html b/docs/reference/gait_data.html new file mode 100644 index 0000000..e50dfc4 --- /dev/null +++ b/docs/reference/gait_data.html @@ -0,0 +1,164 @@ + + + + + + + + +Original data used in the Time Series Chain demo — gait_data • tsmp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + +
    + +

    Original data used in the Time Series Chain demo

    + +
    + +
    gait_data
    + +

    Format

    + +

    A matrix with 904 rows and 1 column with the Y data from an accelerometer

    + +

    Source

    + +

    https://sites.google.com/site/timeserieschain/

    + +

    References

    + +
      +
    1. Zhu Y, Imamura M, Nikovski D, Keogh E. Introducing time series chains: a new primitive for time series data mining. Knowl Inf Syst. 2018 Jun 2;1–27.

    2. +
    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + + + + diff --git a/docs/reference/golden.section.2.html b/docs/reference/golden.section.2.html index 39e9ce3..a12f9f6 100644 --- a/docs/reference/golden.section.2.html +++ b/docs/reference/golden.section.2.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/golden.section.html b/docs/reference/golden.section.html index b60d6ef..cc98890 100644 --- a/docs/reference/golden.section.html +++ b/docs/reference/golden.section.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/guide.search.html b/docs/reference/guide.search.html index 16a1588..ebf1d1d 100644 --- a/docs/reference/guide.search.html +++ b/docs/reference/guide.search.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/index.html b/docs/reference/index.html index cc0aeea..1e513d1 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 @@ -132,6 +132,12 @@

    find.chains()

    + +

    Find Time Series Chains

    + +

    fluss.cac()

    @@ -162,6 +168,12 @@

    gait_data

    + +

    Original data used in the Time Series Chain demo

    + +

    guide.search()

    diff --git a/docs/reference/mass.html b/docs/reference/mass.html index 3339de0..db932e3 100644 --- a/docs/reference/mass.html +++ b/docs/reference/mass.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/mass.pre.html b/docs/reference/mass.pre.html index aae4dd7..9076eb3 100644 --- a/docs/reference/mass.pre.html +++ b/docs/reference/mass.pre.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/mode.html b/docs/reference/mode.html index 40681a3..bf89c7f 100644 --- a/docs/reference/mode.html +++ b/docs/reference/mode.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/mstomp.html b/docs/reference/mstomp.html index 0cb7ff4..1e1c1a5 100644 --- a/docs/reference/mstomp.html +++ b/docs/reference/mstomp.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/mstomp.par.html b/docs/reference/mstomp.par.html index 0a32081..8d10b8e 100644 --- a/docs/reference/mstomp.par.html +++ b/docs/reference/mstomp.par.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/sdts.f.score.html b/docs/reference/sdts.f.score.html index dc02bb5..fe48f87 100644 --- a/docs/reference/sdts.f.score.html +++ b/docs/reference/sdts.f.score.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/sdts.predict.html b/docs/reference/sdts.predict.html index 84e80ab..5040128 100644 --- a/docs/reference/sdts.predict.html +++ b/docs/reference/sdts.predict.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/sdts.train.html b/docs/reference/sdts.train.html index d1f24c4..461032c 100644 --- a/docs/reference/sdts.train.html +++ b/docs/reference/sdts.train.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/stamp.html b/docs/reference/stamp.html index 3e0581d..525ff41 100644 --- a/docs/reference/stamp.html +++ b/docs/reference/stamp.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/stamp.par.html b/docs/reference/stamp.par.html index c1bc8ca..34d3c47 100644 --- a/docs/reference/stamp.par.html +++ b/docs/reference/stamp.par.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/std.html b/docs/reference/std.html index b37d56c..2023cb6 100644 --- a/docs/reference/std.html +++ b/docs/reference/std.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/test_data.html b/docs/reference/test_data.html index 753146b..7c85182 100644 --- a/docs/reference/test_data.html +++ b/docs/reference/test_data.html @@ -65,7 +65,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/toy_data.html b/docs/reference/toy_data.html index 34c1116..bd70f26 100644 --- a/docs/reference/toy_data.html +++ b/docs/reference/toy_data.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/docs/reference/tsmp.html b/docs/reference/tsmp.html index 26491cc..249963e 100644 --- a/docs/reference/tsmp.html +++ b/docs/reference/tsmp.html @@ -64,7 +64,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 @@ -144,7 +144,8 @@

    Author

    Other contributors:
      -
    • Michael Yeh myeh003@ucr.edu [researcher, conceptor, contributor]

    • +
    • Michael Yeh myeh003@ucr.edu (https://orcid.org/0000-0002-9807-2963) [researcher, conceptor, contributor]

    • +
    • Yan Zhu yzhu015@ucr.edu [researcher, conceptor, contributor]

    diff --git a/docs/reference/unconstrain.search.html b/docs/reference/unconstrain.search.html index 2571676..4d02170 100644 --- a/docs/reference/unconstrain.search.html +++ b/docs/reference/unconstrain.search.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9011 + 0.2.13.9048 diff --git a/man/find.chains.Rd b/man/find.chains.Rd new file mode 100644 index 0000000..0bf27f9 --- /dev/null +++ b/man/find.chains.Rd @@ -0,0 +1,33 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/find_chains.R +\name{find.chains} +\alias{find.chains} +\title{Find Time Series Chains} +\usage{ +find.chains(matrices) +} +\arguments{ +\item{matrices}{a result from STAMP or STOMP algorithms} +} +\value{ +Returns \code{chains}, a \code{list} of chains founded with more than 2 patterns and \code{best} +with the best one. +} +\description{ +Find Time Series Chains +} +\examples{ +w <- 50 +data <- gait_data +mp <- stamp(data, window.size = w, exclusion.zone = 1/4, verbose = 0) +find.chains(mp) + +} +\references{ +\enumerate{ +\item Zhu Y, Imamura M, Nikovski D, Keogh E. Introducing time series chains: a new +primitive for time series data mining. Knowl Inf Syst. 2018 Jun 2;1–27. +} + +Website: \url{https://sites.google.com/site/timeserieschain/} +} diff --git a/man/fluss.cac.Rd b/man/fluss.cac.Rd index 46d0db1..058cbe3 100644 --- a/man/fluss.cac.Rd +++ b/man/fluss.cac.Rd @@ -32,6 +32,7 @@ data <- fluss_data$tilt.abp$data[1:1000] w <- 210 mp <- mstomp(data, w, verbose = 0) cac <- fluss.cac(mp$pi, w) + \dontrun{ data <- fluss_data$walkjogrun$data w <- fluss_data$walkjogrun$window # 80 diff --git a/man/gait_data.Rd b/man/gait_data.Rd new file mode 100644 index 0000000..bbf6c59 --- /dev/null +++ b/man/gait_data.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gait_data.R +\docType{data} +\name{gait_data} +\alias{gait_data} +\title{Original data used in the Time Series Chain demo} +\format{A \code{matrix} with 904 rows and 1 column with the Y data from an accelerometer} +\source{ +\url{https://sites.google.com/site/timeserieschain/} +} +\usage{ +gait_data +} +\description{ +Original data used in the Time Series Chain demo +} +\references{ +\enumerate{ +\item Zhu Y, Imamura M, Nikovski D, Keogh E. Introducing time series chains: a new primitive for time series data mining. Knowl Inf Syst. 2018 Jun 2;1–27. +} +} +\keyword{datasets} diff --git a/man/tsmp.Rd b/man/tsmp.Rd index 81f008a..96261f0 100644 --- a/man/tsmp.Rd +++ b/man/tsmp.Rd @@ -26,7 +26,8 @@ Useful links: Other contributors: \itemize{ - \item Michael Yeh \email{myeh003@ucr.edu} [researcher, conceptor, contributor] + \item Michael Yeh \email{myeh003@ucr.edu} (https://orcid.org/0000-0002-9807-2963) [researcher, conceptor, contributor] + \item Yan Zhu \email{yzhu015@ucr.edu} [researcher, conceptor, contributor] } } diff --git a/tests/testthat/test.basics.R b/tests/testthat/test.basics.R index 21be816..0991a95 100644 --- a/tests/testthat/test.basics.R +++ b/tests/testthat/test.basics.R @@ -1,15 +1,21 @@ context("Testing if basic functions are ok") library(tsmp) w <- 30 -ref.data <- toy_data$data[,1] -query.data <- toy_data$data[,1] +ref.data <- toy_data$data[, 1] +query.data <- toy_data$data[, 1] d.size <- length(ref.data) q.size <- length(query.data) +test_that("Errors", { + # big window size + expect_error(fast.movsd(toy_data$data[, 1], 1), regexp = "must be at least 2") + expect_error(fast.movsd(toy_data$data[1:100, 1], 500), regexp = "is too large") +}) + pre <- mass.pre(ref.data, d.size, query.data, q.size, w) res <- mass(pre$data.fft, query.data[1:w], d.size, w, pre$data.mean, pre$data.sd, pre$query.mean[1], pre$query.sd[1]) -movsd <- fast.movsd(toy_data$data[,1], 30) -movavg <- fast.movavg(toy_data$data[,1], 30) +movsd <- fast.movsd(toy_data$data[, 1], 30) +movavg <- fast.movavg(toy_data$data[, 1], 30) test_that("Fast Moving SD is ok", { expect_known_hash(round(movsd, 3), "ffda40fd35") diff --git a/tests/testthat/test.find.chains.R b/tests/testthat/test.find.chains.R new file mode 100644 index 0000000..d939ca6 --- /dev/null +++ b/tests/testthat/test.find.chains.R @@ -0,0 +1,14 @@ +context("Testing Time Series Chains") +library(tsmp) + +w <- 50 +data <- gait_data +mp <- stamp(data, window.size = w, exclusion.zone = 1 / 4, verbose = 0) +res <- find.chains(mp) + +test_that("Find Chains", { + expect_equal(length(res), 2) + expect_equal(length(res$chains), 58) + expect_equal(length(res$best), 6) + expect_known_hash(res$chains, "d7c3f43152") +}) diff --git a/tests/testthat/test.fluss.R b/tests/testthat/test.fluss.R index 94240f6..02b751c 100644 --- a/tests/testthat/test.fluss.R +++ b/tests/testthat/test.fluss.R @@ -4,10 +4,18 @@ library(tsmp) data <- fluss_data$tilt.abp$data[1:1000] w <- 10 truth <- 400 +nseg <- 3 mp <- mstomp(data, w, verbose = 0) cac <- fluss.cac(mp$pi, w) -segments <- fluss.extract(cac, 3, w) +segments <- fluss.extract(cac, nseg, w) score <- fluss.score(truth, segments, length(data)) +res <- fluss(t(data), w, nseg, gtruth = truth, verbose = 0) +res.nt <- fluss(data, w, nseg, verbose = 0) + +test_that("Errors", { + # big window size + expect_error(fluss(table(data), w, nseg, gtruth = truth, verbose = 0), regexp = "Unknown type of data") +}) test_that("Corrected Arc Count", { expect_equal(round(mean(cac), 4), 0.9941) @@ -23,3 +31,20 @@ test_that("Segments found", { test_that("Score", { expect_equal(score, 0.259) }) + +test_that("Full fluss", { + expect_equal(res$score, score) + expect_equal(res$segments, segments) + expect_equal(res$segments, res.nt$segments) + expect_equal(res$mp, res.nt$mp) + expect_equal(res$pi, res.nt$pi) + expect_equal(res$cac, res.nt$cac) + expect_equal(round(mean(res$cac), 4), round(mean(cac), 4)) + expect_equal(round(mean(res$cac), 4), round(mean(res.nt$cac), 4)) + expect_equal(round(sd(res$cac), 4), round(sd(cac), 4)) + expect_equal(round(sd(res$cac), 4), round(sd(res.nt$cac), 4)) + expect_equal(round(min(res$cac), 4), round(min(cac), 4)) + expect_equal(round(min(res$cac), 4), round(min(res.nt$cac), 4)) + expect_equal(max(res$cac), max(cac)) + expect_equal(max(res$cac), max(res.nt$cac)) +}) diff --git a/tests/testthat/test.mstomp.search.R b/tests/testthat/test.mstomp.search.R index 8ee8504..e9be136 100644 --- a/tests/testthat/test.mstomp.search.R +++ b/tests/testthat/test.mstomp.search.R @@ -1,18 +1,34 @@ -context("Testing FLUSS functions") +context("Testing mSTOMP Search") library(tsmp) w <- toy_data$sub.len mp <- mstomp(toy_data$data[1:200, ], w, verbose = 0) -motifs <- guide.search(toy_data$data[1:200, ], w, mp$mp, mp$pi, 2) -motifs.u <- unconstrain.search(toy_data$data[1:200, ], w, mp$mp, mp$pi, 2) +motifs <- guide.search(list(toy_data$data[1:200, 1], toy_data$data[1:200, 2], toy_data$data[1:200, 3]), w, mp$mp, mp$pi, 2) +motifs.t <- guide.search(t(toy_data$data[1:200, ]), w, mp$mp, mp$pi, 2) +motifs.u <- unconstrain.search(list(toy_data$data[1:200, 1], toy_data$data[1:200, 2], toy_data$data[1:200, 3]), w, mp$mp, mp$pi, 2) +motifs.ut <- unconstrain.search(t(toy_data$data[1:200, ]), w, mp$mp, mp$pi, 2) +test_that("Errors", { + # unknown type + expect_error(unconstrain.search(table(toy_data$data[1:200, ]), w, mp$mp, mp$pi, 2), regexp = "Unknown type of data") + expect_error(guide.search(table(toy_data$data[1:200, ]), w, mp$mp, mp$pi, 2), regexp = "Unknown type of data") +}) + +test_that("Message", { + mpnm <- mstomp(toy_data$data[1:200, ], 100, verbose = 0) + expect_message(unconstrain.search(toy_data$data[1:200, ], 100, mpnm$mp, mpnm$pi, 2), regexp = "No motifs found") +}) test_that("Guide Search", { + expect_equal(motifs, motifs.t) + expect_equal(guide.search(as.data.frame(toy_data$data[1:200, ]), w, mp$mp, mp$pi, 2), motifs) expect_equal(motifs$motif.idx, c(44, 108)) - expect_equal(motifs$motif.dim, list(c(2,3), c(2,3))) + expect_equal(motifs$motif.dim, list(c(2, 3), c(2, 3))) }) test_that("Unguide Search", { + expect_equal(motifs.u, motifs.ut) + expect_equal(unconstrain.search(as.data.frame(toy_data$data[1:200, ]), w, mp$mp, mp$pi, 2), motifs.u) expect_equal(motifs.u$motif.idx, c(33, 102, 57, 9, 127, 81)) expect_equal(motifs.u$motif.dim, list(1, 1, 1, 1, 1, 3)) }) diff --git a/tests/testthat/test.sdts.R b/tests/testthat/test.sdts.R index 549d84e..d930db7 100644 --- a/tests/testthat/test.sdts.R +++ b/tests/testthat/test.sdts.R @@ -1,9 +1,20 @@ context("Testing SDTS functions") library(tsmp) -w <- c(110, 220) -subs <- 11000:20000 -tr_data <- test_data$train$data[subs] +test_that("Errors", { + # big window size + expect_error(sdts.train(test_data$train$data[1:100], test_data$train$label[1:110], window.size = 5000), regexp = "Time series is too short") + + # small window size + expect_error(sdts.train(test_data$train$data[1:100], test_data$train$label[1:100], window.size = 2), regexp = "Subsequence length must") + + # unknown data type + expect_error(sdts.train(table(test_data$train$data[1:100]), test_data$train$label[1:100], window.size = 110), regexp = "Unknown type") +}) + +w <- c(110, 220, 330) +subs <- 20000:60000 +tr_data <- as.data.frame(test_data$train$data[subs]) tr_label <- test_data$train$label[subs] te_data <- test_data$test$data[subs] te_label <- test_data$test$label[subs] @@ -12,18 +23,18 @@ predict <- sdts.predict(model, te_data, round(mean(w))) pred.score <- sdts.f.score(te_label, predict, 1) test_that("SDTS Train", { - expect_equal(round(model$score, 3) , 0.353) - expect_equal(round(model$score.hist, 3), 0.353) - expect_equal(round(sum(model$pattern[[1]])/sd(model$pattern[[1]]), 3), -4847.100) - expect_equal(round(model$thold, 3), 8.726) + expect_equal(round(model$score, 3), 0.889) + expect_equal(round(model$score.hist, 3), c(0.667, 0.889)) + expect_equal(round(sum(model$pattern[[1]] + model$pattern[[2]]) / sd(model$pattern[[1]]), 3), -8289.256) + expect_equal(round(model$thold, 3), c(9.125, 2.069)) }) test_that("SDTS Predict", { - expect_known_hash(predict, "1c340d263b") + expect_known_hash(predict, "72ddd7b33b") }) test_that("SDTS F Score", { - expect_equal(pred.score$f.score, 0.125) - expect_equal(round(pred.score$precision, 4), 0.0667) - expect_equal(pred.score$recall, 1) + expect_equal(pred.score$f.score, 0.8) + expect_equal(round(pred.score$precision, 4), 0.8) + expect_equal(pred.score$recall, 0.8) }) diff --git a/tests/testthat/test.stamps.R b/tests/testthat/test.stamps.R index d251b1f..12d471e 100644 --- a/tests/testthat/test.stamps.R +++ b/tests/testthat/test.stamps.R @@ -4,56 +4,56 @@ library(tsmp) if (skip_on_cran()) { test_that("Errors", { # big window size - expect_error(mstomp(toy_data$data[1:200, ], window.size = 500, verbose = 0), regexp = "too short relative") - expect_error(mstomp.par(toy_data$data[1:200, ], window.size = 500, verbose = 0), regexp = "too short relative") - expect_error(stamp(toy_data$data[1:200, ], window.size = 500, verbose = 0), regexp = "too short relative") - expect_error(stamp.par(toy_data$data[1:200, ], window.size = 500, verbose = 0), regexp = "too short relative") + expect_error(mstomp(toy_data$data[1:200, ], window.size = 500), regexp = "too short relative") + expect_error(mstomp.par(toy_data$data[1:200, ], window.size = 500), regexp = "too short relative") + expect_error(stamp(toy_data$data[1:200, ], window.size = 500), regexp = "too short relative") + expect_error(stamp.par(toy_data$data[1:200, ], window.size = 500), regexp = "too short relative") # intersect - expect_error(mstomp(toy_data$data[1:200, ], window.size = 30, must.dim = c(1, 2), exc.dim = c(2, 3), verbose = 0), regexp = "presented in both") - expect_error(mstomp.par(toy_data$data[1:200, ], window.size = 30, must.dim = c(1, 2), exc.dim = c(2, 3), verbose = 0), regexp = "presented in both") + expect_error(mstomp(toy_data$data[1:200, ], window.size = 30, must.dim = c(1, 2), exc.dim = c(2, 3)), regexp = "presented in both") + expect_error(mstomp.par(toy_data$data[1:200, ], window.size = 30, must.dim = c(1, 2), exc.dim = c(2, 3)), regexp = "presented in both") # too many must.dim - expect_error(mstomp(toy_data$data[1:200, ], window.size = 30, must.dim = c(1, 2, 3, 4), verbose = 0), regexp = "must have dimension must be less") - expect_error(mstomp.par(toy_data$data[1:200, ], window.size = 30, must.dim = c(1, 2, 3, 4), verbose = 0), regexp = "must have dimension must be less") + expect_error(mstomp(toy_data$data[1:200, ], window.size = 30, must.dim = c(1, 2, 3, 4)), regexp = "must have dimension must be less") + expect_error(mstomp.par(toy_data$data[1:200, ], window.size = 30, must.dim = c(1, 2, 3, 4)), regexp = "must have dimension must be less") # too many exc.dim - expect_error(mstomp(toy_data$data[1:200, ], window.size = 30, exc.dim = c(1, 2, 3, 4), verbose = 0), regexp = "exclusion dimension must be less") - expect_error(mstomp.par(toy_data$data[1:200, ], window.size = 30, exc.dim = c(1, 2, 3, 4), verbose = 0), regexp = "exclusion dimension must be less") + expect_error(mstomp(toy_data$data[1:200, ], window.size = 30, exc.dim = c(1, 2, 3, 4)), regexp = "exclusion dimension must be less") + expect_error(mstomp.par(toy_data$data[1:200, ], window.size = 30, exc.dim = c(1, 2, 3, 4)), regexp = "exclusion dimension must be less") # small window size - expect_error(stamp(toy_data$data[1:200, ], window.size = 2, verbose = 0), regexp = "Subsequence length") - expect_error(stamp.par(toy_data$data[1:200, ], window.size = 2, verbose = 0), regexp = "Subsequence length") - expect_error(mstomp(toy_data$data[1:200, ], window.size = 2, verbose = 0), regexp = "Subsequence length") - expect_error(mstomp.par(toy_data$data[1:200, ], window.size = 2, verbose = 0), regexp = "Subsequence length") + expect_error(stamp(toy_data$data[1:200, ], window.size = 2), regexp = "Subsequence length") + expect_error(stamp.par(toy_data$data[1:200, ], window.size = 2), regexp = "Subsequence length") + expect_error(mstomp(toy_data$data[1:200, ], window.size = 2), regexp = "Subsequence length") + expect_error(mstomp.par(toy_data$data[1:200, ], window.size = 2), regexp = "Subsequence length") # unknown data type - expect_error(stamp(table(rpois(100, 5)), window.size = 30, verbose = 0), regexp = "Unknown type") - expect_error(stamp.par(table(rpois(100, 5)), window.size = 30, verbose = 0), regexp = "Unknown type") - expect_error(mstomp(table(rpois(100, 5)), window.size = 30, verbose = 0), regexp = "Unknown type") - expect_error(mstomp.par(table(rpois(100, 5)), window.size = 30, verbose = 0), regexp = "Unknown type") + expect_error(stamp(table(rpois(100, 5)), window.size = 30), regexp = "Unknown type") + expect_error(stamp.par(table(rpois(100, 5)), window.size = 30), regexp = "Unknown type") + expect_error(mstomp(table(rpois(100, 5)), window.size = 30), regexp = "Unknown type") + expect_error(mstomp.par(table(rpois(100, 5)), window.size = 30), regexp = "Unknown type") + }) + + test_that("Finish", { + Sys.sleep(1) + expect_message(stamp(toy_data$data[1:200, 1], window.size = 30), regex = "Finished") + Sys.sleep(1) + expect_message(stamp.par(toy_data$data[1:200, 1], window.size = 30), regex = "Finished") + Sys.sleep(1) + expect_message(mstomp(toy_data$data[1:200, 1], window.size = 30), regex = "Finished") + Sys.sleep(1) + expect_message(mstomp.par(toy_data$data[1:200, 1], window.size = 30), regex = "Finished") }) stamp.test <- stamp(toy_data$data[1:200, 1], window.size = 30, verbose = 0) - Sys.sleep(0.5) stamp.join.test <- stamp(toy_data$data[1:200, 1], toy_data$data[1:100, 2], window.size = 30, verbose = 0) - Sys.sleep(0.5) stamp.par.test <- stamp.par(toy_data$data[1:200, 1], window.size = 30, verbose = 0) - Sys.sleep(0.5) stamp.par.join.test <- stamp.par(toy_data$data[1:200, 1], toy_data$data[1:100, 2], window.size = 30, verbose = 0) - Sys.sleep(0.5) stomp.test <- mstomp(toy_data$data[1:200, 1], window.size = 30, verbose = 0) - Sys.sleep(0.5) stomp.par.test <- mstomp.par(toy_data$data[1:200, 1], window.size = 30, verbose = 0) - Sys.sleep(0.5) mstomp.test <- mstomp(toy_data$data[1:200, ], window.size = 30, verbose = 0) - Sys.sleep(0.5) mstomp.test.must <- mstomp(toy_data$data[1:200, ], window.size = 30, must.dim = c(1, 2), verbose = 0) - Sys.sleep(0.5) mstomp.test.exc <- mstomp(toy_data$data[1:200, ], window.size = 30, exc.dim = c(1, 2), verbose = 0) - Sys.sleep(0.5) mstomp.par.test <- mstomp.par(toy_data$data[1:200, ], window.size = 30, verbose = 0) - Sys.sleep(0.5) mstomp.par.test.must <- mstomp.par(toy_data$data[1:200, ], window.size = 30, must.dim = c(1, 2), verbose = 0) - Sys.sleep(0.5) mstomp.par.test.exc <- mstomp.par(toy_data$data[1:200, ], window.size = 30, exc.dim = c(1, 2), verbose = 0) test_that("Result hashes", { From dbfae6dc09ac5a50580a650d273ec0e6a42ee214 Mon Sep 17 00:00:00 2001 From: Francisco Bischoff Date: Mon, 20 Aug 2018 04:40:35 +0100 Subject: [PATCH 4/7] SiMPle --- .Rbuildignore | 3 +- DESCRIPTION | 3 +- NAMESPACE | 1 + NEWS.md | 2 +- R/find_chains.R | 2 + R/mstomp.R | 2 +- R/mstomp_par.R | 2 +- R/sdts_train.R | 2 +- R/simple.R | 224 +++++++++++++++++++++++++ R/stamp.R | 2 +- R/stamp_par.R | 2 +- README.md | 2 +- docs/CODE_OF_CONDUCT.html | 2 +- docs/LICENSE-text.html | 2 +- docs/LICENSE.html | 2 +- docs/authors.html | 6 +- docs/index.html | 2 +- docs/news/index.html | 2 +- docs/reference/compute.f.meas.html | 2 +- docs/reference/fast.movavg.html | 2 +- docs/reference/fast.movsd.html | 2 +- docs/reference/find.chains.html | 6 +- docs/reference/fluss.cac.html | 2 +- docs/reference/fluss.extract.html | 2 +- docs/reference/fluss.html | 2 +- docs/reference/fluss.score.html | 2 +- docs/reference/fluss_data.html | 2 +- docs/reference/gait_data.html | 2 +- docs/reference/golden.section.2.html | 2 +- docs/reference/golden.section.html | 2 +- docs/reference/guide.search.html | 2 +- docs/reference/index.html | 8 +- docs/reference/mass.html | 2 +- docs/reference/mass.pre.html | 2 +- docs/reference/mass.simple.html | 185 ++++++++++++++++++++ docs/reference/mass.simple.pre.html | 175 +++++++++++++++++++ docs/reference/mode.html | 2 +- docs/reference/mstomp.html | 2 +- docs/reference/mstomp.par.html | 2 +- docs/reference/sdts.f.score.html | 2 +- docs/reference/sdts.predict.html | 2 +- docs/reference/sdts.train.html | 2 +- docs/reference/simple.fast.html | 197 ++++++++++++++++++++++ docs/reference/stamp.html | 2 +- docs/reference/stamp.par.html | 2 +- docs/reference/std.html | 2 +- docs/reference/test_data.html | 2 +- docs/reference/toy_data.html | 2 +- docs/reference/tsmp.html | 3 +- docs/reference/unconstrain.search.html | 2 +- man/find.chains.Rd | 2 +- man/mass.simple.Rd | 32 ++++ man/mass.simple.pre.Rd | 27 +++ man/simple.fast.Rd | 45 +++++ man/tsmp.Rd | 1 + packrat/packrat.lock | 86 ++++++++++ tests/testthat/test.simple.R | 14 ++ 57 files changed, 1049 insertions(+), 47 deletions(-) create mode 100644 R/simple.R create mode 100644 docs/reference/mass.simple.html create mode 100644 docs/reference/mass.simple.pre.html create mode 100644 docs/reference/simple.fast.html create mode 100644 man/mass.simple.Rd create mode 100644 man/mass.simple.pre.Rd create mode 100644 man/simple.fast.Rd create mode 100644 tests/testthat/test.simple.R diff --git a/.Rbuildignore b/.Rbuildignore index 11393e7..1739a09 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -13,4 +13,5 @@ ^README-.*\.png$ ^\.httr-oauth$ ^make\.R$ -^CONDUCT\.md$ +^CODE_OF_CONDUCT\.md$ +^\.github/ diff --git a/DESCRIPTION b/DESCRIPTION index 3ac25d4..d158ccc 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,10 +1,11 @@ Package: tsmp Type: Package Title: Time Series with Matrix Profile -Version: 0.2.13.9048 +Version: 0.2.13.9053 Authors@R: c( person("Francisco", "Bischoff", email = "fbischoff@med.up.pt", role = c("aut", "cre"), comment = c(ORCID = "https://orcid.org/0000-0002-5301-8672")), person("Michael", "Yeh", email = "myeh003@ucr.edu", role = c("res", "ccp", "ctb"), comment = c(ORCID = "https://orcid.org/0000-0002-9807-2963")), + person("Diego", "Silva", email = "diegofs@ufscar.br", role = c("res", "ccp", "ctb"), comment = c(ORCID = "https://orcid.org/0000-0002-5184-9413")), person("Yan", "Zhu", email = "yzhu015@ucr.edu", role = c("res", "ccp", "ctb")) ) Maintainer: Francisco Bischoff diff --git a/NAMESPACE b/NAMESPACE index 917f5ea..1310e89 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -15,6 +15,7 @@ export(mstomp.par) export(sdts.f.score) export(sdts.predict) export(sdts.train) +export(simple.fast) export(stamp) export(stamp.par) export(unconstrain.search) diff --git a/NEWS.md b/NEWS.md index 175931e..5e1640b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,7 +1,7 @@ NEWS ================ Francisco Bischoff -\- 19 Aug 2018 +\- 20 Aug 2018 diff --git a/R/find_chains.R b/R/find_chains.R index 46fcff6..8daee93 100644 --- a/R/find_chains.R +++ b/R/find_chains.R @@ -1,5 +1,7 @@ #' Find Time Series Chains #' +#' Time Series Chains is a new primitive for time series data mining. +#' #' @param matrices a result from STAMP or STOMP algorithms #' #' @return Returns `chains`, a `list` of chains founded with more than 2 patterns and `best` diff --git a/R/mstomp.R b/R/mstomp.R index adeba8e..f299029 100644 --- a/R/mstomp.R +++ b/R/mstomp.R @@ -114,7 +114,7 @@ mstomp <- function(data, window.size, must.dim = NULL, exc.dim = NULL, exclusion on.exit(close(pb)) } if (verbose > 1) { - on.exit(beepr::beep(), TRUE) + on.exit(beepr::beep(10), TRUE) } ## initialization diff --git a/R/mstomp_par.R b/R/mstomp_par.R index e4cef6a..77e63ab 100644 --- a/R/mstomp_par.R +++ b/R/mstomp_par.R @@ -140,7 +140,7 @@ mstomp.par <- function(data, window.size, must.dim = NULL, exc.dim = NULL, exclu on.exit(close(pb), TRUE) } if (verbose > 1) { - on.exit(beepr::beep(), TRUE) + on.exit(beepr::beep(10), TRUE) } ## initialize variable diff --git a/R/sdts_train.R b/R/sdts_train.R index 6fd35ff..dfcd9fb 100644 --- a/R/sdts_train.R +++ b/R/sdts_train.R @@ -148,7 +148,7 @@ sdts.train <- function(data, label, window.size, beta = 1, pat.max = Inf, parall on.exit(close(pb)) } if (verbose > 1) { - on.exit(beepr::beep(), TRUE) + on.exit(beepr::beep(10), TRUE) } for (i in 1:n.window.size) { diff --git a/R/simple.R b/R/simple.R new file mode 100644 index 0000000..70e6173 --- /dev/null +++ b/R/simple.R @@ -0,0 +1,224 @@ +#' Compute the similarity join for Sound data. +#' +#' Compute the similarity join for Sound data. +#' +#' `verbose` changes how much information is printed by this function; `0` means nothing, `1` means text, `2` means text and sound. +#' +#' @param data a `matrix` of `numeric`, where each colums is a time series. Accepts `list` and `data.frame` too. +#' @param window.size an `int` with the size of the sliding window. +#' @param exclusion.zone a `numeric`. Size of the exclusion zone, based on query size (default is `1/2`). +#' @param verbose an `int`. See details. (Default is `2`). +#' +#' @return Returns a list with the Matrix Profile `mp` and Profile Index `pi`. +#' +#' @export +#' @references 1. Silva D, Yeh C, Batista G, Keogh E. Simple: Assessing Music Similarity Using Subsequences Joins. Proc 17th ISMIR Conf. 2016;23–30. +#' @references 2. Silva DF, Yeh C-CM, Zhu Y, Batista G, Keogh E. Fast Similarity Matrix Profile for Music Analysis and Exploration. IEEE Trans Multimed. 2018;14(8):1–1. +#' @references Website: +#' @references Website: +#' +#' @examples +#' w <- 30 +#' data <- toy_data$data # 3 dimensions matrix +#' result <- simple.fast(data, w, verbose = 0) +#' +simple.fast <- function(data, window.size, exclusion.zone = 1 / 2, verbose = 2) { + ## get various length + exclusion.zone <- floor(window.size * exclusion.zone) + + ## transform data list into matrix + if (is.list(data)) { + data.size <- length(data[[1]]) + n.dim <- length(data) + + for (i in 1:n.dim) { + len <- length(data[[i]]) + # Fix TS size with NaN + if (len < data.size) { + data[[i]] <- c(data[[i]], rep(NA, data.size - len)) + } + } + # transform data into matrix (each column is a TS) + data <- sapply(data, cbind) + } else if (is.matrix(data) || is.data.frame(data)) { + if (is.data.frame(data)) { + data <- as.matrix(data) + } # just to be uniform + if (ncol(data) > nrow(data)) { + data <- t(data) + } + data.size <- nrow(data) + n.dim <- ncol(data) + } else if (is.vector(data)) { + data.size <- length(data) + n.dim <- 1 + # transform data into 1-col matrix + data <- as.matrix(data) # just to be uniform + } else { + stop("Unknown type of data. Must be: matrix, data.frame, vector or list") + } + + ## check input + if (window.size > data.size / 2) { + stop("Error: Time series is too short relative to desired subsequence length") + } + if (window.size < 4) { + stop("Error: Subsequence length must be at least 4") + } + + ## initialization + matrix.profile.size <- data.size - window.size + 1 + matrix.profile <- rep(Inf, matrix.profile.size) + profile.index <- rep(0, matrix.profile.size) + + if (verbose > 0) { + pb <- utils::txtProgressBar(min = 0, max = matrix.profile.size, style = 3, width = 80) + on.exit(close(pb)) + } + if (verbose > 1) { + on.exit(beepr::beep(10), TRUE) + } + + ## compute necessary values + res <- mass.simple.pre(data, data.size, window.size = window.size) + data.fft <- res$data.fft + sumx2 <- res$sumx2 + + ## compute first distance profile + query.window <- data[1:window.size, ] + res <- mass.simple(data.fft, query.window, data.size, window.size, sumx2) + distance.profile <- res$distance.profile + first.product <- last.product <- res$last.product + sumy2 <- res$sumy2 + dropval <- query.window[1, ] + distance.profile[1:exclusion.zone] <- Inf + + + ind <- which.min(distance.profile) + profile.index[1] <- ind + matrix.profile[1] <- distance.profile[ind] + + ## compute the remainder of the matrix profile + for (i in 2:matrix.profile.size) { + + # compute the distance profile + if (verbose > 0) { + utils::setTxtProgressBar(pb, i) + } + + query.window <- data[i:(i + window.size - 1), ] + + sumy2 <- sumy2 - dropval^2 + query.window[window.size, ]^2 + + for (j in 1:n.dim) { + last.product[2:(data.size - window.size + 1), j] <- last.product[1:(data.size - window.size), j] - + data[1:(data.size - window.size), j] * dropval[j] + + data[(window.size + 1):data.size, j] * query.window[window.size, j] + } + + last.product[1, ] <- first.product[i, ] + dropval <- query.window[1, ] + + distance.profile <- matrix(0, nrow(sumx2), 1) + + for (j in 1:n.dim) { + distance.profile <- distance.profile + sumx2[, j] - 2 * last.product[, j] + sumy2[j] + } + + exc.st <- max(1, i - exclusion.zone) + exc.ed <- min(matrix.profile.size, i + exclusion.zone) + distance.profile[exc.st:exc.ed] <- Inf + + ind <- which.min(distance.profile) + profile.index[i] <- ind + matrix.profile[i] <- distance.profile[ind] + } + + return(list(mp = matrix.profile, pi = profile.index)) +} + +#' Precomputes several values used on MASS +#' +#' The difference of this function to [mass.pre()] is that this does not normalize data. Specific for this domain. +#' +#' @param data a `matrix` of `numeric`. Reference Time Series. +#' @param data.size an `int`. Reference Time Series size. +#' @param window.size an `int`. Sliding window size. +#' +#' @return Returns `data.fft` and `sumx2`. +#' @keywords internal +#' +#' @references Abdullah Mueen, Yan Zhu, Michael Yeh, Kaveh Kamgar, Krishnamurthy Viswanathan, Chetan Kumar Gupta and Eamonn Keogh (2015), The Fastest Similarity Search Algorithm for Time Series Subsequences under Euclidean Distance. +#' @references + + +mass.simple.pre <- function(data, data.size, window.size) { + if (nrow(data) < ncol(data)) { + data <- t(data) + } + + n.dim <- ncol(data) + + data <- rbind(data, matrix(0, data.size, n.dim)) + + data.fft <- apply(data, 2, stats::fft) + cum_sumx2 <- apply(data^2, 2, cumsum) + + sumx2 <- cum_sumx2[window.size:data.size, ] - rbind(rep(0, n.dim), cum_sumx2[1:(data.size - window.size), ]) + + return(list(data.fft = data.fft, sumx2 = sumx2)) +} + +#' Calculates the distance profile using MASS algorithm +#' +#' Mueen's Algorithm for Similarity Search is The Fastest Similarity Search Algorithm for Time Series Subsequences under Euclidean Distance and Correlation Coefficient. +#' The difference of this function to [mass()] is that this does not normalize data. Specific for this domain. +#' +#' @param data.fft precomputed data product. +#' @param query.window a `matrix` of `numeric`. Query window. +#' @param data.size an `int`. The length of the reference data. +#' @param window.size an `int`. Sliding window size. +#' @param sumx2 precomputed sum of squares +#' +#' @return Returns the `distance.profile` for the given query and the `last.product` for STOMP algorithm and `sumy2`. +#' @keywords internal +#' +#' @references Abdullah Mueen, Yan Zhu, Michael Yeh, Kaveh Kamgar, Krishnamurthy Viswanathan, Chetan Kumar Gupta and Eamonn Keogh (2015), The Fastest Similarity Search Algorithm for Time Series Subsequences under Euclidean Distance +#' @references +#' + + +mass.simple <- function(data.fft, query.window, data.size, window.size, sumx2) { + if (nrow(data.fft) < ncol(data.fft)) { + data.fft <- t(data.fft) + } + + n.dim <- ncol(data.fft) + + if (ncol(query.window) != n.dim) { + query.window <- t(query.window) + } + + # pre-process query for fft + query.window <- apply(query.window, 2, rev) + query.window <- rbind(query.window, matrix(0, 2 * data.size - window.size, n.dim)) + + query.fft <- apply(query.window, 2, stats::fft) + # compute the product + Z <- data.fft * query.fft + z <- apply(Z, 2, function(x){ + stats::fft(x, inverse = TRUE) / length(x) + }) + + sumy2 <- apply(query.window^2, 2, sum) + + last.product <- Re(z[window.size:data.size, ]) + + distance.profile <- matrix(0, nrow(sumx2), 1) + + for (i in 1:n.dim) { + distance.profile <- distance.profile + sumx2[, i] - 2 * last.product[, i] + sumy2[i] + } + + return(list(distance.profile = distance.profile, last.product = last.product, sumy2 = sumy2)) +} diff --git a/R/stamp.R b/R/stamp.R index 82e4571..72213b1 100644 --- a/R/stamp.R +++ b/R/stamp.R @@ -98,7 +98,7 @@ stamp <- function(..., window.size, exclusion.zone = 1 / 2, s.size = Inf, verbos on.exit(close(pb)) } if (verbose > 1) { - on.exit(beepr::beep(), TRUE) + on.exit(beepr::beep(10), TRUE) } # anytime must return the result always on.exit(return(list( diff --git a/R/stamp_par.R b/R/stamp_par.R index 9d94b66..3b4af25 100644 --- a/R/stamp_par.R +++ b/R/stamp_par.R @@ -107,7 +107,7 @@ stamp.par <- function(..., window.size, exclusion.zone = 1 / 2, s.size = Inf, n. on.exit(close(pb), TRUE) } if (verbose > 1) { - on.exit(beepr::beep(), TRUE) + on.exit(beepr::beep(10), TRUE) } # anytime must return the result always on.exit(return(list( diff --git a/README.md b/README.md index a71161f..09a2e0a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ README ================ Francisco Bischoff -\- 19 Aug 2018 +\- 20 Aug 2018 diff --git a/docs/CODE_OF_CONDUCT.html b/docs/CODE_OF_CONDUCT.html index 06f626b..7adf315 100644 --- a/docs/CODE_OF_CONDUCT.html +++ b/docs/CODE_OF_CONDUCT.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html index e1ddfc3..f6356aa 100644 --- a/docs/LICENSE-text.html +++ b/docs/LICENSE-text.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/LICENSE.html b/docs/LICENSE.html index 1880510..df077dc 100644 --- a/docs/LICENSE.html +++ b/docs/LICENSE.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/authors.html b/docs/authors.html index 64590ad..c2eac3c 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 @@ -112,6 +112,10 @@

    Authors

    Michael Yeh. Researcher, conceptor, contributor.

    +
  • +

    Diego Silva. Researcher, conceptor, contributor. +

    +
  • Yan Zhu. Researcher, conceptor, contributor.

    diff --git a/docs/index.html b/docs/index.html index c789e51..05cdaf7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -30,7 +30,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/news/index.html b/docs/news/index.html index 4eff28f..2f8a1fd 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/compute.f.meas.html b/docs/reference/compute.f.meas.html index bed846e..c103026 100644 --- a/docs/reference/compute.f.meas.html +++ b/docs/reference/compute.f.meas.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/fast.movavg.html b/docs/reference/fast.movavg.html index d51e696..af640f7 100644 --- a/docs/reference/fast.movavg.html +++ b/docs/reference/fast.movavg.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/fast.movsd.html b/docs/reference/fast.movsd.html index 1d0b575..e4ae809 100644 --- a/docs/reference/fast.movsd.html +++ b/docs/reference/fast.movsd.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/find.chains.html b/docs/reference/find.chains.html index 4ef4dae..4d64f24 100644 --- a/docs/reference/find.chains.html +++ b/docs/reference/find.chains.html @@ -32,7 +32,7 @@ - + @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 @@ -109,7 +109,7 @@

    Find Time Series Chains

    -

    Find Time Series Chains

    +

    Time Series Chains is a new primitive for time series data mining.

    diff --git a/docs/reference/fluss.cac.html b/docs/reference/fluss.cac.html index dc2ee41..67eb95e 100644 --- a/docs/reference/fluss.cac.html +++ b/docs/reference/fluss.cac.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/fluss.extract.html b/docs/reference/fluss.extract.html index 57d196a..f846c31 100644 --- a/docs/reference/fluss.extract.html +++ b/docs/reference/fluss.extract.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/fluss.html b/docs/reference/fluss.html index b58bdb1..06b5722 100644 --- a/docs/reference/fluss.html +++ b/docs/reference/fluss.html @@ -64,7 +64,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/fluss.score.html b/docs/reference/fluss.score.html index 860ebe6..eb8a2c5 100644 --- a/docs/reference/fluss.score.html +++ b/docs/reference/fluss.score.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/fluss_data.html b/docs/reference/fluss_data.html index 16a2ab3..3ed168f 100644 --- a/docs/reference/fluss_data.html +++ b/docs/reference/fluss_data.html @@ -64,7 +64,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/gait_data.html b/docs/reference/gait_data.html index e50dfc4..f9f88ec 100644 --- a/docs/reference/gait_data.html +++ b/docs/reference/gait_data.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/golden.section.2.html b/docs/reference/golden.section.2.html index a12f9f6..5cbb6d5 100644 --- a/docs/reference/golden.section.2.html +++ b/docs/reference/golden.section.2.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/golden.section.html b/docs/reference/golden.section.html index cc98890..d4ef0b8 100644 --- a/docs/reference/golden.section.html +++ b/docs/reference/golden.section.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/guide.search.html b/docs/reference/guide.search.html index ebf1d1d..89fe6a2 100644 --- a/docs/reference/guide.search.html +++ b/docs/reference/guide.search.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/index.html b/docs/reference/index.html index 1e513d1..1f4d57a 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 @@ -222,6 +222,12 @@

    simple.fast()

    + +

    Compute the similarity join for Sound data.

    + +

    stamp.par()

    diff --git a/docs/reference/mass.html b/docs/reference/mass.html index db932e3..74824be 100644 --- a/docs/reference/mass.html +++ b/docs/reference/mass.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/mass.pre.html b/docs/reference/mass.pre.html index 9076eb3..7fd50b1 100644 --- a/docs/reference/mass.pre.html +++ b/docs/reference/mass.pre.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/mass.simple.html b/docs/reference/mass.simple.html new file mode 100644 index 0000000..7020120 --- /dev/null +++ b/docs/reference/mass.simple.html @@ -0,0 +1,185 @@ + + + + + + + + +Calculates the distance profile using MASS algorithm — mass.simple • tsmp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + +
    + +

    Mueen's Algorithm for Similarity Search is The Fastest Similarity Search Algorithm for Time Series Subsequences under Euclidean Distance and Correlation Coefficient. +The difference of this function to mass() is that this does not normalize data. Specific for this domain.

    + +
    + +
    mass.simple(data.fft, query.window, data.size, window.size, sumx2)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + +
    data.fft

    precomputed data product.

    query.window

    a matrix of numeric. Query window.

    data.size

    an int. The length of the reference data.

    window.size

    an int. Sliding window size.

    sumx2

    precomputed sum of squares

    + +

    Value

    + +

    Returns the distance.profile for the given query and the last.product for STOMP algorithm and sumy2.

    + +

    References

    + +

    Abdullah Mueen, Yan Zhu, Michael Yeh, Kaveh Kamgar, Krishnamurthy Viswanathan, Chetan Kumar Gupta and Eamonn Keogh (2015), The Fastest Similarity Search Algorithm for Time Series Subsequences under Euclidean Distance

    +

    https://www.cs.unm.edu/~mueen/FastestSimilaritySearch.html

    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + + + + diff --git a/docs/reference/mass.simple.pre.html b/docs/reference/mass.simple.pre.html new file mode 100644 index 0000000..b6babee --- /dev/null +++ b/docs/reference/mass.simple.pre.html @@ -0,0 +1,175 @@ + + + + + + + + +Precomputes several values used on MASS — mass.simple.pre • tsmp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + +
    + +

    The difference of this function to mass.pre() is that this does not normalize data. Specific for this domain.

    + +
    + +
    mass.simple.pre(data, data.size, window.size)
    + +

    Arguments

    + + + + + + + + + + + + + + +
    data

    a matrix of numeric. Reference Time Series.

    data.size

    an int. Reference Time Series size.

    window.size

    an int. Sliding window size.

    + +

    Value

    + +

    Returns data.fft and sumx2.

    + +

    References

    + +

    Abdullah Mueen, Yan Zhu, Michael Yeh, Kaveh Kamgar, Krishnamurthy Viswanathan, Chetan Kumar Gupta and Eamonn Keogh (2015), The Fastest Similarity Search Algorithm for Time Series Subsequences under Euclidean Distance.

    +

    https://www.cs.unm.edu/~mueen/FastestSimilaritySearch.html

    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + + + + diff --git a/docs/reference/mode.html b/docs/reference/mode.html index bf89c7f..e4f0b9c 100644 --- a/docs/reference/mode.html +++ b/docs/reference/mode.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/mstomp.html b/docs/reference/mstomp.html index 1e1c1a5..df12516 100644 --- a/docs/reference/mstomp.html +++ b/docs/reference/mstomp.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/mstomp.par.html b/docs/reference/mstomp.par.html index 8d10b8e..957c25b 100644 --- a/docs/reference/mstomp.par.html +++ b/docs/reference/mstomp.par.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/sdts.f.score.html b/docs/reference/sdts.f.score.html index fe48f87..74a9964 100644 --- a/docs/reference/sdts.f.score.html +++ b/docs/reference/sdts.f.score.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/sdts.predict.html b/docs/reference/sdts.predict.html index 5040128..6f74ad9 100644 --- a/docs/reference/sdts.predict.html +++ b/docs/reference/sdts.predict.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/sdts.train.html b/docs/reference/sdts.train.html index 461032c..c1f0763 100644 --- a/docs/reference/sdts.train.html +++ b/docs/reference/sdts.train.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/simple.fast.html b/docs/reference/simple.fast.html new file mode 100644 index 0000000..0a55327 --- /dev/null +++ b/docs/reference/simple.fast.html @@ -0,0 +1,197 @@ + + + + + + + + +Compute the similarity join for Sound data. — simple.fast • tsmp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + +
    + +

    Compute the similarity join for Sound data.

    + +
    + +
    simple.fast(data, window.size, exclusion.zone = 1/2, verbose = 2)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + +
    data

    a matrix of numeric, where each colums is a time series. Accepts list and data.frame too.

    window.size

    an int with the size of the sliding window.

    exclusion.zone

    a numeric. Size of the exclusion zone, based on query size (default is 1/2).

    verbose

    an int. See details. (Default is 2).

    + +

    Value

    + +

    Returns a list with the Matrix Profile mp and Profile Index pi.

    + +

    Details

    + +

    verbose changes how much information is printed by this function; 0 means nothing, 1 means text, 2 means text and sound.

    + +

    References

    + +
      +
    1. Silva D, Yeh C, Batista G, Keogh E. Simple: Assessing Music Similarity Using Subsequences Joins. Proc 17th ISMIR Conf. 2016;23–30.

    2. +
    +
      +
    1. Silva DF, Yeh C-CM, Zhu Y, Batista G, Keogh E. Fast Similarity Matrix Profile for Music Analysis and Exploration. IEEE Trans Multimed. 2018;14(8):1–1.

    2. +
    +

    Website: https://sites.google.com/view/simple-fast

    +

    Website: https://sites.google.com/site/ismir2016simple/home

    + + +

    Examples

    +
    w <- 30 +data <- toy_data$data # 3 dimensions matrix +result <- simple.fast(data, w, verbose = 0)
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + + + + diff --git a/docs/reference/stamp.html b/docs/reference/stamp.html index 525ff41..7b01264 100644 --- a/docs/reference/stamp.html +++ b/docs/reference/stamp.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/stamp.par.html b/docs/reference/stamp.par.html index 34d3c47..58fcf1a 100644 --- a/docs/reference/stamp.par.html +++ b/docs/reference/stamp.par.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/std.html b/docs/reference/std.html index 2023cb6..6ea9bb5 100644 --- a/docs/reference/std.html +++ b/docs/reference/std.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/test_data.html b/docs/reference/test_data.html index 7c85182..ac63866 100644 --- a/docs/reference/test_data.html +++ b/docs/reference/test_data.html @@ -65,7 +65,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/toy_data.html b/docs/reference/toy_data.html index bd70f26..a824399 100644 --- a/docs/reference/toy_data.html +++ b/docs/reference/toy_data.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/docs/reference/tsmp.html b/docs/reference/tsmp.html index 249963e..2493d20 100644 --- a/docs/reference/tsmp.html +++ b/docs/reference/tsmp.html @@ -64,7 +64,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 @@ -145,6 +145,7 @@

    Author

    Other contributors:
    • Michael Yeh myeh003@ucr.edu (https://orcid.org/0000-0002-9807-2963) [researcher, conceptor, contributor]

    • +
    • Diego Silva diegofs@ufscar.br (https://orcid.org/0000-0002-5184-9413) [researcher, conceptor, contributor]

    • Yan Zhu yzhu015@ucr.edu [researcher, conceptor, contributor]

    diff --git a/docs/reference/unconstrain.search.html b/docs/reference/unconstrain.search.html index 4d02170..d1989f6 100644 --- a/docs/reference/unconstrain.search.html +++ b/docs/reference/unconstrain.search.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9048 + 0.2.13.9053 diff --git a/man/find.chains.Rd b/man/find.chains.Rd index 0bf27f9..c0d5ee4 100644 --- a/man/find.chains.Rd +++ b/man/find.chains.Rd @@ -14,7 +14,7 @@ Returns \code{chains}, a \code{list} of chains founded with more than 2 patterns with the best one. } \description{ -Find Time Series Chains +Time Series Chains is a new primitive for time series data mining. } \examples{ w <- 50 diff --git a/man/mass.simple.Rd b/man/mass.simple.Rd new file mode 100644 index 0000000..13c08aa --- /dev/null +++ b/man/mass.simple.Rd @@ -0,0 +1,32 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/simple.R +\name{mass.simple} +\alias{mass.simple} +\title{Calculates the distance profile using MASS algorithm} +\usage{ +mass.simple(data.fft, query.window, data.size, window.size, sumx2) +} +\arguments{ +\item{data.fft}{precomputed data product.} + +\item{query.window}{a \code{matrix} of \code{numeric}. Query window.} + +\item{data.size}{an \code{int}. The length of the reference data.} + +\item{window.size}{an \code{int}. Sliding window size.} + +\item{sumx2}{precomputed sum of squares} +} +\value{ +Returns the \code{distance.profile} for the given query and the \code{last.product} for STOMP algorithm and \code{sumy2}. +} +\description{ +Mueen's Algorithm for Similarity Search is The Fastest Similarity Search Algorithm for Time Series Subsequences under Euclidean Distance and Correlation Coefficient. +The difference of this function to \code{\link[=mass]{mass()}} is that this does not normalize data. Specific for this domain. +} +\references{ +Abdullah Mueen, Yan Zhu, Michael Yeh, Kaveh Kamgar, Krishnamurthy Viswanathan, Chetan Kumar Gupta and Eamonn Keogh (2015), The Fastest Similarity Search Algorithm for Time Series Subsequences under Euclidean Distance + +\url{https://www.cs.unm.edu/~mueen/FastestSimilaritySearch.html} +} +\keyword{internal} diff --git a/man/mass.simple.pre.Rd b/man/mass.simple.pre.Rd new file mode 100644 index 0000000..bc62f2a --- /dev/null +++ b/man/mass.simple.pre.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/simple.R +\name{mass.simple.pre} +\alias{mass.simple.pre} +\title{Precomputes several values used on MASS} +\usage{ +mass.simple.pre(data, data.size, window.size) +} +\arguments{ +\item{data}{a \code{matrix} of \code{numeric}. Reference Time Series.} + +\item{data.size}{an \code{int}. Reference Time Series size.} + +\item{window.size}{an \code{int}. Sliding window size.} +} +\value{ +Returns \code{data.fft} and \code{sumx2}. +} +\description{ +The difference of this function to \code{\link[=mass.pre]{mass.pre()}} is that this does not normalize data. Specific for this domain. +} +\references{ +Abdullah Mueen, Yan Zhu, Michael Yeh, Kaveh Kamgar, Krishnamurthy Viswanathan, Chetan Kumar Gupta and Eamonn Keogh (2015), The Fastest Similarity Search Algorithm for Time Series Subsequences under Euclidean Distance. + +\url{https://www.cs.unm.edu/~mueen/FastestSimilaritySearch.html} +} +\keyword{internal} diff --git a/man/simple.fast.Rd b/man/simple.fast.Rd new file mode 100644 index 0000000..c900b4e --- /dev/null +++ b/man/simple.fast.Rd @@ -0,0 +1,45 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/simple.R +\name{simple.fast} +\alias{simple.fast} +\title{Compute the similarity join for Sound data.} +\usage{ +simple.fast(data, window.size, exclusion.zone = 1/2, verbose = 2) +} +\arguments{ +\item{data}{a \code{matrix} of \code{numeric}, where each colums is a time series. Accepts \code{list} and \code{data.frame} too.} + +\item{window.size}{an \code{int} with the size of the sliding window.} + +\item{exclusion.zone}{a \code{numeric}. Size of the exclusion zone, based on query size (default is \code{1/2}).} + +\item{verbose}{an \code{int}. See details. (Default is \code{2}).} +} +\value{ +Returns a list with the Matrix Profile \code{mp} and Profile Index \code{pi}. +} +\description{ +Compute the similarity join for Sound data. +} +\details{ +\code{verbose} changes how much information is printed by this function; \code{0} means nothing, \code{1} means text, \code{2} means text and sound. +} +\examples{ +w <- 30 +data <- toy_data$data # 3 dimensions matrix +result <- simple.fast(data, w, verbose = 0) + +} +\references{ +\enumerate{ +\item Silva D, Yeh C, Batista G, Keogh E. Simple: Assessing Music Similarity Using Subsequences Joins. Proc 17th ISMIR Conf. 2016;23–30. +} + +\enumerate{ +\item Silva DF, Yeh C-CM, Zhu Y, Batista G, Keogh E. Fast Similarity Matrix Profile for Music Analysis and Exploration. IEEE Trans Multimed. 2018;14(8):1–1. +} + +Website: \url{https://sites.google.com/view/simple-fast} + +Website: \url{https://sites.google.com/site/ismir2016simple/home} +} diff --git a/man/tsmp.Rd b/man/tsmp.Rd index 96261f0..2e70aca 100644 --- a/man/tsmp.Rd +++ b/man/tsmp.Rd @@ -27,6 +27,7 @@ Useful links: Other contributors: \itemize{ \item Michael Yeh \email{myeh003@ucr.edu} (https://orcid.org/0000-0002-9807-2963) [researcher, conceptor, contributor] + \item Diego Silva \email{diegofs@ufscar.br} (https://orcid.org/0000-0002-5184-9413) [researcher, conceptor, contributor] \item Yan Zhu \email{yzhu015@ucr.edu} [researcher, conceptor, contributor] } diff --git a/packrat/packrat.lock b/packrat/packrat.lock index 5218792..4446c54 100644 --- a/packrat/packrat.lock +++ b/packrat/packrat.lock @@ -13,6 +13,12 @@ Source: CRAN Version: 1.0.0 Hash: 6abedd7919c4457604c0aa44529a6683 +Package: DT +Source: CRAN +Version: 0.4 +Hash: a6e844446350a7128c734516fa8215e3 +Requires: crosstalk, htmltools, htmlwidgets, magrittr + Package: PKI Source: CRAN Version: 0.1-5.1 @@ -24,6 +30,11 @@ Source: CRAN Version: 2.2.2 Hash: b2366cd9d2f3851a5704b4e192b985c2 +Package: RColorBrewer +Source: CRAN +Version: 1.1-2 +Hash: c0d56cd15034f395874c870141870c25 + Package: RCurl Source: CRAN Version: 1.95-4.11 @@ -136,6 +147,11 @@ Source: CRAN Version: 1.2.0 Hash: a76a309884277a4fd8a5d741965fbef5 +Package: colorspace +Source: CRAN +Version: 1.3-2 +Hash: 0bf8618b585fa98eb23414cd3ab95118 + Package: commonmark Source: CRAN Version: 1.5 @@ -195,6 +211,12 @@ Source: CRAN Version: 1.3.4 Hash: ff2840dd9b0d563fc80377a5a45510cd +Package: crosstalk +Source: CRAN +Version: 1.0.0 +Hash: c13adea5906fbe2becfcb5f843b26749 +Requires: R6, ggplot2, htmltools, jsonlite, lazyeval, shiny + Package: curl Source: CRAN Version: 3.2 @@ -274,6 +296,13 @@ Version: 1.2.5 Hash: 6a914517bc7770d6672da55de125c12c Requires: Rcpp +Package: ggplot2 +Source: CRAN +Version: 3.0.0 +Hash: 8332448b76ff31472a1bf6dd31fcddb1 +Requires: digest, gtable, lazyeval, plyr, reshape2, rlang, scales, + tibble, viridisLite, withr + Package: gh Source: github Version: 1.0.1 @@ -304,6 +333,11 @@ Version: 0.7.1 Hash: 69302be7fe9b4dbb2d1e971e63e4703c Requires: base64enc, crayon, httr, jsonlite, magrittr, mime +Package: gtable +Source: CRAN +Version: 0.2.0 +Hash: cd78381a9d3fea966ac39bd0daaf5554 + Package: highlight Source: CRAN Version: 0.4.7.2 @@ -326,6 +360,12 @@ Version: 0.3.6 Hash: 87bd72cdfc46f686bbd46b180cb5f0b5 Requires: Rcpp, digest +Package: htmlwidgets +Source: CRAN +Version: 1.2 +Hash: de18b75f31630089b22e30d4b188cfbe +Requires: htmltools, jsonlite, yaml + Package: httpuv Source: CRAN Version: 1.4.5 @@ -365,6 +405,11 @@ Version: 1.20 Hash: 9c6b215d1d02b97586c8232e94533e6a Requires: evaluate, highr, markdown, stringr, yaml +Package: labeling +Source: CRAN +Version: 0.3 +Hash: ecf589b42cd284b03a4beb9665482d3e + Package: later Source: CRAN Version: 0.7.3 @@ -376,6 +421,12 @@ Source: CRAN Version: 0.2.1 Hash: 88926ad9c43581fd0822a37c8ed09f05 +Package: magick +Source: CRAN +Version: 1.9 +Hash: 74dcfef63a0b0aa94fa61d22ca922de1 +Requires: Rcpp, curl, knitr, magrittr + Package: magrittr Source: CRAN Version: 1.5 @@ -404,6 +455,12 @@ Version: 0.1.1.1 Hash: c7e3ea486421c2fa5b03bb7fcd0415f6 Requires: htmltools, shiny +Package: munsell +Source: CRAN +Version: 0.5.0 +Hash: 247d1c1d72f3072563912ef860758624 +Requires: colorspace + Package: openssl Source: CRAN Version: 1.0.2 @@ -464,6 +521,12 @@ Source: CRAN Version: 0.2.0 Hash: 81a8008a5e7858552503935f1abe48aa +Package: plyr +Source: CRAN +Version: 1.8.4 +Hash: 05d65ee369a267f0d0c56604000c69b5 +Requires: Rcpp + Package: praise Source: CRAN Version: 1.0.0 @@ -556,6 +619,12 @@ RemoteRepo: remotes RemoteUsername: r-lib RemoteSha: 7a576028506708f56bc5db0bde5491de26648e5f +Package: reshape2 +Source: CRAN +Version: 1.4.3 +Hash: a08472524968be4e233b4c8d0ae5aef1 +Requires: Rcpp, plyr, stringr + Package: revdepcheck Source: github Version: 1.0.0.9000 @@ -628,6 +697,12 @@ Version: 1.0.3 Hash: 44837671df6bf1d0b863dc6f83f42a16 Requires: curl, xml2 +Package: scales +Source: CRAN +Version: 1.0.0 +Hash: 17b6945d25b9288cdf03f5e5005842dc +Requires: R6, RColorBrewer, Rcpp, labeling, munsell, viridisLite + Package: selectr Source: CRAN Version: 0.4-1 @@ -657,6 +732,12 @@ Source: CRAN Version: 0.1.7 Hash: d093478ac90064e670cd4bf1a99b47b6 +Package: spelling +Source: CRAN +Version: 1.2 +Hash: 084f65bd10a7253f957b616a3a257194 +Requires: commonmark, hunspell, knitr, xml2 + Package: stringi Source: CRAN Version: 1.2.4 @@ -713,6 +794,11 @@ Source: CRAN Version: 1.1.4 Hash: f3f97ce59092abc8ed3fd098a59e236c +Package: viridisLite +Source: CRAN +Version: 0.3.0 +Hash: 78bb072c4f9e729a283d4c40ec93f9c6 + Package: whisker Source: CRAN Version: 0.3-2 diff --git a/tests/testthat/test.simple.R b/tests/testthat/test.simple.R new file mode 100644 index 0000000..ac15544 --- /dev/null +++ b/tests/testthat/test.simple.R @@ -0,0 +1,14 @@ +context("Testing SiMPle Fast") +library(tsmp) + +w <- 30 +data <- toy_data$data # 3 dimensions matrix +Sys.sleep(1) +result <- simple.fast(data, w, verbose = 2) + +test_that("SiMPle Results", { + expect_equal(round(sum(result$mp), 3), 806.132) + expect_equal(round(sd(result$mp), 3), 0.575) + expect_equal(sum(result$pi), 135450) + expect_equal(round(sd(result$pi), 3), 151.06) +}) From 252b6109c4a313d787af3c08bbf5b6ea76965f34 Mon Sep 17 00:00:00 2001 From: Francisco Bischoff Date: Mon, 20 Aug 2018 05:06:35 +0100 Subject: [PATCH 5/7] rm magick --- R/mstomp_par.R | 3 +++ packrat/packrat.lock | 6 ------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/R/mstomp_par.R b/R/mstomp_par.R index 77e63ab..bb71220 100644 --- a/R/mstomp_par.R +++ b/R/mstomp_par.R @@ -141,6 +141,9 @@ mstomp.par <- function(data, window.size, must.dim = NULL, exc.dim = NULL, exclu } if (verbose > 1) { on.exit(beepr::beep(10), TRUE) + # # sound_path <- system.file("sounds/microwave_ping_mono.wav", package = "beepr") + # # sfx <- audio::load.wave(sound_path) + # on.exit(audio::play(sfx), TRUE) } ## initialize variable diff --git a/packrat/packrat.lock b/packrat/packrat.lock index 4446c54..921126a 100644 --- a/packrat/packrat.lock +++ b/packrat/packrat.lock @@ -421,12 +421,6 @@ Source: CRAN Version: 0.2.1 Hash: 88926ad9c43581fd0822a37c8ed09f05 -Package: magick -Source: CRAN -Version: 1.9 -Hash: 74dcfef63a0b0aa94fa61d22ca922de1 -Requires: Rcpp, curl, knitr, magrittr - Package: magrittr Source: CRAN Version: 1.5 From f173bda15dd04ee01ac988ff3b499438c53be936 Mon Sep 17 00:00:00 2001 From: Francisco Bischoff Date: Mon, 20 Aug 2018 10:55:43 +0100 Subject: [PATCH 6/7] rm beepr, add audio --- DESCRIPTION | 2 +- NAMESPACE | 1 + NEWS | 7 ++++++- NEWS.Rmd | 6 +++++- NEWS.md | 7 ++++++- R/mstomp.R | 2 +- R/mstomp_par.R | 7 ++----- R/sdts_train.R | 2 +- R/simple.R | 2 +- R/stamp.R | 2 +- R/stamp_par.R | 2 +- R/sysdata.rda | Bin 0 -> 253182 bytes cran-comments.md | 3 ++- docs/news/index.html | 10 +++++++--- 14 files changed, 35 insertions(+), 18 deletions(-) create mode 100644 R/sysdata.rda diff --git a/DESCRIPTION b/DESCRIPTION index d158ccc..9b4bc09 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -13,7 +13,7 @@ Description: A toolkit implementing the Matrix Profile concept that was created License: MIT + file LICENSE URL: https://github.com/franzbischoff/tsmp BugReports: https://github.com/franzbischoff/tsmp/issues -Depends: R (>= 2.10), beepr, doSNOW, parallel, foreach +Depends: R (>= 2.10), audio, doSNOW, parallel, foreach Encoding: UTF-8 LazyData: true Roxygen: list(markdown = TRUE) diff --git a/NAMESPACE b/NAMESPACE index 1310e89..738335e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -19,6 +19,7 @@ export(simple.fast) export(stamp) export(stamp.par) export(unconstrain.search) +import(audio) import(beepr) import(doSNOW) import(foreach) diff --git a/NEWS b/NEWS index 7ed38e8..5d9c893 100644 --- a/NEWS +++ b/NEWS @@ -1,7 +1,12 @@ -tsmp 0.2.30 +tsmp 0.2.14 =========== +- Added SiMPle algorithm for sound data. +- Added FLUSS algorithm. +- Added \[find.chains()\] to look for chains primitives. +- Changed dependency from beepr to audio (actually beepr depends on + audio, so less dependencies) - Added a `NEWS.md` file to track changes to the package. tsmp 0.2.x diff --git a/NEWS.Rmd b/NEWS.Rmd index 3bba9df..fd0d548 100644 --- a/NEWS.Rmd +++ b/NEWS.Rmd @@ -21,8 +21,12 @@ knitr::opts_chunk$set( ) ``` -# tsmp 0.2.30 +# tsmp 0.2.14 +* Added SiMPle algorithm for sound data. +* Added FLUSS algorithm. +* Added [find.chains()] to look for chains primitives. +* Changed dependency from beepr to audio (actually beepr depends on audio, so less dependencies) * Added a `NEWS.md` file to track changes to the package. # tsmp 0.2.x diff --git a/NEWS.md b/NEWS.md index 5e1640b..a162d02 100644 --- a/NEWS.md +++ b/NEWS.md @@ -5,8 +5,13 @@ Francisco Bischoff -# tsmp 0.2.30 +# tsmp 0.2.14 + - Added SiMPle algorithm for sound data. + - Added FLUSS algorithm. + - Added \[find.chains()\] to look for chains primitives. + - Changed dependency from beepr to audio (actually beepr depends on + audio, so less dependencies) - Added a `NEWS.md` file to track changes to the package. # tsmp 0.2.x diff --git a/R/mstomp.R b/R/mstomp.R index f299029..be68679 100644 --- a/R/mstomp.R +++ b/R/mstomp.R @@ -114,7 +114,7 @@ mstomp <- function(data, window.size, must.dim = NULL, exc.dim = NULL, exclusion on.exit(close(pb)) } if (verbose > 1) { - on.exit(beepr::beep(10), TRUE) + on.exit(audio::play(sounds[[1]]), TRUE) } ## initialization diff --git a/R/mstomp_par.R b/R/mstomp_par.R index bb71220..cdfe947 100644 --- a/R/mstomp_par.R +++ b/R/mstomp_par.R @@ -31,7 +31,7 @@ #' # using all dimensions #' Sys.sleep(1) # sometimes sleep is needed if you run parallel multiple times in a row #' mp <- mstomp.par(toy_data$data[1:100,], 30, verbose = 0) -#' @import beepr doSNOW foreach parallel +#' @import audio doSNOW foreach parallel mstomp.par <- function(data, window.size, must.dim = NULL, exc.dim = NULL, exclusion.zone = 1 / 2, verbose = 2, n.workers = 2) { eps <- .Machine$double.eps^0.5 @@ -140,10 +140,7 @@ mstomp.par <- function(data, window.size, must.dim = NULL, exc.dim = NULL, exclu on.exit(close(pb), TRUE) } if (verbose > 1) { - on.exit(beepr::beep(10), TRUE) - # # sound_path <- system.file("sounds/microwave_ping_mono.wav", package = "beepr") - # # sfx <- audio::load.wave(sound_path) - # on.exit(audio::play(sfx), TRUE) + on.exit(audio::play(sounds[[1]]), TRUE) } ## initialize variable diff --git a/R/sdts_train.R b/R/sdts_train.R index dfcd9fb..57d39a3 100644 --- a/R/sdts_train.R +++ b/R/sdts_train.R @@ -148,7 +148,7 @@ sdts.train <- function(data, label, window.size, beta = 1, pat.max = Inf, parall on.exit(close(pb)) } if (verbose > 1) { - on.exit(beepr::beep(10), TRUE) + on.exit(audio::play(sounds[[1]]), TRUE) } for (i in 1:n.window.size) { diff --git a/R/simple.R b/R/simple.R index 70e6173..e31156c 100644 --- a/R/simple.R +++ b/R/simple.R @@ -76,7 +76,7 @@ simple.fast <- function(data, window.size, exclusion.zone = 1 / 2, verbose = 2) on.exit(close(pb)) } if (verbose > 1) { - on.exit(beepr::beep(10), TRUE) + on.exit(audio::play(sounds[[1]]), TRUE) } ## compute necessary values diff --git a/R/stamp.R b/R/stamp.R index 72213b1..d6f4809 100644 --- a/R/stamp.R +++ b/R/stamp.R @@ -98,7 +98,7 @@ stamp <- function(..., window.size, exclusion.zone = 1 / 2, s.size = Inf, verbos on.exit(close(pb)) } if (verbose > 1) { - on.exit(beepr::beep(10), TRUE) + on.exit(audio::play(sounds[[1]]), TRUE) } # anytime must return the result always on.exit(return(list( diff --git a/R/stamp_par.R b/R/stamp_par.R index 3b4af25..8b451be 100644 --- a/R/stamp_par.R +++ b/R/stamp_par.R @@ -107,7 +107,7 @@ stamp.par <- function(..., window.size, exclusion.zone = 1 / 2, s.size = Inf, n. on.exit(close(pb), TRUE) } if (verbose > 1) { - on.exit(beepr::beep(10), TRUE) + on.exit(audio::play(sounds[[1]]), TRUE) } # anytime must return the result always on.exit(return(list( diff --git a/R/sysdata.rda b/R/sysdata.rda new file mode 100644 index 0000000000000000000000000000000000000000..e159947f5c80dc8138bbf7ad61ce070bd1c6cf0a GIT binary patch literal 253182 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¨I9QMun`qcr zFo#xef5=Usz>^^*e=m_daCC=3IfE(5aR|ag!bF(BlP+p)cr2I9)C>F zI5rssJOAROmLK9P{x=djD?XT#VOIGQeZ1cCnOcjTVL^l5O@C1flQR7qca_@w`~`XF z8OZ}C4<*RORq90{XpvFL1k|W!>8&qut=X8!hNz`CHL3D(=&)l%X-AnOX(_5wo}nX$-D#Gh2C9w?q(;#-H-JE?&-gHUeeY z?ZFF9m0J?P^|7PvA>Ry;&bK`8BR4fhrB4C(jxq%UY>dgf4f4lMfQQ}T+@=L}900%K z1(yg7N!Su&^+}*tDmo7$2+B{5X0-{jOIC|uwMiF!ADbC%JQ>`Py$wJ=2=q++g)j29 zGmrK$Y;N&dMPK)f(x?GzFiY$$!8b}XOuNu!CwQ8Xw#N*P8vDQRG-mz2($+kB+Yv`m z7gw#OpN!2B;*x{5kd`-cjggM($krO#YvPF!c3AyRkKl{yZ}@7C72{2wv=57mDIA>} z2YlzW4YlaL?<6!5S%MLDqqkZa8Tm$>ZDp8*pS)Q=ZjjjU;I&B?+Ov37}h{|Kv1zShpM3zVL5<{ph-JADIMRCfSv|@S%u9~Jtf+37>lThdOCI9%~l%Ite zi_F~xhLV^-C)jwSy$wh?+J7cY;QB7I#=sv&=$eO%ke5V0>{!7I>07@I&O zY5e#)FnRDwdpVDos?f>KRGY7|w@(|P5~A4L5AprNkYe7buPIu~D=^6Wb~H;qV4c9` zQW1ZGZc}67l$V%A`^R?Bu%4*aZ~=k)MqVjNx3?_cuOyj3S7{D%l7T$7>8)7Cut;+h z7NcXC=5nW6AcsxBQM}X|kYG~!C)@T7DWIGZc#~-kW3B05Zq9ACQa4X_0|7~NGAx_D5+(s9vl%}-O<(9Qvcj(cKr?JsPr)QgGTfdDT^u*`w+Uc1#iko3*m$fx)Jlu zYqzl;D9haQeALnc)SPrcIgkwQ?`Pqe&m0pfbo81tun+1Im{C!O{K=;&61uD8J!`qoEKQ zTT2L080D*5-|%}PE(_(~V4dU!y3tPtr}DeH$Zaw)q9-&l5wc5TUC5A{2X9^{SmBKx zO$HE5Zmb%>5_jqnDk#{b{UrJbqNde4o0NqToxwwDg$6vs2B|Xq`jhZUTEn>_h4@=d zI(i#TofCuejMA#?V{=Y*Hz9?1)K4;4!h&NR7B ze3qbQi|dNccp1JaOqv=xuT~*nErW|qVr4nt7@`Ika8~3m!IEvCwp~Pt*h?!cQW>Pc zgM2feTk{PpbyaJO=m@P;cgatcmHpht50wNWofttCDZVL*(_{>%oF zg5mNcmktJ;_b`p+azD-LX)ZzHS@ktzo{tRmIxybSRJlA?h z5?<@`sxe?cVp9-qCn;G__Eurubx>{MOSq-xURk21<)~y)lo$T!?R%qP@ddLpky-3k zJMmYS;Q=Dd9VNUm7*^~n;(qYg3;8iWCS*+5hslk_bYHXS7^pI(9Qp%}WGJn(DRurJRL4m89)<%sx$s@s9oTAn#U=!X#YyAVZ!){09}lpTvC& z?VENY^|e_9f4kWubIA?*s8>^a8v}#)``)*R66i1?PmK|N)|HVtQsUkhJAI!#9;AKi z9jXcmm!x{#EILuB1bgM}zZ)bQL6Z1#DL8+$tdSt*z68$r(z z0;=F$KlQ5~wZHPkWrj@(2^Tupt~MX2hyH5%CB1fmM;qo3)||*(A!iNND^VYz_!INuKoYDIk#fKkSGi&1DVpQ$7Ua2siBDMAZslrq~Zj;-R?B_N{an6Z0-`S;CYAe1v1u*Q75-@0-g$ zzGr0LLF^|^pM@~WKOkZerquNC*(l2vq`warIoZkd5t$!0_l_kaJps99cwacXI2GbC z^S?fs)El(neIeP|Zw+`eWymXG*K$h4H%u%u+8BE(|5~cpGFGEN7TXNc-|eb zbC}qalvG=Q*w1XYKNn;{nUr2X16E$Di`XeAoVpUPg%4aijWJ!~ayUyykBW5=>9O=87N>Oj-t`oGk7Y&Lfl{Wo&(H&8WWk1;-0VZv~d6nS~`HoaT+@V z)}WWs{3PNAgxUE_px1M#2#RXv-tA7yYjj@cgldu}VFh*a;=Fzlc7ua{v2m&8oVUJ$ z?-$BOd^Dz-IT<5q-Ef4&&yNPm`S7~^5;uxv{b04boH zTQNIGZx=r;|Js{*KF4T+&4(uRV$^esB-Au)qC- z9S1LcY8`u%=R#k?4$Cir+F;)+mRVHw37~{o7#RFTyONzP+7x=%S7t#PgNlJFU5x}o zy*{w5lyRQeHQ-_V`a1`N`)7Zijop4v?P`jQyRr67wt8Gtl5dtz%@sMhDh;#eNj_E1 zC-~N}lf+0=iy)pC#+p_Y2m5bHtk&nT}yOR;|)PX9Puc8-h zEO0HhYc0-)uZs1D4sGO)hbHrxK2@i>IELa+zXri|^}-<@k3dauN%DY>dc zp)?svcldd_b2I*;7@6UM{OO$C8trd|OcQlWOVDdtw#au}L?UBR=F5kYA3gZ!`csKS z)H)fDyT;nm1WqDGw-kr_6imFr0HP{h)d=RhGg%r@{(6V4z@-x6?HkF-*H=Eb0p}Lpaq!+98nkNu z&sTfl1tjfU!>{OST;Iux94x(GcPzx@%j9NPE`mIP6&+A^}+inLD z`&~y@(0b;^p{e9;A^*_!K}&a&&b8@qPpabgnIw|pYyC~9rgrGgu+odgY~=K%6;2jq zE8d;!O(L%S>q+g(9gO%DeHF=@qZT!fwa7oTCE1Tc-X-$BbuVGkp-A5F(-~aMx84*9 zoXV(kUDZ6#GYk*6YA3iVFZpjXGQ2W-qFIIOhTLy51*lxNtb5t12NXvJC#Czo28f~N z@4xu9axRwaB*?nu7hyOJw~ZUn%w7vrlg1uS<`HY{ETo!qhD!6tD)?|_#v=NmuPc_T?DROpL66!ci?Jbn8cx)u!+2QNLNGHRe`Ei%4$Mii{ORBa7R{$LlX03K$dR6B0Ztb;0E>M&llG-*;mA*rt>AdA}zv> z^UpssiluW8OYk6jxY<|NCcn{JYNcL<;_(reGJ4=?Wrp)fe&fCWVwzLg#PjW_0D=~vHj(@5S^pR!&bizh1f4oWO7t2`!U_{ z1X7vzPthHVtnF8NV52i@cj<|x1^JgBpZ2DDHwB?RB25nr!vW7WmtCBl_zK~l2W^bv z#qj$oBEM7C+h*mp+k45gKgT=gS<@#0^)oouS5B^8J3!+mxDT0^KO?QQ} z75?*iK8wGlUFZD9jbp_?;jPk|_r3E}&6(}NP`!gq#)iFE3qABt2FrQN^F6WxPYmX79e~Ura zR-$7WoTDW1W`WP(6!ZDLJ1;z2x8au&^w;ioU4YHRSG!-`756D^9EWEDYvHTiZ=E)Y zUCs};=kBDID_W(4R7RbTfd>tTF|=jV8~YkNxZUUcOigUtq)`TID9O`V=U7JJrYKlGOCekBq7<7x15d+osLRU}|9!m@nK zsEr$CmU8dz#{C=+GJ?9h+;lH?t>>Vm|mBy2W|t8X^Xkh;$-; z`Z$0j4MOQ8*@m&D9+Qjhkl&dTYgNuc=2g@Nj&^f%bOKTmLp0+*qQ#HOO_d-OA8!P5 z?I*u!#b=~Zs|1uN)UhNuB)JX?j_EBjtFNeB{r=nY(2dI?;9YmUTn%LYKz)L3gbTUg zIG5B#+YrK6`huhKAdw+0VvW})a_%EvJOGD}yq&5#jn2vn600Lsu;>#jTcOjYrxIhL zeU{E9+D^F_TOHBmT3Nd6#Z$FT6XV0qdMlsw3I*phT{&iLq30uc>wP}LafZt(1LWo= zZ>>Aj?{WJqI<0%#-qYKD(8Hl}|E}*nmt(7maaIl$^U#yu^3HJ*1K?fkJBg9cWl}sZ zj290imzU0Sg=j0%&2KU3?6*R+9UIV@ttC|He2Qc)6 zH*tIqU^hFG?70|^q2aNO?)*LE{gP9{b@iQ+zGy#Zy4x>l+Bxdrh4MK;#Hp{#Ge$_X zdSYQzgdbM3*C&wbGY#(kszDPQD^Qk5qBe5&H2h-d^$Pm?=?CWV_;1G2i#@SUd9Pll zm>09hKjnI?(Vv4p+RJZwZ9C=M{|XQkoKrgg#`Fml7@&OcU_x3o-1`gd_(RhdWSJ3P zg?m>Q;>lSuhp2O8yfv~)0#~Al;+!Tume*5N3ubday)O&mi5WfK7?J!YyhtzFx;e_H z>1CI#8GAO4`SeU@dyRXf`o4q7nTu}=ooEwV@)g}TGk;Qm;0INLsoi2ASKqCt8e9SZ$OeD_dxb0^m2o?$0v=CCUwroS6y_f7tt)A->IQYAWf51Q>?btWTr3f@J# zI6dF7USVJXZNdDEf@a;~FSKvp+~WYvo<*F7;#t-Iy8}-1>+ts*sZ9 z3&1~61KMhy{VuF(ban(pKZ=o2U-l0d7r%Y_DofyEA5ld;)GBh@yP+!w{td||#xmk` zM`sQfrMH+{HovFx<7RQeJ}>Z_UtM5lnxef{Ln0j*3l=Sq(5(9adONkT*$vumDKHWy z9S>`#dPs7H^nNoJW8(QedUCn>pzWB-+;aQPQicPUp($ag>G!h}lJYA99B;7|wY%2T zzjcElJCe=01KW7ssnsg^9qh&dYJRt*nelbLKhq6o`Z`Y%G|y(vL*|apPnWL^UwpnC ztwCrETCge}3nH!Ticr5Ha*`^IcRtTI%LJ_yuvP1C4 zZw)>-2suQDh2WUCVW>hG9@I;lv<~dWMKpcJcZNT2V0Ocs2&$>$^puR8^j|* zmUUteN=~^x;jQ%o5R7aMf#bqSn|zT111XR9=hMDS9JD`1mAyqAoRR4di3Yf*A*qd zRz5!t+x0PPDf;tMY30IO`Sew6oo}rq=Vv7|AmkWSv?KfBRMh#+eh!*y^JtqgHyCxe_)BZ;{MS%)=K!z zyOfRM3k2nygWUQupDhsgQ?Sw;x+?V9NnU`*V+o0mmwDZHqAhT9qT%04` zLOgD=9JeoUcKZCjx12i_`S7b^x?oi zRG#HPWrb#nr9)uJ+arWT&}|M^tuJT&=mQ?}2XV)^m%HcJCNx0L$C$ylNe_;sy0s${ z<7F<`Nq9zNZ>TRxXYsZwK5paTl+Sd=eM$XxxYAv`O8mgN7zS;r9>byjMD$ z@@I4r;tR+0Vv!0IWrK(!-b>*#YSv=cvM6<2=LB=1foG-Q{ZR0JpwiBEiTAMct9aqI zbim9!3X|g2D!;tY!V598b^J=1%ex`4}s<%MkGW3tMXYc)J?^ zVD>h_C8sQ^xPN;+RO#%ID@IjoqOgg42Kq<3wQ|?Q_dUw+*`1wm_LWF3qkZ&OgGXfd zUdtm{5MY;g`wVEZ%85?_hnxAWl#^!$f6TGO!mGqSL*d!_nK36r>^8l8%%sRrZ;+c%SXU2RxQlsg`kc^$d8l8 zcy_>_>jGUYiwR75+rI^N#Y9og9dTW(kGU1EHz+-cVt>l}{6YQpVTtoOQat}qMaa6< z5;tUf(zLcr-LyK0;peI+y7W6yobgsqI{ibbRN%)Zc$;PX6I1>8ToZCf} z4Zc(6HK%5U$XB>`Gea=W;M(nwn-XHv+s6-tZu=m)7xkFtL#b{#KAXB4eB-5uGqt%W zyH7W@UZ1zBh-r%b*O$K*lkVx$xh*+VNdA6uKj(@Zsf1QbPe#yOT56K(I#cT1ZT+8* z=_NYcfC^9WXMf_RvN&j-yZf7`)!6Wdu?8Ag-iz>Fde8b@rNoC?yKv1!0rGjy?m+RI z4^N=vfRdF#*_uz+L64WVaknIU`y0iZ8r7V66?YRSrWYikrXQHHepNcW|9TDbmQQOn zInR;~DI>(-bWzI7i9KNBi7?2R22?(fKhSyIzSeTke9(4q{TC9I*m3$U@?)o6Et5E- z`Oj-jx6_`!WQq*e?5H)M>zcHGTXHDF{&Xgh5nBE$6w zBqycqN@{%*Q9*kv%Hs~5@Q;M0QeE!hjm!>W?`U2 zryw)(u^#qV9xJLCV3QGf_&Do1SO3m4R=b0@se+)y=igqxe-*(Jqq zXD-!C*z>b>Ljly>eHr8P45@`T_F^-kNz>*LTD>vM0{&0@-y%XC-UFwLzqgwmxm)E-7opZjOx_tdgy?k%x z2Tem^+FxUSMMbyI7Vi`O=*n`sv59j2unN{knBFsdGyg?hq7V@9Mw*Fa$@2DT{Mhun zcrA-*2~MvW|JKE}I}0t+9Zh)?1!mSJt=~<{E=Qw0SS)Y(ToOOIe=iOivu7O=8PO># z@>(}1u)Xne*-0*JWKUN5Nhc9Yt=c8XUV=Q0c$M;Cx@N)G@!D_Q`<4Ypxoyu65d+5v zmk-z2g)?SS!aAEI6o!5b90s(UzmDr~aSz1hhZQKCa8&(1Ew-_tqjI8EbdS3eWIvB& zP~?h(I~2Z;*O`6$G3$&7!O{NF6@Nv&sP&&*hLhOB9dg%Q`1KZ({Ev5& zDia4jR1YDWY&vq=*M6y5>x@m0st@dXJ)JbU_g!wG)W05yp%3t4BBecuc%WSM_}27) zeQYWFZ}tTlwYHl0z&>R%k=Klo3kCY>q$ZpD3qUaBQQ@(&!|TD{$)0lRMfKy`2NtnG zYUXazF@e%g=mP5RB&n2l1RRPZc6>H1WxXp@m714Sd$?X@q+ah?N`7M=uIRqCJf-jd zbmBchY$LhWFoGl_btRThkTU3S4%>Z6~c2TxE zp*ABAna&C5X(d~lV(A{ow=O{)JK7sEH{(UV^ICec^x54y9k}I}>IOBIcz%?=nBCDD z=k`Q@q4a9b!Nc{zoEqbrRMPjnS*;nL($|lLeqD=bwaipGXbQ-W{vF22Bi?e|^}D!} zce%(`Q0b3#QMF&2^V9}fOl=(<)!(QOpR$-JDpgF;Qzv2m+Fk}+du7wJ5t~@^;q9NB z9#?FFzJHexH2hF$*B*NG$V}UFW63mbWHc+%m?=_2RBGYliFzvR-%vD>#`n2xAz(({ z##vtd+xlDNh=%F70Rz`~l9RSnQBB?Yw{JCkkKp)(`RWhK?6Wkty(}_Pe<69xf6xyr zXy8W-M5D$-rCFwF?AGU*S(BcMaJu!Y`q~et+V(g@pckLUG(+(XteGob=C|tE&Tl=n zzjibC1DAt92WTXiOQrlcnXB`<-Mzy9hN+DWO;%2tnPvw@?HXtjT#}ZZesBB9s^HR? zj?2h?Z&H8nbZ5^HGgM!2r26vo=!m)11d%dzFp=kcYIJ&;JXybnSsqS66!dS;D&4+o z1~sd4di*5ezgEM>eX}*@PTwQhEx1}xO|k>Mx=DixHk9qB zNY@ccy)a>Z`MSUcoh)L}IGyXc8GbBqx7#h>L7Atuem55gH=cF3eL0Zx0t#KyiYzLn zla?t^*vITD47mMW3%QwCwZr&MH?Xf)4C^U$XDsqs=k2Jdfw(})irLD~1Lkt%n5zrl zuUNG|n=sfH91v;z`}DZrrCcAd$|=2{mMd0#u81cytbu#)@nrn$N=e_3S4ND{55+qV zw68e2e7^tn$4M(rd}sNshUPrf95KicJ3nOqT*Pk|p`QSn%N_eEPXFV3MS927+^V_= z=al^1gz`wu)aJH8{FARsIoFz^D!3L*r_##UFFwB;Ty(VmAP@n6f5MbTh*T&&Rh7Hjp@aZxw&3|-WDz2-#d|Cp|)B76|N`kISBt6O*-#* zv0*qKzS{g9m3&R8R40=$b37_zg*7)QG~>I|QyWI@PpSi~sLEU$cP%L%T2Z%=f2}&l z-w;pJ9O&RC=&SPl{EJ z=9|pJE~668cF=W%xdSkS}5OwL-5iqp@mJ z#HmQy7}%%s!4sro-Di&K75#(UYTLkrax0@hFDg;h43;X^W9myqd!UJ~Lty)i%ehb>6JX6t#BY~Eph?crKB_j-!!sLoQcz?M{^ zuj5ah=P#|6xcXE(|1WLv6VFRGJnP7sNs%o@okNvGJZEG*REUm2mac1 za%KRo6!dZ2F+~&k_6{IjuXY*50fKDHy_}x(K>o6KS85r zyU0^fr@GO(0;Zcs6y+!-Y?9C0yk(QQ>;@cXVAG({(EU_lJM9944KeglYTD5R(|;l6 zV(vwUQOp`(S9T|w-sG>(*D$fZ|LwdKr6_;(kv4l@u^T9f0Itm}8`KAc zJF1VUh2D`Wuqb-_aECtJvU|YK5O3u+75;$H{xs9DO^nq;6e6(ydEa|q)w-ivn;!eJ++3~UK!%_GT0n{M(e7bwyZxs=Vpdez!H*$k zUu6TpSGYJb1VH|g-W+G>2^z5kzRh{%csfa6dSzEG@~Wh~#<@v$bs+5S>oqD`-DQ&r zo;OLA*)Q^~G$$lpN@$uF)wMbs2I*PC-%#F#)c&o8R3c#AHWSmlM|o_fM;7kJNjXC;VaZHyieaFy zIlr~|83EPHAh_QvwHQF{R}6>rG<*;9IQ%wfx}hMOiRxP1?W9VyPrtzU9NZVcW@~VS z2!NOE&jM>1G9nF)`$ZHqTbG!zj!$_Yiz)on`AvVi8_tac>3Nh}KCO8+hK%MQ+4Hyd z|BN@GiV|u<1kRQkt%mg4%LB|t#e(3ig%k5QY-g}>2!kXBXF-6u#rPs6i=|7@X-sc)nTdQ;Y$+!yzsvu&9Kj8gm1AkNg?=8~eHBz%0;B{LXFT%8_7liCN?W|g=X zv!TPq7njdoB)+d@*Qky=^!)dZXZMaw43ZYOOgt+et>LGQR(4$ATg z*`M{iyDt`aqa}aPa~HEI^`;@+tME@w?E}VS*93fS=Bc~pcQvKXjq$&}K<#FR$}fld z@zU;}f@VY+rOXya8E8A->fc^@^iuQ=OV$GkbrsN^%Dmra)rrE+pRedP`czM#7RwKL zQ8%TygV?D*(y$KNGTwhSE5o|NaHF^zOVIeQRVzY+cKtpq@G-K=8lpl;s%HNQizXRNB)Co z+?M$}6FC_UBR=hG&rF*TC@BvY!ws1(MSd+(bK-c~!(C8#d%;^?GIt0g2LEcUs{7}v z$FtY==@Wj)s~c^fvzpm^3!Hvdei&P7OQdEfv;V?WvIHru8!%|NsBif+o>B1^5n5Pg zes->UP2?_6a$_~)T=*5`b2bP5*;k6qMUiIew;|eIA=kzmKkILD zD6a&4nvbq6e0;74Pf42fMrNHg2lU7>f9)C(v#CMd$TTG0drm2atKactMX**w=n7%P96? zp~UigTc~gSEol79vLLEV|JIMB#mu!}WHdkAkM@_v^I#b>g%?Vkr}9XCBeNW%u)mVt z4##v4idQEJxW0+hyr#0PI~f7eBrs^2nK?O`ie5e1-u<0<_?o>Kz}`0bwLgPXa0Kh# z{Y;DOh)YnnSfxw!5LY9`d$2&>;(0r!2i)YQF}i~Op`!}pcMHpm{0~D?!qkM17mVW0j0mC0k@ z4z1A5deqv{t56rR%}sos6hf;h;cf}dOHp0ZV6juAlZ4Nl^=*gRV3ua>Mqe~qa5fad-DgnuxibN;mbo8-*L^FCvqL%Nek z$9R?dcKz`MjTxxM3xe?JTfznAV*@HAv-o}WF%(<+h??DSR0)GAI`%{ZdStCH++7!d^A<%}Gt(5iI_^buig6V<~d=_JRhb4)bMT zl<$>9pJ>ew_VuovtK&W3r-~mB+ODRN(ab&yxXpR|8i^Zj6|gi5j@Fq=GaR7jia{0r zhVGXYgwPM_imk4oKP-`o+iz+!E0HLayGN!weqKuJchWUpF@Cmjjnt!j_=~AZuQJ<< z)dDuDo4$Uf&h+3!scfc38<4jJzy9iFSIG;haeAw+IY-1^^pN}{-B~$o7P851?7DI^ za-ynRg7v=$8V&foy5hbPC!C#Q@h(F2tm^{w=VP&K6c@%m^KQ1Rw`<+wP}o+Y%lpAC z?48SdgyC74wN#E1!Z-UyxOiEZ(}4Yl;=C7Q#SA!J5Lr&6^EM6sO`&EVYN1`l!2TQQ zPy0Ylr5o86twPAzwrVx^o&OoUHht(F;Q3o<65oBv*N_0o9IKDb{Xm~)j(3>jk`+fO?Xq{z54N1igh3& z@Zx2_6Lnr%WPf@$aiM}?7NZ+S7K{wB!F;g%Sb^LlC|%cH#eVQw*&E;$m+5|>=~#ED z7j_X8pOo6W^LSZi`#fSh6|JJ)ZD_VrZqXC+JR@+cF92wtI#zkN%QKh}f)rGIsm|Bd zMt=J^q;=EqQJ`VfjC&BA4AS!>&HZvaW|7ibv<=z8^p}C!xIN<2uH9g{C3OO-dJgenK0gsF+P|?))W? z>+R{n53w#sV-ky&$_44}gRXY3JNc--A}8821b+u5TARDAyrOE?weweY&_ABzK=Mg# zFyW(2ec1i$s3ybw=9acK0F#n6_4gK75|k&or%l)8LSt{OSXyFfo=Ng=oNylMV%6*c zey^0PZL3N;zx2r=GrC=A9$bGsuf;ri?}+|6DIZ+3?+jlJTKSxt3gV&MjfGuCDUfa^ zcH&g6DyF11Coay{+luah6Yoi)UqSs7`&Zp~k(lQxCxd2VT(yZH_MiNT20{E9X^1Zx zQYNv?l!qa~-|v}~Rhxgw@i=DVT+JWu9}ZR7ncuPj znTC!;?h3aNTKNO04xfhebYh^>B6MDMzxVR{@W79IMLwgH1TQakw6eUR$}yYBJs0#< z_iEMXT6|8OH**8=^xh-4+1C?a4wx6Q(S&Ht{@^K!tXbVHO4~`*Y4?Zvfj?`3$cj2< zlhTM(v2fChVn6<7w0dZJW2yRl=oJUbV0%@$PABykIX8JXkk7LC5&kxm>%dX5m~QWt zhh5STvGB9{f0W>bsUsMqiT}^+Cluk|A5=Vl&ap%7qC56aS|(+~U(Gz!uW%wEHM^}ml{7qit z?D}CFVz3Psp@+~CPM^ALvgg`+K=%W2tj@iz2F3jmkGYE1n%z03Y}f2dfhX>tl6v@q zkNj6XSx+@r?!DRIgr{~R>Q_Q4t3r>#wz+^UU}k+UY-X!`(QF)SrX?+VPc-*EuLN+5MSzi)W~Z8wGRKuls24jG-bT{IOD&UwC?ya-dYpnwLd zjs|D8t)rGz?Bw${9YLnqvNB26coLJ_H%=%==jm-OWh+5| z^rMdSkbGX`jjp^PSkz4M-3PmkpQGTwrg`2Sv^tp>jsM$+yyZrZ;Ur9$wq9xCuYW1$37AUXr5xCJ4MbJsD= z*_Wd8NZZ;Y4G`xY@!8et!Ru z@v>0e$G*d=MMg`n7`(hix@=}AG1L!S+*N!JmJY=Ln{yB#u1%uL zt@cmRo@c*m8b2BC9uK z)8OnWhD;_btJ=%<%dD83^A47Y65&4%f_oj>w{ZrBX9ToCF=~xSpI(d)UgHiiW?yck z!<}iCFAD)LWmY@N$V@^%CsfvZ23?gIUe86YbMCoi(T4K1i&<0nsNQ&{P5h3b!ux zOp)q8)5vVOXC1Y@CbkPDpg$fFuh;_rmZLh-cbrAzm<^G37DcV2!L@3s7sqWJ+m)A; zsZj~pnb0NB-&q6YmB^|kn!o7Vm$@Wh)zQEPAL26LMY{~_9e&P{&rG4JfJQ4(=F-HR zCj(rL0Zu+bhpKH9+`O6rR7&s1W}|Qw8s=Q2pLR{29FN`yijZ>9qj&De1aBPB!aIvyEBkbrJwzj|(SmTu$(zrvgBW|G`vu;v@Nfh>|?L4^!xgF!(uY zXNpjubHFk^Iqjy&wMZmxl1a?$^Pz`Q_cTpt)1=!wOv3spaLMwb8_dyX;-qJmrNmLk z6C~d$skKU?8018dM_Ns?BORDVd=a(sH^*RSj9Z( z9N{CfRi_SiN|qHn(YRPdkdzi0(UnKwL*K&U^>^lR1r(h$|{y_;!)3QGX^*7>7rF8|?%m6(R+dT?C zqV#5NkdNe5%T;0tkzg|RnhlQPx|c!74m$t?p!z26sAe45qq3Ei8UU*~a!}asr4vHM zpM*fL7nLEP1psVIY*qA>grp~{q6_!hbs*S>gFJTjpoT^y8l-%1*jODZOeuYPE6o=b z1hJ+7AlDQ9WD%hQkhaEVBB}le#wP>p>)#t&K`${U09K4wD|Q-#s=5zkFXCn}pzb%l zV`oaTwpdOORyhvO3^M$h4R@U$!|B95T)@In$iMhp40W)Iea$>d?9dt?C`9Jt6L9km1ibcyJt*#I zk-0Hy!><8r?YONB-X@6c*hOGnYF8;^h=SvGzcD6=>xGCL3FvTnmFQWF`f;QRW3C{> z_BYya_v1ot%Iy7fK}l#QS3w>4?945g|8Dva4qT_96_6eL7)CQDG!MdR9utSb>(9Oc z<;b>ne2%yVd7S471B?Mra>%q1BI`m&7ZrF9^X5z%94bJ1o)a4YdmlYNmo-K1arGBs@}vzFe^#gYA(0kWq1gEI3J<`C za1B(p#xgH+)}l6M()6g5d;_&ske_wjLy#hM0oX@3@%E#7O0c%Z4U);?1TK^djG~~5 zi8xIYH|6OYz;yh1T{WoxP-E8QW#R^?AQ!qraoF&ZJO{Hzx06xaynmgfu}99ACht%r z2ziE})C$f*Q3}a`Wt?C#8Hj~o6nhCr6f;@)8QB+wDO;W+DXif+z%HAre3GspF}f*S zYx@kUVflU4w6*TRmxQyGb9-Qq6PBWvLf1RBd2o3CfIvme)bIv(o@_*2W+CRM_zCvg5mX8t1hAn6!@xOW@g_9vL@Q()Re*t7x%UVJE7d1h#?e<4aaxK z!4)LW;B|680Eq9$L4kT>lZRZ3=bUs5sYh+)IgIFsFZg3OF8b=%+=2zOQdo8CPc(+m zwZN5$Q?dz;inF+M^Z50pE8!W)-!HXmg-y)=Fv$39T!!R8_{2}gQxxw9lHEg9it$br zw!x(L0%87(L9#|=yKgmkI$H;Ls{8{&UStCzqYrR>alyLeKM$LisYwA;~`O1SH}T%{C4}`;lN6@#HJd)#C3urNi6+v zi-^`~T5=sc6;GZzY5nuc;uH@KJ`91yAJvC=#ta`4uT$R4z)arlXff}rj)WhH5|eVO zrthS0ahh!T?_=bByudl&LjHMDm9p##yc0Y;j!}oCKKJ)9E#y~QatA*`wk`_1Ir#=0 z-D!>32AW>p(lA2%A52`vqh1rtiVtvY6bad0${2Ddz8gv#1KZu(I3q1l065$q;t+ol zkZwWb{DDySVzK(!td)x1p8p+=LojR@OQw)(+ArmNNbX?9$qU*^pL}992%(#%krNKk z;c5V2HF2$^0%MSSrLSh{1=zE0*~#>CAHUX>wk2qEOdS1JX zAx(@yvPf!>K?2{0pensZlJs)_rNItphlk%6M}mJ{Nh`*lmwJK8P2$~mj+JCc$2UZ^JAvj$E8aP6I`780x6T2vQMAAz}8P$LlX-K>;%I|g}4 zQBECxahmfAntuw0yB<{g15nCPcEXb)3ea|s>x3lhmbJ7@xNrIkcZvg~dGf4Z05kiG zWXd)MWKIV`@2-M56A2YFTo|DXL@NaLQm-Tz6=H?zV*iCBH#9`o5GujB`sQtvNI}X| znDsK|bc76Reg44OHQ4_`6BzChOKsP`JWw`7VH~YKu&TsuNg#FcFBRvyF6SxdGXPd)la&6-R1DdqR*ZDu2`M zQ8>@UW$r+$rX6SzbGj%xD&wGAmeEEjYHovB!apxXD)0LYv_AyhAVg#?4icM$?94aJ#gGS?2_uDYxh zmMerZw?8=*dP0s);h78g8Q=C*xV=9a)pJSiZe7RlWkx4Y2$e zxdny003B_wfT|-k&{HJ!vqt~60P=!K6vqDi8}XURg_RI+ScZ182c!@api*nMA#_U{vu53n&4Ri(mt8v1KRL z$(Njh?q30~0EbUCHNZxID$*rnY?d09x=Qxv0IwL#k@{CjYC>Ij3L}1ZzVk#Tx^wHG zh$nFpY|(hf9poqrwTxbl-2r(Lzm-wi$kVs&Jxm%~F`A= z==`&wU)6Yw@y;ixK8#4t0WLgJCNn^FP-J@olq?x4{VzCTDchMxcX(o#L%{qvBLCzk zm~4kT8OnU}Y%1@5$nTl<;t=`EOMqt;4p6*@fxvf;iST^9Wh${90mm+a!NkxTf<`b6 z_vNax%{+XLG6wZ=C4?zomBNnW*~2-vDa(%>2Lc7861KPJWoxF+$k7uQpyu7g)IkE^ z(L#G-&R)nJPjS1 z|BL_4Xtr!4y1j|gShyx*O#-oLBU>**jNvE4IM+~nlZwN3zNIIm9=})iR~M-eB$G1C z7ZN<10+AY=K@!0tv+=T#2bHV{M};b3^|1<2F2?F`dqqVgJOaBz8U zrcSW|5z+r1|AYWB#0IUIp=M$aGXo*Ch#Lg3y-xbZA(tyraVRZ#Pt!kr)#omb(0;H4 zj7(HE0@l~(Qcw+a<#rg=Ucx=kDD35c!?uvMRXN2xX05z?-=D906^BHx_M1PaWFCd~ zK_*YY(Yqx3cGJX;f^8t~q|IcxqF{J}qO7ffE5f2A<8Qo3C4~Ye#R&35y_Y}8;c1n;KR>&Cthg0YFwj19{g_`7z?}3?*D6OR*JxA@uYf@K<7gc~#r-a2ojqtiRg! z91=mO1F@_DuYV!7MT0ebP?FJGfUQ9C$BC=AGthy0u7R+7u(DG>XFjtXXfNOXp86%A zD_x9kI`aY)gy2hdT0xQ$NX%#JZb7XUE*G#ZdR{c{lB*pHAMzvw^1|}xJ{~_j3`To1 zTAz77QTA`R$l?54RVBYsU3kt(Igc)EciN?}!qmCky19H=?ZCx!R$(i$YL11q^UywJ zs3&>%k}sVi@@!$&bhjoK%YQHJC35qE8BwxF47gnn-Y(lsCfNi4NaS`#Tw9{O^19n$ zt`p-~AfUjB9i4|19DP^i{LGBgmvC(I6j7jJ6jZjs#jNz3>8 zfLHtTe^Jf}qLu)JCtwd#pmV74FlU{-&x&6q(W{zkHla_q;ph1n4bN0;8{pkqaL$;g z`vKU-lb?+Hu0(k^ibJ7JiM=;S+hfCffa22_EO-)%CX=}NBg$6yf>E>-<`q`<46DCn zKIaxd{!B1`t{wl$W%L>wrs)y!B~K7wcPo&>j1^Er-vk|vGKS*EvY`8yL|ErJSoUj} z+K<}~fSNggZ;~c@f7_Nd4+UF_!b398M@%v)bN}c9chJ0srRSF=c<(BiEK3?hsGYq0 zm^knXp&y++ozUg@=lm|@+=Bus(=@!Sz+@1bKwPJDf+&9|n9PC8Zd`HQ2!M#~yB)#L zGxkHJA%CY1$PmbWl0VF(JF4?oecP78b_&cHf+HK3MGq-Q#*`yGAh)g@ru-V>O9s&e zr>_QN?Fc3Xh%M^jXu-;jNNl#V5CL|vLxDpmuy|>-m=lJmNkT{9DOhD$T{x(9-%oz& z-&w#0sUFY|tUgh%!V)L{Mb)fh@Y~fsFmitl{H5eM2~EYkyPpCJsPPO_f-6UKZcO1f z8UeB;XOkLufnMQO5&SY@ivJW=RbIuoa%+tr zy~=jKu!5{9>%C7y(A%nuJn|#q$QaKg7zx+vol7lkrdhPULtG%SsE@Zh(|M(99&f= zBwI{R>5e)Cp$F)Y;3_#`zHKZhD(DU>PmiLs^LGox1X18GFca${z|xT}0>7kv;rsc7 zE1>Iq>YBKua#<%L*<;7H-zIQ*+r8qHqMUcC25ysp9Zg{t__*{utLCL6 z^BpjZ*>%RB#zA0KC-^`oS{uk6pr%iyL{wPL40zXk3G>E)?jDpk z4+oZyT>%xsKK2v-6^-b0CfW3ht)6*ykf7hIvNIk+*3o1uEE<&FcoGWPJ@F+YT$7aX zfrl{MMf*ig*(^b}2XF`S3pfvohaav6R~`JQ-1fzWRPa+72P6{qn{KUPQHUn8La1zI zsm{vpV}B?W&W938N6AK22Jin4ZG@QL@_+Jn4sAj)8QcaxCM#RTkkp|-Cn9uv|6e*D zy=aBJ1qP$*b0{LS0)}WJ`n_R0g>RCpI8u@SG=2}@Oo=daC{B=C4z$3L^~!qDHc%|& zK*MQYk|?_nx&PHpn3R4Tv)|Hl5sE0MfFs8CFaa=T@LNDmnibTWfkb(CvNoL&AMOh= zk(FtnM4yq;LFo}=@46{WW5}8#O?6291{;PVLb3(RBXY%d3Gvo!;A6lj39t&OIW7sz zv9d|*O&Hs=-@5i6uCQHXcp8>=pq!*uU?cw`6n@Il%W3UpKBr|PE#Zb zVDsIDxMmjjrM*XDQ1`q3V;^07ms%n`e<>85ycG=5K_r{upE@268S9sWGweFbW`*x-Pxgmn{8+Ju$IvPXC~gr1`Av=tMLom#@-Yn&5=Uj?%X8>8JtHrqH#$w( zyGH~rpM(~lVCE^8{|Nt13|k2JX4Tjw(5bT#_ukiTxhMxI9}x!qzWe>c{(pnb0#Km`^{t*JXlJ79G72|=cEn@nWlXjR89$*$VX$ZY zqtDd-ZvJf=Ms*B4(3?0JJQX}m2BS-RtpHoWz?tIRrGR_qSA$>y0OC>S@s$fA-&ezV z-YPgwLn*!I5DRP1gYXQIP`uIAC4_=wa20$M@sWRO10QleygrW$)?`*0B35x`F`kfM zkj9crJF!lu`A~{{U8u8M#2W|Jom|Q5GBF_|5|nu;J0zEqLn-Ve*^5%H?YMw_UuC~j z$db4G{_wLxlir2U>nqD&b%+E1MLvFiE`@%rWvIq8van(&cH!e{`2lufADAjye)E<; zuF~b2t8%vM>^93$OJv?_xY=bsof#cF<8_Wk%3IShHmSTvx_4uS;>$a<{)uQkj1;o^ z@BR-&jlP!d<4(m}DvCWqPigh+AbX6f!bWvC%`>i?(w0O*6;?{^zS4# z-rTb9Hn;o5m%3O5#KJSS1gKb7R3xwdVtn|y)YUb&ge8ea!%tS1#W^)5453xcu=P?x zyfYtI)r5$n5@L0B+_)7Lvn5O~8Wcrsc~y!{wBF1~!TI}W0S{SP=M&W>cSXD9(rY(r zR=S1J(5+H|tls-?=?(m4o60mq?x*2}#v*=_o^(G5DBSwDtb|eLzS4-OqPU#EXL_cX zZq1(m`k_71+z+Uvt!yES!LBAIKe`qBE?Qf^L{F|s- z-V>u8v*NV1XxMo{?acB)xR?IAwxc#Ha(8-O{~PNy-OUkoKWkx0-tpI620NLUR^24Kp}?iV{m6H0Yj1}V zuQ>qrE@>7|R~<9rXn%N>uzeN3cIB3%js;6iw>;HRM#78ljcE?FBkxs~x5B$R7{Eic ze%D0Sbt5Vge|X)aW(nuB&AOQZRQSrGG#zE9RNek#=JEKHAc_mI2;;{3ZZA7H=4fP5IkuekSZX}#f z7kikQrQ#i;so+`C60&}kiu(%^n}3Z)g(iWR`O_hZR0m~FR|A~H zEe|d?v+pb&TaA?|gAuX$=p0u4eXpPPUSEzePV<>=7VEqZU^fKA|1+Xj%-e6NykySu z`1R}*+UN9Pq^wD+bi{!z?C`h1^bL|)f=c6bn!AgL)8*vx?Mqwha_s_Pu0{U&pfPy$0Q3-LEh2h5Wo)!3;HdyFN6vM(sxHY)Yo(cY zUw_>5zOJ2dI)2xdVIkvKd_~Wz+f4fKW}9=V{%^+M-!<3KlI85#4)Ru1(KW^2rJq`+ z(z**HB#Q#?Do{U~IcXb2KdayVmJ*#SbtZD-SLjAwvfJ5`DE=c_d0gq~Fn|*=>!JAh z&~Y*5!;#|nIZ<|g`%W}f}y zdDng0WGM^FUK(eIf1ov#O6KmEQU0USnR-*ZtLrS;E3Rx+1p>T!MM7V`m8Qk8KT3Tg z;D1fgh;WiQouHrQvXbs5|3uBvh|%yvBeS!`wbVYPr_MuHej?gFog}^lo(FlQ@v@Fu zO~065Lfb_cXNbmYGpIOf+>WfCp-Fa+i%xm;@zM+5 z#hSt=QX*HC6b$HivJ5Kji1OG(Vjco3(}#oR9aFnSJL}-@J1Uh8R6d}w0Zm@_9*PGopwQrPtJZS?EALr$f(PC zsC6-Lv-naAF6D}QvXg)pdD23TVs}o(lEQ9x&TS6e@4?4Eza|f-d~P=Xydz0j$oajz za-S`X?KjXQ7{q)7N-Sn3;9xLJ@P{ut1+hx`O>j+mdnFrI`tRS?1Yq8ZG*@O%bC_&8 z`E}HLDi{iMmZ@ZMJ<}2NBEkXB>z{PQM3x3nC}2*0vmca3*7~-se_L<=d!+MlKPGHX zdb#Kf;Bm=sBhqFzm)G=MQk%dwA2uMK!aiSq*V)(mXtez*9$IxAq}-T$WR>>yM~pSko0uo1UW4(7a z#fqt6Y2;j)-S3xRgK(A`ywND3=$!HRr$%N8t;~g&(J08EOX>3Ei(6G`DpRKpId@<~ zg$;GKPlD^iv^uFB|IGJ(O3LMO4^?+9O(%A6F2bB# zy?KUjE!;8XKSjo8Sl&eGU}yESQNEbj8t#b(n~wgF3cX5vn_|8Tbf#qol&u* zJ-znxRY@tiul#-Uk!Ae{t zUK__i?BghfYbw{hmyyzggH?*Su8&t zHZ#r^IV1{nGhM#tvBGcv_BNyvM%aD1{ZTY4?BLfbBP|t_ZNzf}c7K@9 zzNP8cveAEf|T_ZVKj64?&l=3=$HNMC`p}8shZEf%Ux3ku_*BcutyNdI`yx?>XhW+0;!wpl$ zy)+MG%};MS3kP>8&ZcOESY;>e>ji8x^#Xs?&$@BZ&OhDT;rJ-qa!bf=Gc3D_JM+9R zEn7#xU=)bQR>Qxw8FB1}-X|PN- zT^$*)cDK~dqB5m=I{9aEA+CB*@MF)Uon_d!r;l0+6{H(F{px6rZR4amV@3VO$H>0` zV`a2asA}nE@z}>BJyAjhT^Uqb!ic-27WcWHl$u@lYirQ5jN^PMZ0)`Mn{}o1L1fyD zf$27WIpVq3w`)`~?(iT$Ar*u)V<3NB(l>UCHO@oMb#l z7=3BD^4|k9_m>-wv@CaAB)`<|f3qCc3&N*ocs5+Ra{N~$Z4iFd+CW4*<;Y&&beTF~ zfp=pj4w2B-qc%}ec(t}k<@4ds@V_P(hA^J+ZriOd64I=aQN*_Ua7S-c!=sVZil2t8 z(i<<8h8!{#r?I?jA~&dtroTy^WVpw?qQ8ggRFhb84)^|PRTISjqaW8;?Nn+M`)9-j zE$g0MIU7H3!nj5cv{@0p@!ZVe+l0YU&5N1O7n2~het{@9gi-5vXxEdFVMQi+&C*fX z2l169bliD2569+2QD#>vkuxBZZJhFgbv5cM3sM|yaivVAXDzJhe*k?zg1^hDIJH)q z#HD<}u9ilw1`tIntX@hGJ$(RKco-O7{nEHs#v-D#;BBbPh3mY~-jeMYhgUZES28HOA>f1r5i!#-h$2$*62>TCJfgVy=$m{{Ys;GXeb7d{ z(=B@wc`vIwk6och#1l@Fcq&T*b>3wpZQ#LG^IRF)fDnkdE;Vu#Mi3-5ZpDI>B^5?x zMjd-~*?9Qzy-h69RRM2MQlO;YhD6YD- z3@fblwGqI*162nJUH92V`{)FWFuH^rVQ)R?rh{fF;g3$sIe9Jkm5*k8?7FrlG+!yp zRJ8|f7706cP-N6pCos^wCDcGy130e_I(A}lMZgf^!t=NWc;3Red; z(W2&eRnUMd9qcH?C*K$rbPqVf>MG0CTo4QM{TBwBsno1 zLJNA?@$~mUeb*Jn^-G??Ic#!L{&T5+Jd-hjGEIG3cTP#sM>>}9u%Up10(8$hh?Ge7 z5{i>v?AUiJf(&G7u%0H!M5a9%M+^GVR*PPVt6n%*bU%h}nXUU?echE)RV_OQqa3Xt%EvRo-Iqe65) zks8ceQBW0-l_JwPtup2cQ)e>+D|-bccxrIVT;#|}B3+rQ7Nly;r5JOTVR5j!wN*z)B#I}3rYgT(l1D|zFh8Y}gCekyE+@^KciZY|t2gDlcHtGF+Xr^s zClsq`21=Hw5u=48oh#L5HS`|>jUeNStBh!-n_0pnYKehq&?zIX++2s}QyNgVmP5=1 z;=!(EX)1PDRqj14#O_q26zIuOmZtL$X1xRR6Ny~R$#rLQ>X&BDw?)~8-RJBLAbu7J zAqoqDzdkbEExRu4xpfupg=?27V2BJs&T(0XDcHev1X%$v=YIvg?hZ&R&GXkK+sa#t zrq+;`lejUg`e@Snnj@7Bhf?!Lx~++g8}kab7oxrZfjaZt+oqyi!xcCpAmx+}$ei(H z(@kx$l9*W&bu^`7Y}mC}#p}UZ!0UMP-pO|&G2CESa9flp&LVKqhaJj{;HtKJCvN1n zV;n_QHMAuxRt}ZS3{+?<7joqw2t3{YGt$uLT6Y8cw^ICPQtmNMD9d{)voIz{N{B5X z=}BucAg-p-MQ1XxZw5V0_V=9MiY)mvXvLrkXo?FoC(KFI57t` z0ioz&mkdKrKu}OWPHEype?3Vd5DqA1NO%h9-(JdcEd(~{-^(;GV^q>FyP|u=ft;21kM$S3fGo!GW*-Atl&rY0^MZK4`;9bciP}Do{FzeI|!*MDT zf?Ct537w77OdBp>nKf=-$30lI?WR~;qIw4)*Ut3NiUFkTDL*jrNSx#um(iUoz!Fu_ zOuC}%>9THIQ{lsku;wl~CKZn%Fv*Z*i#@PdrH~!#GE8MIXReKzuBp#hDB^`IO1T zmd#Ws4DK(P#nsrdJOKaEye!9DiGmf08tuqCV@B{*IYz1FNfkhQZ$@4|T-)70_H0)! zXK>)pW*OmrP!&WCDrhBuCyOxc${a}W$$LcTZ{6kxj2a_y{E@^cHp!V7D8(re#1N`9 zOT=mEsdXWn6!U6My;@8fcsk?JM|KquE(e`^Pz3~dQI46CjI&CllLVrQ$;Sp=IzR7#E^`k`I?%z_M2jPAa8a3Fx7%d0;C#b#O& zm^nBg&)KckuNqAh(|&8~iU7L_L&995mscCyT$$boA#6E^W_k$7pe*RN#bxDVJ;k*e?&!eCH-kcr~N4ro#49^9aIH3dY zi5TUNdNN?s!mf1cr4dM`_;nR7S1)WYNS%&IWD8n^6Anw}1n38e9Xm~dGq5xl)kOOE zGEMv-@?Bohgb*^zu82f*uHF+8=+TFS5A{LQke2!JQx7ZPx*-HUw;RXym$Q*m3l6*vL1$?@P9?Fe+aU$yw{#YueJvSu?!ijL!tIMnB`xA8QddtwCv~J z8 z^{H44awm{ty)dX}kVO{VN?iet1)$G%#jXHL$>6(#jQoC7eKuDD)q!1jCsk1Ptt>xB zcGe>EVRp-5-T>tYac}QH|5pPFCaV>#GU`LdYa!^GS@m?6H;2oH-9Xz#FpllJ&WdDS zG@1L@1-qk{{dQSbP0H=uXgH~9jkZnYT~q~r6_w!~%m^rwG6%Bd98&mjTki16^w%pI zo6xw}Asx^Mr&Qy)b8hA8A+F7IH+tZAr%tyzW4f4C9qLMG)dl9RFUHT8&(64mWOXN8 zt6sO4xr?W%YiowkVh)MykB-T+yHT{qg@xf|en|?>ecf&A?DHY_w8X0X5es-(N3>20 zQ(5BV>x}iVsR1S|S+Z@Rc&60d{b^wW{Hw6!f_J)7Vcp4jz7g=9g_luG+!9Xy&S~I- z0+j};b7)7Lh`#o-I`eQocdFtJiz2d%D2| z3o#YIYP%M^e52QA1H2enm8IshM-9%nJuE6G2%^(%S7GPxaURj8N%wYk_&O%BMnwFC z4m9$v4jyJd0x-lN?+N7;)1T2szJE_nfGsl2L7RI#!rr~*xleILm8PO3HExHqm(uR= zb!|~)cxGT`hi8CzH%-;ti8F$0`xVjS-oEc64mSI8a-lxjH|&DoSHiWO49AC)tuv%3 zyY)Q9OTvly8Gc^1IT`9Y%C(o4ZnOElZSC4!pb4G{*CZ3}$pJKLSQaS`Y9gY0VsnEu zNCw{~oZSl_Cl@DwdjgR?N_DSTYr)>&?|IRs!sbz9fd? zL1;0e0yMg6@mrkA1j2gyUR-@V$7z7CDwPwi{%C~~a1kdR6L?eML&1BY4lfRW1zRGn z5RfTFP8Yilf*?Z*X@d1(Ra7)+kwqjyM$e;Q;pX&Gs>;7X=h0`D{~g`=!48N!sq$UL z&v|E*0&gl1)hhsMCaAsFdKMUAY|GxU%-lcH$K2GS*6r@@vo-jq&x6eY^{%>;v6d%& z++0tzn_+#{yWXFgt@K@wF3?}O*|yEx`IS%0Z@JB{&hMGnbAsKNB4^On41D@^A+!eV zCog$Sh%}D%!R1pSvU*v7;&E@W$%}rc7F$kDif4i55fOX1y#-Kar-IK9r4xP)?4B%* zItMMS$hb82*89n_Aa_+VukpcT)>-S=lFA2F{YUQ5%ZIimgLR^6*jPCiN}(&+bzV|F zI;Y(JQ{+=C9W|L|a<_PB_I9&WDsyZFfTa3bTCn)S(m31`tL^RQ+v0hY1LOM~Z!h31Raj z@v!ettia4{3gGx{`H^96RqpV4Y?r^ys;l$d-0u(&ZR=2eFku#aJKXX>`ibpy>H%(a5zr{9WdhDh=Exo62hm+wA#h zQFO|~`sprigj6p6K$OU_grU_K)DZ{T9{ zJ$m%&(VgJ$KHmuy@iV)@t>kef4HH;P@{PEV$yA1o-$w?I@-%OP^Eqhl5?Y8Mb)i?* zNQH?KNZf)^Aq?c~$dwfH`=!o)6?lDIq?UYS zN$`ZD%Kp*D4h12C!8%^VQzZr0u{1!LKzisbiMamQn_;jJ2LeQOCLNy{gjQ&(0ALps zn?=E29QSf*q!cahooV=4`TcU4&s~YU40W5N9|qC-lxX?e-B*no*7c(h8x?TKHUOH4 z)s<}SI}8T`mK7$PP>q*qCj@=LGOTYnLfrW)BwD4Nf!mV+1TZ)u%^UiMP7jn-Vi?w? zW_J>7Gk_6B2&2|Wp6mm4dfr&(!;c&S0wG3&Hl3EPff1pDjH0qLBKY2R-@MTw`pZWW zq|W;4$3@Ak5XqW|J!*U_CWt>q@5$K=6!`fE^9PQ#6;_&uLt?2??Z!)1WvHax$R-taE}Gp>t)eB=KToEpvE0 zf1)n<*01djX}YGu7I1E?T96Oq4MopuskQ=aF_vFvU==d_Cb8p>B|>Ab*BI zNs|SSF1PJ1h-8SsU%Vvo()x8f=A*~Hv5|70?;DUnXIwlT%27kvC_mQjE^p|*VX7g9 zpMu?Llf;fH6=4tU`p7n~GVq14|K#i+-~m4)5dMT80TNdDT>Lqve60T^fg}7c)4;1B zYA;D&@&AweG5>`oRNNkJljL%=lzk!xEAl;jF)!hh6Q-3aSEcE2I1{yfzne|~kbpu8 z5P>3)QUHjtKvG*sF^7!ERDzNV5sX!0f`AM`5-9;>Sg{x=ECfM*f&d1bWCjRxWI~q} z-T?eG1Tq&NQ}LE2B*F#h%vJ!Y)_j-jF;M|U z6<{cc#Zg7Hu}M)&5o!x7QmQC6sYFC;V;HQAR2C=*#8nWst$EIdlTbwk5LI0)U^b{R z5k}f7B8niyf`w?s7>X!}EL22{SRx857)4PP5fO?kRZ(IqZ3wYMRtU%}6k;q;2H7O2 z3`nq85kLh2K#L?s0)nX#h`~rGps)obSSYbVMHNK_gjE4RSs*APs-U966(wM>P!@EV zNaRLREC5ghyt}{9I~+WoCidL}#OL#ehd7e~xMl$lnpap+RPH#4Lu+368+^?BM;F3c z|2HVuwshyz`nDyUu7{g{4}Shnx9CHh9#X@eq6sl7v1Mggs>Q60b0#5Wvjh}Usx7uk z!nKXdaSR&D%F%^Ih?1nDB2=oZD=@{DWvZ$ut~FR9q8Nn{R4B!T6-Kh-m@2A;Mhg-& zr4}lnh>H;vSdoa*l^a>a;$bjk(8~rjwMGg>rLYkz6ptaBjH)aZB06PODhm`*6cvJt zX+cCpRasgw77C;hAhASXjErQ6g2E!jg-cjasZdlDQB{cr5m7~h5k#y~RxP$FQkEh$ zD-`H?>ouZEsH(6~D=Q?lv9<+C76QRQ+Y!0H_9g@%0j{%(!t@51(Qhy@6Bilc&oD3K8nnp`AT2;4$Lb5%I|8M3N^h$Xc) zB3ok0ltFrgm01+ULYu6Zh7_@kQdE^Hu@aWW0*F=>%-F(I(xr71G8n;`M%p1#R#dD+ zjK-rC%29<%kwigMMHOR>7%o~>Ru;snhziVTqm6AVTCAxuwpfUZ1yzC!5Jk8^a~5$i zxdq%Y(W!Uygg}r4=#gC7vTd!Lbmf~K0bw}|_!(=5Oq7uDeZ=(XsbYjW1Oyaxi3yPk z5fKUqf(TfyOmHfqn94ClVo+qLDHaKxAvZGubPog(gbrd}gPC^CVmAa!S4L`>Ycq+XqS(6Vdd+n_91lH|o9l3V2{z_ijxaJE zn58&L_&LK6%E3fDa3CR48{Bj`TMWw;fJZdAm^L*i!-+Y*ee&;}rj^5q+-T!|H)pk$ zuR<^F8%PbUPqb;6!THyXnSn1-e#?Mv(vGx@ zHeL+7Dq&o7-u+Lsy34Y;C~U*2Y%M;S4R)p(NS1x$M_^aRB<2$s_75X$>irsbmBS;LS||rj2_1u;n=i*!OA@~Xbld0sKh*lsQzN)s4kwyIR}Edn zu7s3gZ%YcMs*4eASNbK&_9cIJ%Ej!9#{wm>woiI2rjf2UFMglcVi+TJ*x9tSk7mD! zmhH8Hb)gdINIbUgxf{=|K3aD-94j5MF&gSSMfmqg%1!u1`{!4b0$Mj@e7L5L{w7|5 zDv*y{tIlp?v3+bHmxXm#frdE;omQYV6!4T6f~Ru|yZ@VBNO0q=N!rO}Q1D!FOMa9{xMR4Is_9|eh+&ZItoiSe&(N3@LYoLCX7ioZ*>IqHIu+uT?Jh5k zcO7ZWvM|iZId^%+p;Ed?JB}pp`Di4|kz?e)Pw5p0Vs3>Qkr;K%g~roGKt$8vS+t2otL&TLCb0P-~R`McC}bcE$<6-wL0Q> zX%CK=jQ7!QTpjM>@JEgNpbL2a$;*A~koncxwhB6s$5sw4^s_g>L}^~|H}9j5!JV$B zUVHQ|I1acQ#pTb;xs4D9;=s}1zz7kytDgY1_}LaM{`FMwDc_Y|J#yTyPhNmkUefq0 z79f(p)JMk6y*5_&LMgXPfuI=kWJq@1L5d+d6qmVJiuoT@InBu~3K}YO6}K3aBA50H~Eoh>lJJlxEGTT+g`%UB`^VQaF*( z!-l~!d=WF@xo}&#T}~n}%}Q3}CDP*{j6&;GQr zh-*`k((9oUTXS9Q2G?g-^K)g~g&(7_?z?QXEj}4~+|c^gqqeVmt;XI{*Z4Pi@AaMb z-fk}e7A%A}t7{fWDIkr&0H8NRsrK~tofIw7AycF66|f&qpQfKvq;q>i#mB1juhQGI z8kN z<^stS2#AW16j&@#Kv;^SArt{X5J8C)Vl0GGNT4Vw08vyC2q-L2P!tvlu!zanH3dXa zRwPu2j1-9wL1PtEVlh#IL}HOt5oIieNe06-K5q<}yr45k^G` zCA5G!YAgi;NYpBzL`8}yEEENWwhI<4Ml3~RT3cIt16ty;LTQi%ilkt{83!o}z!Xvo zBo+e66a|9Cgjfp&B8wt~QAJS^WCZ|30T{#)QC2D_AfPOR7^uZ0QYZ@`u|ZZqRUoiX zSgR36MT#KEh$@OG#1RnzVuFIGD#TdED#3(Mib$~;6;X>65fxNfHWh_H7C>1d$VDIu zMUaaN1*pchrD&8I(YA=x7TZ#yF-0wuL0K3qQYeg76+wtGghnF-Mk)%VRw$r?F&L^V z5mrVE6j5TxsTho6D#1}$D#eP5$c#}`7|5v+Sg;j>Dn$fPNW~UKSg=M#h>gbL3l$Jh zNTgVzh{R%wh=7byV5+Fa1yE8&7>X*v1XM_|QAJ`ZD#T=h$i^uwGVQF(HGY@gSqX?~ z6bPas!bT)&QcA!pTC7G4RDl*nkWeZCQWmrorGTO;NGOV=MUv8^777<(C0vUF(x?j*0T{AHBB=yq76O7WL|Gsp zD#VKvL9^rA`DanVv$8yDFjes1r-rh0TB>TN@GJ6fTA?T%u@?+ zrQDi%ESSK|q@i*yVrCAs?%QK7hb)EKP^^G0ErRA+ zqm)cWn5ImmxpNH58e-kIX0+S7o3t8Su`;=BYh7Ft(@JJ$W|1kaT&g;4Znm>V#ZzgH zQM(yqsk>}4*Jo`^-I^V@8@CrU?XgF8oogkU-K=)n+fmK1&78PMghZr@B#bF{T;{IG zf+Q;7>c&Q(ZlHvWpowuAfvOU?lo8SnifnK$L|z0!2^SEAE-?{dsH8*@s7YA}DHI@# zSrm~%3JVR(adO0r5ky*+2r)$#C?Yj;12+Gi^CpZbuESE?T;| zW42RB>DyOpcDY>GHFVt4;hNTFYcSPq)zvgA?X4GkFx|Rl;^L#1S~6YQ&7Ed0IN`H% zGV57fxpQYq-KxyfYV6>uWy)#RWpg!iFvZnvHA}3urOmZ2t<`p|9U9o%3b!T8t+kt1 zS1zvEn`UckwmRDe?OdamWX!v4YUM*Nt*N|X-B(*??QNSjZMx~i+-)^;45NnUTWz+^ zYU$fX#oZq+kVmveQw+GaCa+hcaso3)07)ZeB%Zl?AW-8HMGY0a zNlopyYj!ksw%MsSZlk+4%?9O&JGF)zs9o8oZKllDT+Qq@cbRv!wvDac(@H6Fx&k^I z6~stJtU^YFj&MRn5C{u8D=0v2LAndAxA$ho$y0VUORJm|G`hQGX8zjUwb)!0s=D`C~pvX$X@j8J?jP_EJiEu?L4=2jpF9-CWXV z&)4>y+6|1DUCyRWK@b+`%rPZvL}LX6K}A~DEh$S%f+)pR6561s zAdE8O2P)d!w-}aDWk$B5mW;Ng0;R02V^Fe+GPvf=#56cHi%@FjVqt2CmzjiakVt+=HNTPVt9qKJc*sH!4dxhhmlX^%mq>%Y4*bDP_-%e8hHU2ZjZwWl}qew5*oc$4my zFiywfW&+&8ptvHK*_5kFR*$J|$|k7hWCUQaHE9teY>E_CBMn-hDvOOkMMelC7AY;U zU?`(ftVFj-h>TQ0Vv34lmWV5?%vMyYTBb3~!i=(|V_8NimZlkQS1n?g%8FRZjuu#n zj$mc0E06CclTNbN65`x$R~Io;9A*qFvy$r!W}LNgG@2bc&1SWe6h~~kZMMm?v9_*? z{!V7>nd*FsHq7GMi>ga5C(MT+BqeaKRT^%^KX@R+QS@+giewX{B(wl)Grw zY|PBo+g)hSXQ%9Xoh$mOC| zv_|P^fQqW=F*K>7w&k(Kx@KZa7U{$?+FO~G%%VAyF}T+*7+htQYja6(wAI#N>Z@%t zS(+|cmc_>`$%Gw#B+BP{F~+8A{7GaWF!q)dt!!<+)~NU{owZv~8hi)`ON(nT*SWjk%d_ z6s2xiiYu7aGcyw^tX+mmWr2*rw^t0eSmSdoN>@yds_NOTR=aG#)~T79MbGGN)1z$E z_}k9%e#l`3^;QoiarK4yysKzT>Xy34AD~z-Ij0?9Gj?Ce3x0QUI-6@T**9x8cH35) zoZ5}dHqEiinS-seW{Rt^S!<%?%SG1flWiGx*6nSL+vskp>usTnt62wBsWg(Zw&=oZ zQ%j1X(FIj*Xv0gI%WgWtnKU)bwKqCkZI!8N$7`6|ZM9O1>0Gawq+`olr?Fp-C=U=w(K`1;_k)S*6hP;O_^=kaG>2~Znd)MO|8F2MqzE< zb0#<|jZ1}_+uGKnDmISoWZOwf&CJIgwYFVl*6sThc1`W=>^Gg;jjlPrO>1o5`j>-y zI5%0jK4J8~Do>QiehsBmjkS$!zmNF1xo(`Jq_ILQ3}95K3QCFs#v>UKh^$Z%P*heG zD1yNeR57f|6$aA9V5r3hS#TRlf`gQ(;H6PYTN1dMbSmSl#Kdh1#YC<#b19$D%pGQ~ zjV(&r<--MQSY~YN4Pa)bIJ&w=6Jfb?GM~A-Gis&O{iP0&55b?8`XyL5?Nby5%GQlj z7-C^-m-8}FS4~BAaWP$fmOE)RYm2Lz+beC;jbhtCRVqqa6;x3aR7xFd1|D*N44L_<{sHmw}RjsU*B7h?x zvNp-~u&W%h+_@D}(#w}JnU$^mhTQYi!Ljq}ekz$5dFRI$gDwSY%DD+UDC~wBB~qrlPIggN@y|uIF1> zp*Bq3X_=b8zf<=dYR}Z4X%$v~UZ2B}vXM-!mHy)jYgw3PVxo#Hf{H9$NMG2p+7%#~ zmjy;?B|ubSs+QD7D2fbNtYRw|izQ0Rm4lZsps=h}g33~XZBdrlMo|Q=WkrCq6_TK8 z(>0D`aTLamnOwA@p`_F`Xzfc)H}!RQVUCmc#1r>=LLa3+O&{#q)Tq^=X>3a^6#l); zR=II%R77Kvi$yod2vbB{JHJBJyh?h*cDN@y@TH>{qme$K!g4=P& z_Z?wP4h%CXjd7U93Ze?`xaqp91rZdfjJvL4UDsrZtET0-M%)D~Z3IQX!``L2XSt!UNMT-;^ivqB$5m^zbR6#=7VQq`5P*|d|V4)Po6$Oem(Hh+{xC~Z| zqRg`#ik8}joEjy}z{e8hDq`iSS2dc|%PJ^p(=OX)k~W(=U4!=bE!J)Jr2Z3}l1V4^ z0um5}|Ma0_Khh*H??{)tr3=6nOh^6&3>%uMJ#3{9)kzqyzd$hCsHTxrPWe(XKKg}V z{PL*l)k+`t6ftR{D+m2VkAjkp4OL#=D8Bqq{s~nr)k?B{x{6qNRUzl7iQ&->Vu5T@ ztFYhwf>KMbs#a61C|YGI>0(3T#V!-!Fu@6X*elvnh5V{3*ovpGLcL&6{c4i)^-^?1 zF3M7eV?lMak*MC`DLR?~^8{I6jYAA5C-(@yrBqLG|Cm)LwN=945dJtPuu!jGDw_3S zB!K!52@fy-B#ZyW7O(!6TFZ^4w=NX_->>{vGyVyjjoY=Y=T|njTViW2_y1kr-6W8Z zJ5&#^6h4?oUlCf7M^h3yScl3nJ9lz7n?>I`7MmHCZ9&d-|hubn`^31+}(0`^M z4j(ct;rwct*UCh6@S$05Smii`l~^{?w%oqn+0KAS8*(BY_T!%sPYZK@=eq5%*|;+X z)qphx*M`tI>pJ4FaarbHGG``P#%39VHD;?a&of4H%|aYlO!BWiIz}U-RPviC`Y%Gh zm3Ti*2y65XpLGDN%fRelD&YPM+wroBw{Gt`c|)gG$rr(Al+tgl&dU3aaI zTDs}$uUtKJes>3}HD;_eX{&W%`n7QWCa~5&tTmd%)@u!7YXevs&0*bj{eNF^U4LJ7 z=U#Q)b=OY0*L??C+dQT-WP|!_+7tQpNtOQwC)SIBkX%V#gs#}_r@Co7wg&z zU64xdx2rFGLTEruHC0$s1V@;P{ZLT4KoANE#2O|*bA)sLOL2Zce~G8w? zHzs(A;&^@^)yMX^yRXmnQ->%)iw>MQZ-^L79!<&G0l*EX=hy{+b*(3mAALY^x&E*F zAI7wcaJ*#Sa3%;6bM1c^u>{%PPy@m@a9=Kcf6nw^$X#H*h8CHqx z0l}Ru#~IZ~oIB$t`h?xS0uPIN{yjj;e>Q>V7QLO{bKdWE0zo?I&>gnZxn-;^qdGWn z!gmK_Xr(+p_rDa1&cy2ueDA?T>g#Pf-iSM)kX7y{P;)1GgkbpH!_vU+h^MeRVs~

    ?@rE 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

    0B@lNfIPVK`k=tFY%dV2MGh@Exa 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

    +OZgSryX$V-l_g^sN7Zx+m4qQZz|p6; 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 Z%~0ydK-M{YIxqjl+>uTcBq-#~LxA89W&HpE literal 0 HcmV?d00001 diff --git a/cran-comments.md b/cran-comments.md index a1287a4..24d81b0 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,4 +1,5 @@ -This is a point release fixing failing tests on CRAN. +* Changed dependency from beepr to audio (actually beepr depends on audio, so less dependencies). +* Added persons to DESCRIPTION as their code/research was implemented in this package. ## Test environments * local Windows 10 install, R 3.5.1 diff --git a/docs/news/index.html b/docs/news/index.html index 2f8a1fd..bf298ca 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -104,11 +104,15 @@

    Changelog

    Source: NEWS.md -
    +

    -tsmp 0.2.30 Unreleased +tsmp 0.2.14 Unreleased

      +
    • Added SiMPle algorithm for sound data.
    • +
    • Added FLUSS algorithm.
    • +
    • Added [find.chains()] to look for chains primitives.
    • +
    • Changed dependency from beepr to audio (actually beepr depends on audio, so less dependencies)
    • Added a NEWS.md file to track changes to the package.
    @@ -137,7 +141,7 @@

    Contents

    From 65254e9caa7262db1b77c5f18584f9c0d4308081 Mon Sep 17 00:00:00 2001 From: Francisco Bischoff Date: Mon, 20 Aug 2018 20:21:05 +0100 Subject: [PATCH 7/7] Fixed little issues pre-release --- DESCRIPTION | 3 +- NAMESPACE | 1 - R/fluss.R | 2 +- R/m_guide_search.R | 2 +- R/m_unconstrain_search.R | 2 +- R/misc.R | 28 +++- R/mstomp.R | 6 +- R/mstomp_par.R | 7 +- R/sdts_predict.R | 2 +- R/sdts_train.R | 6 +- R/simple.R | 4 +- R/stamp.R | 4 +- R/stamp_par.R | 7 +- R/toy_data.R | 4 +- README.Rmd | 2 +- README.md | 4 +- docs/CODE_OF_CONDUCT.html | 2 +- docs/LICENSE-text.html | 2 +- docs/LICENSE.html | 2 +- docs/authors.html | 2 +- docs/index.html | 6 +- docs/news/index.html | 2 +- docs/reference/beep.html | 154 +++++++++++++++++++++ docs/reference/compute.f.meas.html | 2 +- docs/reference/fast.movavg.html | 2 +- docs/reference/fast.movsd.html | 2 +- docs/reference/find.chains.html | 2 +- docs/reference/fluss.cac.html | 4 +- docs/reference/fluss.extract.html | 2 +- docs/reference/fluss.html | 2 +- docs/reference/fluss.score.html | 2 +- docs/reference/fluss_data.html | 2 +- docs/reference/gait_data.html | 2 +- docs/reference/golden.section.2.html | 4 +- docs/reference/golden.section.html | 4 +- docs/reference/guide.search.html | 4 +- docs/reference/index.html | 2 +- docs/reference/mass.html | 2 +- docs/reference/mass.pre.html | 2 +- docs/reference/mass.simple.html | 2 +- docs/reference/mass.simple.pre.html | 2 +- docs/reference/mode.html | 2 +- docs/reference/mstomp.html | 4 +- docs/reference/mstomp.par.html | 5 +- docs/reference/sdts.f.score.html | 4 +- docs/reference/sdts.predict.html | 2 +- docs/reference/sdts.train.html | 2 +- docs/reference/simple.fast.html | 4 +- docs/reference/stamp.html | 4 +- docs/reference/stamp.par.html | 7 +- docs/reference/std.html | 2 +- docs/reference/test_data.html | 2 +- docs/reference/toy_data.html | 8 +- docs/reference/tsmp.html | 2 +- docs/reference/unconstrain.search.html | 4 +- man/beep.Rd | 15 ++ man/fluss.cac.Rd | 2 +- man/golden.section.2.Rd | 2 +- man/golden.section.Rd | 2 +- man/guide.search.Rd | 2 +- man/mstomp.Rd | 2 +- man/mstomp.par.Rd | 3 +- man/sdts.f.score.Rd | 2 +- man/simple.fast.Rd | 2 +- man/stamp.Rd | 2 +- man/stamp.par.Rd | 3 +- man/toy_data.Rd | 4 +- man/unconstrain.search.Rd | 2 +- packrat/packrat.lock | 183 ++++--------------------- packrat/packrat.opts | 2 +- tests/testthat/test.simple.R | 7 +- tests/testthat/test.stamps.R | 8 +- 72 files changed, 327 insertions(+), 266 deletions(-) create mode 100644 docs/reference/beep.html create mode 100644 man/beep.Rd diff --git a/DESCRIPTION b/DESCRIPTION index 9b4bc09..2f82f81 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: tsmp Type: Package Title: Time Series with Matrix Profile -Version: 0.2.13.9053 +Version: 0.2.14.9009 Authors@R: c( person("Francisco", "Bischoff", email = "fbischoff@med.up.pt", role = c("aut", "cre"), comment = c(ORCID = "https://orcid.org/0000-0002-5301-8672")), person("Michael", "Yeh", email = "myeh003@ucr.edu", role = c("res", "ccp", "ctb"), comment = c(ORCID = "https://orcid.org/0000-0002-9807-2963")), @@ -15,6 +15,7 @@ URL: https://github.com/franzbischoff/tsmp BugReports: https://github.com/franzbischoff/tsmp/issues Depends: R (>= 2.10), audio, doSNOW, parallel, foreach Encoding: UTF-8 +Language: en-US LazyData: true Roxygen: list(markdown = TRUE) RoxygenNote: 6.1.0 diff --git a/NAMESPACE b/NAMESPACE index 738335e..0617192 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -20,7 +20,6 @@ export(stamp) export(stamp.par) export(unconstrain.search) import(audio) -import(beepr) import(doSNOW) import(foreach) import(parallel) diff --git a/R/fluss.R b/R/fluss.R index 2a94c17..bc4ef17 100644 --- a/R/fluss.R +++ b/R/fluss.R @@ -125,7 +125,7 @@ fluss.extract <- function(arc.counts, num.segments, window.size, exclusion.zone #' Computes the arc count with edge correction (CAC). #' #' Original paper suggest using the classic statistical-process-control heuristic to set a threshold -#' where a semantic change may occur in CAC. This may be useful in realtime implementation as we don't +#' where a semantic change may occur in CAC. This may be useful in real-time implementation as we don't #' know in advance the number of domain changes to look for. Please check original paper (1). #' #' @param profile.index the profile index for arc counting. diff --git a/R/m_guide_search.R b/R/m_guide_search.R index 66afa67..c39ccf9 100644 --- a/R/m_guide_search.R +++ b/R/m_guide_search.R @@ -4,7 +4,7 @@ #' #' Although this functions handles Multivariate Time Series, it can also be used to handle Univariate Time Series. #' -#' @param data a `matrix` of `numeric`, where each colums is a time series. Accepts `vector` (see details), `list` and `data.frame` too. +#' @param data a `matrix` of `numeric`, where each column is a time series. Accepts `vector` (see details), `list` and `data.frame` too. #' @param window.size an `int` with the size of the sliding window. #' @param matrix.profile multidimensional matrix profile (matrix) #' @param profile.index multidimensional profile index (from [mstomp()] or [mstomp.par()]). diff --git a/R/m_unconstrain_search.R b/R/m_unconstrain_search.R index b9ab749..dbaf0ed 100644 --- a/R/m_unconstrain_search.R +++ b/R/m_unconstrain_search.R @@ -4,7 +4,7 @@ #' #' Although this functions handles Multivariate Time Series, it can also be used to handle Univariate Time Series. #' -#' @param data a `matrix` of `numeric`, where each colums is a time series. Accepts `vector` (see details), `list` and `data.frame` too. +#' @param data a `matrix` of `numeric`, where each column is a time series. Accepts `vector` (see details), `list` and `data.frame` too. #' @param window.size an `int` with the size of the sliding window. #' @param matrix.profile multidimensional matrix profile (from [mstomp()] or [mstomp.par()]). #' @param profile.index multidimensional profile index (from [mstomp()] or [mstomp.par()]). diff --git a/R/misc.R b/R/misc.R index eb55b28..370a4bc 100644 --- a/R/misc.R +++ b/R/misc.R @@ -70,9 +70,35 @@ fast.movavg <- function(data, n) { std <- function(x) { sdx <- stats::sd(x) - if (sdx == 0) + if (sdx == 0) { return(sdx) + } return(sqrt((length(x) - 1) / length(x)) * sdx) } +#' Play sound with `audio` +#' +#' @param data sound data provided by this package +#' +#' @keywords internal +#' @import audio +beep <- function(data) { + if (!(is.null(audio::audio.drivers()) || nrow(audio::audio.drivers()) == 0)) { + tryCatch({ + audio::play(data) + }, + error = function(cond) { + message("Failed to play audio alert") + message(cond) + invisible() + }, + warning = function(cond) { + message("Something went wrong playing audio alert") + message(cond) + invisible() + } + ) + } + invisible() +} diff --git a/R/mstomp.R b/R/mstomp.R index be68679..810f5ec 100644 --- a/R/mstomp.R +++ b/R/mstomp.R @@ -8,7 +8,7 @@ #' Although this functions handles Multivariate Time Series, it can also be used to handle Univariate Time Series. #' `verbose` changes how much information is printed by this function; `0` means nothing, `1` means text, `2` means text and sound. #' -#' @param data a `matrix` of `numeric`, where each colums is a time series. Accepts `vector` (see details), `list` and `data.frame` too. +#' @param data a `matrix` of `numeric`, where each column is a time series. Accepts `vector` (see details), `list` and `data.frame` too. #' @param window.size an `int` with the size of the sliding window. #' @param must.dim an `int` or `vector` of which dimensions to forcibly include (default is `NULL`). #' @param exc.dim an `int` or `vector` of which dimensions to exclude (default is `NULL`). @@ -114,7 +114,7 @@ mstomp <- function(data, window.size, must.dim = NULL, exc.dim = NULL, exclusion on.exit(close(pb)) } if (verbose > 1) { - on.exit(audio::play(sounds[[1]]), TRUE) + on.exit(beep(sounds[[1]]), TRUE) } ## initialization @@ -198,7 +198,7 @@ mstomp <- function(data, window.size, must.dim = NULL, exc.dim = NULL, exclusion if (n.dim > 1) { dist.pro.sort <- t(apply(distance.profile, 1, sort)) - } # sort by row, put all -Inf to the first columns + } # sort by row, put all -Inf to the first column else { dist.pro.sort <- distance.profile } diff --git a/R/mstomp_par.R b/R/mstomp_par.R index cdfe947..a481426 100644 --- a/R/mstomp_par.R +++ b/R/mstomp_par.R @@ -8,7 +8,7 @@ #' Although this functions handles Multivariate Time Series, it can also be used to handle Univariate Time Series. #' `verbose` changes how much information is printed by this function; `0` means nothing, `1` means text, `2` means text and sound. #' -#' @param data a `matrix` of `numeric`, where each colums is a time series. Accepts `vector` (see details), `list` and `data.frame` too. +#' @param data a `matrix` of `numeric`, where each column is a time series. Accepts `vector` (see details), `list` and `data.frame` too. #' @param window.size an `int`. Size of the sliding window. #' @param must.dim an `int` or `vector` of which dimensions to forcibly include (default is `NULL`). #' @param exc.dim an `int` or `vector` of which dimensions to exclude (default is `NULL`). @@ -29,9 +29,8 @@ #' #' @examples #' # using all dimensions -#' Sys.sleep(1) # sometimes sleep is needed if you run parallel multiple times in a row #' mp <- mstomp.par(toy_data$data[1:100,], 30, verbose = 0) -#' @import audio doSNOW foreach parallel +#' @import doSNOW foreach parallel mstomp.par <- function(data, window.size, must.dim = NULL, exc.dim = NULL, exclusion.zone = 1 / 2, verbose = 2, n.workers = 2) { eps <- .Machine$double.eps^0.5 @@ -140,7 +139,7 @@ mstomp.par <- function(data, window.size, must.dim = NULL, exc.dim = NULL, exclu on.exit(close(pb), TRUE) } if (verbose > 1) { - on.exit(audio::play(sounds[[1]]), TRUE) + on.exit(beep(sounds[[1]]), TRUE) } ## initialize variable diff --git a/R/sdts_predict.R b/R/sdts_predict.R index 757c633..7512acf 100644 --- a/R/sdts_predict.R +++ b/R/sdts_predict.R @@ -87,7 +87,7 @@ sdts.predict <- function(model, data, window.size) { #' `beta` is used to balance F-score towards recall (`>1`) or precision (`<1`). #' #' @param gtruth a `vector` of `logical`. Ground truth annotation. -#' @param pred a `vector` of `logical`. Predictied annotation from [sdts.predict()] +#' @param pred a `vector` of `logical`. Predicted annotation from [sdts.predict()] #' @param beta a `numeric`. See details. (default is `1`). #' #' @return Returns a `list` with `f.score`, `precision` and `recall`. diff --git a/R/sdts_train.R b/R/sdts_train.R index 57d39a3..0988d90 100644 --- a/R/sdts_train.R +++ b/R/sdts_train.R @@ -148,7 +148,7 @@ sdts.train <- function(data, label, window.size, beta = 1, pat.max = Inf, parall on.exit(close(pb)) } if (verbose > 1) { - on.exit(audio::play(sounds[[1]]), TRUE) + on.exit(beep(sounds[[1]]), TRUE) } for (i in 1:n.window.size) { @@ -342,7 +342,7 @@ sdts.train <- function(data, label, window.size, beta = 1, pat.max = Inf, parall #' @param beta a number that balance the F-Score. Beta > 1 towards recall, < towards precision #' @param window.size an integer with the sliding window size #' -#' @return Returns the best threashold and its F-Score +#' @return Returns the best threshold and its F-Score #' #' @keywords internal #' @@ -384,7 +384,7 @@ golden.section <- function(dist.pro, label, pos.st, pos.ed, beta, window.size) { #' @param window.size an integer with the sliding window size #' @param fit.idx an integer with the index of the current threshold #' -#' @return Returns the best threashold and its F-Score +#' @return Returns the best threshold and its F-Score #' #' @keywords internal diff --git a/R/simple.R b/R/simple.R index e31156c..62ddc4e 100644 --- a/R/simple.R +++ b/R/simple.R @@ -4,7 +4,7 @@ #' #' `verbose` changes how much information is printed by this function; `0` means nothing, `1` means text, `2` means text and sound. #' -#' @param data a `matrix` of `numeric`, where each colums is a time series. Accepts `list` and `data.frame` too. +#' @param data a `matrix` of `numeric`, where each column is a time series. Accepts `list` and `data.frame` too. #' @param window.size an `int` with the size of the sliding window. #' @param exclusion.zone a `numeric`. Size of the exclusion zone, based on query size (default is `1/2`). #' @param verbose an `int`. See details. (Default is `2`). @@ -76,7 +76,7 @@ simple.fast <- function(data, window.size, exclusion.zone = 1 / 2, verbose = 2) on.exit(close(pb)) } if (verbose > 1) { - on.exit(audio::play(sounds[[1]]), TRUE) + on.exit(beep(sounds[[1]]), TRUE) } ## compute necessary values diff --git a/R/stamp.R b/R/stamp.R index d6f4809..542ddb6 100644 --- a/R/stamp.R +++ b/R/stamp.R @@ -10,7 +10,7 @@ #' @param ... a `matrix` or a `vector`. If a second time series is supplied it will be a join matrix profile. #' @param window.size an `int`. Size of the sliding window. #' @param exclusion.zone a `numeric`. Size of the exclusion zone, based on query size (default is `1/2`). See details. -#' @param s.size a `numeric`. for anytime algorithm, represents the size (in observations) the random calculation will occour (default is `Inf`). +#' @param s.size a `numeric`. for anytime algorithm, represents the size (in observations) the random calculation will occur (default is `Inf`). #' @param verbose an `int`. See details. (Default is `2`). #' #' @return Returns the matrix profile `mp` and profile index `pi`. @@ -98,7 +98,7 @@ stamp <- function(..., window.size, exclusion.zone = 1 / 2, s.size = Inf, verbos on.exit(close(pb)) } if (verbose > 1) { - on.exit(audio::play(sounds[[1]]), TRUE) + on.exit(beep(sounds[[1]]), TRUE) } # anytime must return the result always on.exit(return(list( diff --git a/R/stamp_par.R b/R/stamp_par.R index 8b451be..40ba10d 100644 --- a/R/stamp_par.R +++ b/R/stamp_par.R @@ -10,7 +10,7 @@ #' @param ... a `matrix` or a `vector`. If a second time series is supplied it will be a join matrix profile. #' @param window.size an `int`. Size of the sliding window. #' @param exclusion.zone a `numeric`. Size of the exclusion zone, based on query size (default is `1/2`). See details. -#' @param s.size a `numeric`. for anytime algorithm, represents the size (in observations) the random calculation will occour (default is `Inf`). +#' @param s.size a `numeric`. for anytime algorithm, represents the size (in observations) the random calculation will occur (default is `Inf`). #' @param n.workers an `int`. Number of workers for parallel. (Default is `2`). #' @param verbose an `int`. See details. (Default is `2`). #' @@ -25,7 +25,6 @@ #' @references Website: #' #' @examples -#' Sys.sleep(1) # sometimes sleep is needed if you run parallel multiple times in a row #' mp <- stamp.par(toy_data$data[1:200,1], window.size = 30, verbose = 0) #' \dontrun{ #' ref.data <- toy_data$data[,1] @@ -36,7 +35,7 @@ #' mp <- stamp.par(ref.data, query.data, window.size = 30, s.size = round(nrows(query.data) * 0.1)) #' } #' -#' @import beepr doSNOW foreach parallel +#' @import doSNOW foreach parallel stamp.par <- function(..., window.size, exclusion.zone = 1 / 2, s.size = Inf, n.workers = 2, verbose = 2) { args <- list(...) data <- args[[1]] @@ -107,7 +106,7 @@ stamp.par <- function(..., window.size, exclusion.zone = 1 / 2, s.size = Inf, n. on.exit(close(pb), TRUE) } if (verbose > 1) { - on.exit(audio::play(sounds[[1]]), TRUE) + on.exit(beep(sounds[[1]]), TRUE) } # anytime must return the result always on.exit(return(list( diff --git a/R/toy_data.R b/R/toy_data.R index 49007b5..2e383e3 100644 --- a/R/toy_data.R +++ b/R/toy_data.R @@ -1,11 +1,11 @@ #' Original data used in the mSTAMP demo #' -#' A synthetic dataset with embeded MOTIFs for multidimensional discovery +#' A synthetic dataset with embedded MOTIFs for multidimensional discovery #' #' @docType data #' @format A `list` with a `matrix` with 550 rows and 3 dimensions and an `int`: #' \describe{ -#' \item{data}{data with embeded MOTIFs} +#' \item{data}{data with embedded MOTIFs} #' \item{sub.len}{size of sliding window} #' } #' @source \url{https://sites.google.com/view/mstamp/} diff --git a/README.Rmd b/README.Rmd index 4d4607d..f7846e0 100644 --- a/README.Rmd +++ b/README.Rmd @@ -20,7 +20,7 @@ knitr::opts_chunk$set( ```{r include=FALSE} library(git2r) # current.branch <- repository_head()$name -current.branch <- "develop" +current.branch <- "master" lifecycle <- "maturing" # maturing-blue # stable-brightgreen lifecycle.color <- "blue" ``` diff --git a/README.md b/README.md index 09a2e0a..9188b2b 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ Francisco Bischoff [![Packagist](https://img.shields.io/packagist/l/doctrine/orm.svg)](https://choosealicense.com/licenses/mit) [![lifecycle](https://img.shields.io/badge/lifecycle-maturing-blue.svg)](https://www.tidyverse.org/lifecycle/#maturing) [![Build -Status](https://travis-ci.com/franzbischoff/tsmp.svg?branch=develop)](https://travis-ci.com/franzbischoff/tsmp) -[![codecov](https://codecov.io/gh/franzbischoff/tsmp/branch/develop/graph/badge.svg)](https://codecov.io/gh/franzbischoff/tsmp) +Status](https://travis-ci.com/franzbischoff/tsmp.svg?branch=master)](https://travis-ci.com/franzbischoff/tsmp) +[![codecov](https://codecov.io/gh/franzbischoff/tsmp/branch/master/graph/badge.svg)](https://codecov.io/gh/franzbischoff/tsmp) [![CRAN version](http://www.r-pkg.org/badges/version/tsmp)](https://cran.r-project.org/package=tsmp) diff --git a/docs/CODE_OF_CONDUCT.html b/docs/CODE_OF_CONDUCT.html index 7adf315..37fa517 100644 --- a/docs/CODE_OF_CONDUCT.html +++ b/docs/CODE_OF_CONDUCT.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009
    diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html index f6356aa..aeb627f 100644 --- a/docs/LICENSE-text.html +++ b/docs/LICENSE-text.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009

    diff --git a/docs/LICENSE.html b/docs/LICENSE.html index df077dc..88aefef 100644 --- a/docs/LICENSE.html +++ b/docs/LICENSE.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/authors.html b/docs/authors.html index c2eac3c..59f6a2a 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/index.html b/docs/index.html index 05cdaf7..db7aef0 100644 --- a/docs/index.html +++ b/docs/index.html @@ -30,7 +30,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 @@ -179,8 +179,8 @@

    Dev status

    • Packagist
    • lifecycle
    • -
    • Build Status
    • -
    • codecov
    • +
    • Build Status
    • +
    • codecov
    • CRAN version
    diff --git a/docs/news/index.html b/docs/news/index.html index bf298ca..8d2c3a5 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/beep.html b/docs/reference/beep.html new file mode 100644 index 0000000..1d0b7fc --- /dev/null +++ b/docs/reference/beep.html @@ -0,0 +1,154 @@ + + + + + + + + +Play sound with <code>audio</code> — beep • tsmp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + +
    + +

    Play sound with audio

    + +
    + +
    beep(data)
    + +

    Arguments

    + + + + + + +
    data

    sound data provided by this package

    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + + + + diff --git a/docs/reference/compute.f.meas.html b/docs/reference/compute.f.meas.html index c103026..0c93a1d 100644 --- a/docs/reference/compute.f.meas.html +++ b/docs/reference/compute.f.meas.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/fast.movavg.html b/docs/reference/fast.movavg.html index af640f7..dd8744a 100644 --- a/docs/reference/fast.movavg.html +++ b/docs/reference/fast.movavg.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/fast.movsd.html b/docs/reference/fast.movsd.html index e4ae809..b08683f 100644 --- a/docs/reference/fast.movsd.html +++ b/docs/reference/fast.movsd.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/find.chains.html b/docs/reference/find.chains.html index 4d64f24..85d5ba9 100644 --- a/docs/reference/find.chains.html +++ b/docs/reference/find.chains.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/fluss.cac.html b/docs/reference/fluss.cac.html index 67eb95e..bc3de70 100644 --- a/docs/reference/fluss.cac.html +++ b/docs/reference/fluss.cac.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 @@ -140,7 +140,7 @@

    Value

    Details

    Original paper suggest using the classic statistical-process-control heuristic to set a threshold -where a semantic change may occur in CAC. This may be useful in realtime implementation as we don't +where a semantic change may occur in CAC. This may be useful in real-time implementation as we don't know in advance the number of domain changes to look for. Please check original paper (1).

    References

    diff --git a/docs/reference/fluss.extract.html b/docs/reference/fluss.extract.html index f846c31..d2f8be1 100644 --- a/docs/reference/fluss.extract.html +++ b/docs/reference/fluss.extract.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/fluss.html b/docs/reference/fluss.html index 06b5722..81456de 100644 --- a/docs/reference/fluss.html +++ b/docs/reference/fluss.html @@ -64,7 +64,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/fluss.score.html b/docs/reference/fluss.score.html index eb8a2c5..9fa66e3 100644 --- a/docs/reference/fluss.score.html +++ b/docs/reference/fluss.score.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/fluss_data.html b/docs/reference/fluss_data.html index 3ed168f..061a2e5 100644 --- a/docs/reference/fluss_data.html +++ b/docs/reference/fluss_data.html @@ -64,7 +64,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/gait_data.html b/docs/reference/gait_data.html index f9f88ec..1026321 100644 --- a/docs/reference/gait_data.html +++ b/docs/reference/gait_data.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/golden.section.2.html b/docs/reference/golden.section.2.html index 5cbb6d5..aeaff7e 100644 --- a/docs/reference/golden.section.2.html +++ b/docs/reference/golden.section.2.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 @@ -155,7 +155,7 @@

    Arg

    Value

    -

    Returns the best threashold and its F-Score

    +

    Returns the best threshold and its F-Score

    diff --git a/docs/reference/golden.section.html b/docs/reference/golden.section.html index d4ef0b8..bf91a6f 100644 --- a/docs/reference/golden.section.html +++ b/docs/reference/golden.section.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 @@ -146,7 +146,7 @@

    Arg

    Value

    -

    Returns the best threashold and its F-Score

    +

    Returns the best threshold and its F-Score

    diff --git a/docs/reference/guide.search.html b/docs/reference/guide.search.html index 89fe6a2..ee2ee2b 100644 --- a/docs/reference/guide.search.html +++ b/docs/reference/guide.search.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 @@ -120,7 +120,7 @@

    Arg data -

    a matrix of numeric, where each colums is a time series. Accepts vector (see details), list and data.frame too.

    +

    a matrix of numeric, where each column is a time series. Accepts vector (see details), list and data.frame too.

    window.size diff --git a/docs/reference/index.html b/docs/reference/index.html index 1f4d57a..be26baf 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -61,7 +61,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/mass.html b/docs/reference/mass.html index 74824be..794c65c 100644 --- a/docs/reference/mass.html +++ b/docs/reference/mass.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/mass.pre.html b/docs/reference/mass.pre.html index 7fd50b1..3b83f87 100644 --- a/docs/reference/mass.pre.html +++ b/docs/reference/mass.pre.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/mass.simple.html b/docs/reference/mass.simple.html index 7020120..a8825af 100644 --- a/docs/reference/mass.simple.html +++ b/docs/reference/mass.simple.html @@ -64,7 +64,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/mass.simple.pre.html b/docs/reference/mass.simple.pre.html index b6babee..db1ce95 100644 --- a/docs/reference/mass.simple.pre.html +++ b/docs/reference/mass.simple.pre.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/mode.html b/docs/reference/mode.html index e4f0b9c..1e3953e 100644 --- a/docs/reference/mode.html +++ b/docs/reference/mode.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/mstomp.html b/docs/reference/mstomp.html index df12516..88ba273 100644 --- a/docs/reference/mstomp.html +++ b/docs/reference/mstomp.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 @@ -121,7 +121,7 @@

    Arg data -

    a matrix of numeric, where each colums is a time series. Accepts vector (see details), list and data.frame too.

    +

    a matrix of numeric, where each column is a time series. Accepts vector (see details), list and data.frame too.

    window.size diff --git a/docs/reference/mstomp.par.html b/docs/reference/mstomp.par.html index 957c25b..ca0714c 100644 --- a/docs/reference/mstomp.par.html +++ b/docs/reference/mstomp.par.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 @@ -121,7 +121,7 @@

    Arg data -

    a matrix of numeric, where each colums is a time series. Accepts vector (see details), list and data.frame too.

    +

    a matrix of numeric, where each column is a time series. Accepts vector (see details), list and data.frame too.

    window.size @@ -181,7 +181,6 @@

    See a

    Examples

    # using all dimensions -Sys.sleep(1) # sometimes sleep is needed if you run parallel multiple times in a row mp <- mstomp.par(toy_data$data[1:100,], 30, verbose = 0)
    @@ -124,7 +124,7 @@

    Arg pred -

    a vector of logical. Predictied annotation from sdts.predict()

    +

    a vector of logical. Predicted annotation from sdts.predict()

    beta diff --git a/docs/reference/sdts.predict.html b/docs/reference/sdts.predict.html index 6f74ad9..3be888c 100644 --- a/docs/reference/sdts.predict.html +++ b/docs/reference/sdts.predict.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/sdts.train.html b/docs/reference/sdts.train.html index c1f0763..62f9daf 100644 --- a/docs/reference/sdts.train.html +++ b/docs/reference/sdts.train.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/simple.fast.html b/docs/reference/simple.fast.html index 0a55327..dabafd3 100644 --- a/docs/reference/simple.fast.html +++ b/docs/reference/simple.fast.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 @@ -120,7 +120,7 @@

    Arg data -

    a matrix of numeric, where each colums is a time series. Accepts list and data.frame too.

    +

    a matrix of numeric, where each column is a time series. Accepts list and data.frame too.

    window.size diff --git a/docs/reference/stamp.html b/docs/reference/stamp.html index 7b01264..4804304 100644 --- a/docs/reference/stamp.html +++ b/docs/reference/stamp.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 @@ -133,7 +133,7 @@

    Arg s.size -

    a numeric. for anytime algorithm, represents the size (in observations) the random calculation will occour (default is Inf).

    +

    a numeric. for anytime algorithm, represents the size (in observations) the random calculation will occur (default is Inf).

    verbose diff --git a/docs/reference/stamp.par.html b/docs/reference/stamp.par.html index 58fcf1a..d6bf058 100644 --- a/docs/reference/stamp.par.html +++ b/docs/reference/stamp.par.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 @@ -133,7 +133,7 @@

    Arg s.size -

    a numeric. for anytime algorithm, represents the size (in observations) the random calculation will occour (default is Inf).

    +

    a numeric. for anytime algorithm, represents the size (in observations) the random calculation will occur (default is Inf).

    n.workers @@ -174,8 +174,7 @@

    See a

    Examples

    -
    Sys.sleep(1) # sometimes sleep is needed if you run parallel multiple times in a row -mp <- stamp.par(toy_data$data[1:200,1], window.size = 30, verbose = 0)
    # NOT RUN { +
    mp <- stamp.par(toy_data$data[1:200,1], window.size = 30, verbose = 0)
    # NOT RUN { ref.data <- toy_data$data[,1] query.data <- toy_data$data[,2] # self similarity diff --git a/docs/reference/std.html b/docs/reference/std.html index 6ea9bb5..4ad6ed7 100644 --- a/docs/reference/std.html +++ b/docs/reference/std.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/test_data.html b/docs/reference/test_data.html index ac63866..e74569f 100644 --- a/docs/reference/test_data.html +++ b/docs/reference/test_data.html @@ -65,7 +65,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/toy_data.html b/docs/reference/toy_data.html index a824399..55052f0 100644 --- a/docs/reference/toy_data.html +++ b/docs/reference/toy_data.html @@ -32,7 +32,7 @@ - + @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 @@ -109,7 +109,7 @@

    Original data used in the mSTAMP demo

    -

    A synthetic dataset with embeded MOTIFs for multidimensional discovery

    +

    A synthetic dataset with embedded MOTIFs for multidimensional discovery

    @@ -118,7 +118,7 @@

    Original data used in the mSTAMP demo

    Format

    A list with a matrix with 550 rows and 3 dimensions and an int:

    -
    data

    data with embeded MOTIFs

    +
    data

    data with embedded MOTIFs

    sub.len

    size of sliding window

    diff --git a/docs/reference/tsmp.html b/docs/reference/tsmp.html index 2493d20..4150bfa 100644 --- a/docs/reference/tsmp.html +++ b/docs/reference/tsmp.html @@ -64,7 +64,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 diff --git a/docs/reference/unconstrain.search.html b/docs/reference/unconstrain.search.html index d1989f6..85e7385 100644 --- a/docs/reference/unconstrain.search.html +++ b/docs/reference/unconstrain.search.html @@ -63,7 +63,7 @@ tsmp - 0.2.13.9053 + 0.2.14.9009 @@ -121,7 +121,7 @@

    Arg data -

    a matrix of numeric, where each colums is a time series. Accepts vector (see details), list and data.frame too.

    +

    a matrix of numeric, where each column is a time series. Accepts vector (see details), list and data.frame too.

    window.size diff --git a/man/beep.Rd b/man/beep.Rd new file mode 100644 index 0000000..ab21044 --- /dev/null +++ b/man/beep.Rd @@ -0,0 +1,15 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/misc.R +\name{beep} +\alias{beep} +\title{Play sound with \code{audio}} +\usage{ +beep(data) +} +\arguments{ +\item{data}{sound data provided by this package} +} +\description{ +Play sound with \code{audio} +} +\keyword{internal} diff --git a/man/fluss.cac.Rd b/man/fluss.cac.Rd index 058cbe3..33e2e83 100644 --- a/man/fluss.cac.Rd +++ b/man/fluss.cac.Rd @@ -22,7 +22,7 @@ Computes the arc count with edge correction (CAC). } \details{ Original paper suggest using the classic statistical-process-control heuristic to set a threshold -where a semantic change may occur in CAC. This may be useful in realtime implementation as we don't +where a semantic change may occur in CAC. This may be useful in real-time implementation as we don't know in advance the number of domain changes to look for. Please check original paper (1). } \examples{ diff --git a/man/golden.section.2.Rd b/man/golden.section.2.Rd index ce1d5e2..c28f66f 100644 --- a/man/golden.section.2.Rd +++ b/man/golden.section.2.Rd @@ -25,7 +25,7 @@ golden.section.2(dist.pro, thold, label, pos.st, pos.ed, beta, window.size, \item{fit.idx}{an integer with the index of the current threshold} } \value{ -Returns the best threashold and its F-Score +Returns the best threshold and its F-Score } \description{ Computes the golden section for combined candidates diff --git a/man/golden.section.Rd b/man/golden.section.Rd index 20bbeb3..5eefa74 100644 --- a/man/golden.section.Rd +++ b/man/golden.section.Rd @@ -20,7 +20,7 @@ golden.section(dist.pro, label, pos.st, pos.ed, beta, window.size) \item{window.size}{an integer with the sliding window size} } \value{ -Returns the best threashold and its F-Score +Returns the best threshold and its F-Score } \description{ Computes the golden section for individual candidates diff --git a/man/guide.search.Rd b/man/guide.search.Rd index f33d6ad..1fe64df 100644 --- a/man/guide.search.Rd +++ b/man/guide.search.Rd @@ -7,7 +7,7 @@ guide.search(data, window.size, matrix.profile, profile.index, n.dim) } \arguments{ -\item{data}{a \code{matrix} of \code{numeric}, where each colums is a time series. Accepts \code{vector} (see details), \code{list} and \code{data.frame} too.} +\item{data}{a \code{matrix} of \code{numeric}, where each column is a time series. Accepts \code{vector} (see details), \code{list} and \code{data.frame} too.} \item{window.size}{an \code{int} with the size of the sliding window.} diff --git a/man/mstomp.Rd b/man/mstomp.Rd index 90fcf6b..880d584 100644 --- a/man/mstomp.Rd +++ b/man/mstomp.Rd @@ -8,7 +8,7 @@ mstomp(data, window.size, must.dim = NULL, exc.dim = NULL, exclusion.zone = 1/2, verbose = 2) } \arguments{ -\item{data}{a \code{matrix} of \code{numeric}, where each colums is a time series. Accepts \code{vector} (see details), \code{list} and \code{data.frame} too.} +\item{data}{a \code{matrix} of \code{numeric}, where each column is a time series. Accepts \code{vector} (see details), \code{list} and \code{data.frame} too.} \item{window.size}{an \code{int} with the size of the sliding window.} diff --git a/man/mstomp.par.Rd b/man/mstomp.par.Rd index e5150fa..169a9b0 100644 --- a/man/mstomp.par.Rd +++ b/man/mstomp.par.Rd @@ -8,7 +8,7 @@ mstomp.par(data, window.size, must.dim = NULL, exc.dim = NULL, exclusion.zone = 1/2, verbose = 2, n.workers = 2) } \arguments{ -\item{data}{a \code{matrix} of \code{numeric}, where each colums is a time series. Accepts \code{vector} (see details), \code{list} and \code{data.frame} too.} +\item{data}{a \code{matrix} of \code{numeric}, where each column is a time series. Accepts \code{vector} (see details), \code{list} and \code{data.frame} too.} \item{window.size}{an \code{int}. Size of the sliding window.} @@ -38,7 +38,6 @@ Although this functions handles Multivariate Time Series, it can also be used to } \examples{ # using all dimensions -Sys.sleep(1) # sometimes sleep is needed if you run parallel multiple times in a row mp <- mstomp.par(toy_data$data[1:100,], 30, verbose = 0) } \references{ diff --git a/man/sdts.f.score.Rd b/man/sdts.f.score.Rd index bef8d17..f62ac1a 100644 --- a/man/sdts.f.score.Rd +++ b/man/sdts.f.score.Rd @@ -9,7 +9,7 @@ sdts.f.score(gtruth, pred, beta = 1) \arguments{ \item{gtruth}{a \code{vector} of \code{logical}. Ground truth annotation.} -\item{pred}{a \code{vector} of \code{logical}. Predictied annotation from \code{\link[=sdts.predict]{sdts.predict()}}} +\item{pred}{a \code{vector} of \code{logical}. Predicted annotation from \code{\link[=sdts.predict]{sdts.predict()}}} \item{beta}{a \code{numeric}. See details. (default is \code{1}).} } diff --git a/man/simple.fast.Rd b/man/simple.fast.Rd index c900b4e..2de9521 100644 --- a/man/simple.fast.Rd +++ b/man/simple.fast.Rd @@ -7,7 +7,7 @@ simple.fast(data, window.size, exclusion.zone = 1/2, verbose = 2) } \arguments{ -\item{data}{a \code{matrix} of \code{numeric}, where each colums is a time series. Accepts \code{list} and \code{data.frame} too.} +\item{data}{a \code{matrix} of \code{numeric}, where each column is a time series. Accepts \code{list} and \code{data.frame} too.} \item{window.size}{an \code{int} with the size of the sliding window.} diff --git a/man/stamp.Rd b/man/stamp.Rd index 6ca3b81..c4cc4ab 100644 --- a/man/stamp.Rd +++ b/man/stamp.Rd @@ -14,7 +14,7 @@ stamp(..., window.size, exclusion.zone = 1/2, s.size = Inf, \item{exclusion.zone}{a \code{numeric}. Size of the exclusion zone, based on query size (default is \code{1/2}). See details.} -\item{s.size}{a \code{numeric}. for anytime algorithm, represents the size (in observations) the random calculation will occour (default is \code{Inf}).} +\item{s.size}{a \code{numeric}. for anytime algorithm, represents the size (in observations) the random calculation will occur (default is \code{Inf}).} \item{verbose}{an \code{int}. See details. (Default is \code{2}).} } diff --git a/man/stamp.par.Rd b/man/stamp.par.Rd index ba013ec..ca2850c 100644 --- a/man/stamp.par.Rd +++ b/man/stamp.par.Rd @@ -14,7 +14,7 @@ stamp.par(..., window.size, exclusion.zone = 1/2, s.size = Inf, \item{exclusion.zone}{a \code{numeric}. Size of the exclusion zone, based on query size (default is \code{1/2}). See details.} -\item{s.size}{a \code{numeric}. for anytime algorithm, represents the size (in observations) the random calculation will occour (default is \code{Inf}).} +\item{s.size}{a \code{numeric}. for anytime algorithm, represents the size (in observations) the random calculation will occur (default is \code{Inf}).} \item{n.workers}{an \code{int}. Number of workers for parallel. (Default is \code{2}).} @@ -34,7 +34,6 @@ The anytime STAMP computes the Matrix Profile and Profile Index in such manner t \code{exclusion.zone} is used to avoid trivial matches; if a query data is provided (join similarity), this parameter is ignored. } \examples{ -Sys.sleep(1) # sometimes sleep is needed if you run parallel multiple times in a row mp <- stamp.par(toy_data$data[1:200,1], window.size = 30, verbose = 0) \dontrun{ ref.data <- toy_data$data[,1] diff --git a/man/toy_data.Rd b/man/toy_data.Rd index 859bb62..698a35f 100644 --- a/man/toy_data.Rd +++ b/man/toy_data.Rd @@ -6,7 +6,7 @@ \title{Original data used in the mSTAMP demo} \format{A \code{list} with a \code{matrix} with 550 rows and 3 dimensions and an \code{int}: \describe{ -\item{data}{data with embeded MOTIFs} +\item{data}{data with embedded MOTIFs} \item{sub.len}{size of sliding window} }} \source{ @@ -16,7 +16,7 @@ toy_data } \description{ -A synthetic dataset with embeded MOTIFs for multidimensional discovery +A synthetic dataset with embedded MOTIFs for multidimensional discovery } \references{ \enumerate{ diff --git a/man/unconstrain.search.Rd b/man/unconstrain.search.Rd index e0a94af..0acf4c7 100644 --- a/man/unconstrain.search.Rd +++ b/man/unconstrain.search.Rd @@ -8,7 +8,7 @@ unconstrain.search(data, window.size, matrix.profile, profile.index, n.bit = 4, k = Inf) } \arguments{ -\item{data}{a \code{matrix} of \code{numeric}, where each colums is a time series. Accepts \code{vector} (see details), \code{list} and \code{data.frame} too.} +\item{data}{a \code{matrix} of \code{numeric}, where each column is a time series. Accepts \code{vector} (see details), \code{list} and \code{data.frame} too.} \item{window.size}{an \code{int} with the size of the sliding window.} diff --git a/packrat/packrat.lock b/packrat/packrat.lock index 921126a..5365dc2 100644 --- a/packrat/packrat.lock +++ b/packrat/packrat.lock @@ -77,12 +77,6 @@ Source: CRAN Version: 0.1-3 Hash: c590d29e555926af053055e23ee79efb -Package: beepr -Source: CRAN -Version: 1.3 -Hash: 3b06c76c8608889c0577b1f9d472a6c0 -Requires: audio, stringr - Package: bit Source: CRAN Version: 1.1-14 @@ -123,19 +117,10 @@ Hash: ae3d74ab94396fc7f6b879f17fb71a12 Requires: R6, processx Package: cli -Source: github -Version: 1.0.0.9002 -Hash: 231fd025f7a15312bfa29af3e10d27c9 -Requires: R6, assertthat, crayon, fansi, glue, progress, selectr, - withr, xml2 -GithubRepo: cli -GithubUsername: r-lib -GithubRef: master -GithubSha1: 1ce51456bd1d8ee703e07065ccb8824862d09e73 -RemoteHost: api.github.com -RemoteRepo: cli -RemoteUsername: r-lib -RemoteSha: 1ce51456bd1d8ee703e07065ccb8824862d09e73 +Source: CRAN +Version: 1.0.0 +Hash: f4239f89feb7ddc65821e4514e9734ae +Requires: assertthat, crayon Package: clipr Source: CRAN @@ -158,53 +143,18 @@ Version: 1.5 Hash: 432a16a9967055dad6b39f1c14fd6b2c Package: covr -Source: CRAN +Source: github Version: 3.1.0 -Hash: 55eaad0d3e61626cc0c8928985a849fa +Hash: 6022dedb19a9462e0496ae14615810da Requires: crayon, digest, httr, jsonlite, rex, withr - -Package: crancache -Source: github -Version: 0.0.0.9000 -Hash: 534a806e0a083e675c71f60fb3f2b7b3 -Requires: callr, cranlike, curl, desc, digest, parsedate, rappdirs, - withr -GithubRepo: crancache +GithubRepo: covr GithubUsername: r-lib GithubRef: master -GithubSha1: e2185c76b6fcd36c9970cfa22ffd2cb62b13eb53 -RemoteHost: api.github.com -RemoteRepo: crancache -RemoteUsername: r-lib -RemoteSha: e2185c76b6fcd36c9970cfa22ffd2cb62b13eb53 - -Package: cranlike -Source: github -Version: 1.0.1.9001 -Hash: 228d02131e3aa54af9a684864a6511ad -Requires: DBI, RSQLite, debugme, desc -GithubRepo: cranlike -GithubUsername: r-hub -GithubRef: master -GithubSha1: 3c72c14ea25a6cfe7b5585cef871ab1711a5aee9 -RemoteHost: api.github.com -RemoteRepo: cranlike -RemoteUsername: r-hub -RemoteSha: 3c72c14ea25a6cfe7b5585cef871ab1711a5aee9 - -Package: cranlogs -Source: github -Version: 2.1.1 -Hash: 6811357ef92c6f13a4a1c3d1cfc0a9e2 -Requires: httr, jsonlite -GithubRepo: cranlogs -GithubUsername: metacran -GithubRef: master -GithubSha1: 554a99ef6089d5618e6fe64d580aa217bb7558e3 +GithubSha1: e15d96cf088821b6bcbadb89595ed35c3d50f811 RemoteHost: https://api.github.com -RemoteRepo: cranlogs -RemoteUsername: metacran -RemoteSha: 554a99ef6089d5618e6fe64d580aa217bb7558e3 +RemoteRepo: covr +RemoteUsername: r-lib +RemoteSha: e15d96cf088821b6bcbadb89595ed35c3d50f811 Package: crayon Source: CRAN @@ -229,33 +179,25 @@ Hash: c233690edd9fa17a63f7c8d83c1ca153 Requires: crayon Package: desc -Source: github +Source: CRAN Version: 1.2.0 -Hash: acb5cf9e16dd327a0d0fc6ab6522939d +Hash: a1fd2baa29d4954951e3d1816deab6af Requires: R6, assertthat, crayon, rprojroot -GithubRepo: desc -GithubUsername: r-lib -GithubRef: master -GithubSha1: 4f60833fdb6d1aae4cbf09b7eb293c5fa0770e5c -RemoteHost: api.github.com -RemoteRepo: desc -RemoteUsername: r-lib -RemoteSha: 4f60833fdb6d1aae4cbf09b7eb293c5fa0770e5c Package: devtools Source: github Version: 1.13.6.9000 -Hash: 18814b1ead54eb753df1b2b2e2b40e41 +Hash: dd085b2f37d87787a7aaaa78ac29529f Requires: callr, cli, digest, git2r, httr, jsonlite, memoise, pkgbuild, pkgload, rcmdcheck, rstudioapi, usethis, withr GithubRepo: devtools GithubUsername: r-lib GithubRef: master -GithubSha1: 5bbcac458f7c874e465229c01f07d4ff229d3dfc +GithubSha1: 2d012d171b77fcfb54684ba1472797ccd0950709 RemoteHost: https://api.github.com RemoteRepo: devtools RemoteUsername: r-lib -RemoteSha: 5bbcac458f7c874e465229c01f07d4ff229d3dfc +RemoteSha: 2d012d171b77fcfb54684ba1472797ccd0950709 Package: digest Source: CRAN @@ -304,18 +246,10 @@ Requires: digest, gtable, lazyeval, plyr, reshape2, rlang, scales, tibble, viridisLite, withr Package: gh -Source: github +Source: CRAN Version: 1.0.1 -Hash: 7d6e51bfd8cb23d0f3d36b95c787a39f +Hash: 0fafa863f1a86a1f1966e5d5b46a48b5 Requires: httr, ini, jsonlite -GithubRepo: gh -GithubUsername: r-lib -GithubRef: master -GithubSha1: a8b645364f59a5d5030ccfd8d074de640d8b72cd -RemoteHost: https://api.github.com -RemoteRepo: gh -RemoteUsername: r-lib -RemoteSha: a8b645364f59a5d5030ccfd8d074de640d8b72cd Package: git2r Source: CRAN @@ -348,12 +282,6 @@ Source: CRAN Version: 0.7 Hash: 20757f5c393ed0ecf96c9e8e6d8d514c -Package: hms -Source: CRAN -Version: 0.4.2 -Hash: b4096a4f6a6736138e9a825c2baaacf0 -Requires: pkgconfig, rlang - Package: htmltools Source: CRAN Version: 0.3.6 @@ -477,18 +405,10 @@ Hash: 3e43f774fa6dfba877caca1aebbeaa6a Requires: cli, crayon, fansi, rlang, utf8 Package: pkgbuild -Source: github +Source: CRAN Version: 1.0.0 -Hash: 6d46ad074349b737b4e96f2b032c9b67 +Hash: 0a49f0fd623849e51386a274c6ebdbd9 Requires: R6, callr, crayon, desc, rprojroot, withr -GithubRepo: pkgbuild -GithubUsername: r-lib -GithubRef: master -GithubSha1: 3d3d6cf487ecffefcd218f0ab5747f569d8f1680 -RemoteHost: https://api.github.com -RemoteRepo: pkgbuild -RemoteUsername: r-lib -RemoteSha: 3d3d6cf487ecffefcd218f0ab5747f569d8f1680 Package: pkgconfig Source: CRAN @@ -538,20 +458,6 @@ Version: 3.2.0 Hash: 906405f0bc681c9438826952417d5d5a Requires: R6, assertthat, crayon, ps -Package: progress -Source: github -Version: 1.2.0 -Hash: c2beada98e1d490daf2b221763f3875c -Requires: R6, crayon, hms, prettyunits -GithubRepo: progress -GithubUsername: r-lib -GithubRef: master -GithubSha1: 842852869af44a8618e948485b24cdbaf2829736 -RemoteHost: api.github.com -RemoteRepo: progress -RemoteUsername: r-lib -RemoteSha: 842852869af44a8618e948485b24cdbaf2829736 - Package: promises Source: CRAN Version: 1.0.1 @@ -584,7 +490,7 @@ GithubRepo: rcmdcheck GithubUsername: r-lib GithubRef: master GithubSha1: ad42561aa6e06297367455546b6312dcf59282b6 -RemoteHost: api.github.com +RemoteHost: https://api.github.com RemoteRepo: rcmdcheck RemoteUsername: r-lib RemoteSha: ad42561aa6e06297367455546b6312dcf59282b6 @@ -600,41 +506,12 @@ Version: 2.0.1 Hash: b7f86a340a404c69cfb770dfd2081dd9 Requires: tibble -Package: remotes -Source: github -Version: 1.1.1.9000 -Hash: e92091b6a2e32fb964f5a33d4e063d3b -GithubRepo: remotes -GithubUsername: r-lib -GithubRef: master -GithubSha1: 7a576028506708f56bc5db0bde5491de26648e5f -RemoteHost: api.github.com -RemoteRepo: remotes -RemoteUsername: r-lib -RemoteSha: 7a576028506708f56bc5db0bde5491de26648e5f - Package: reshape2 Source: CRAN Version: 1.4.3 Hash: a08472524968be4e233b4c8d0ae5aef1 Requires: Rcpp, plyr, stringr -Package: revdepcheck -Source: github -Version: 1.0.0.9000 -Hash: f2091d76552847c80ccd612dcde54851 -Requires: DBI, RSQLite, assertthat, callr, cli, clisymbols, crancache, - crayon, desc, glue, gmailr, jsonlite, knitr, prettyunits, processx, - progress, rcmdcheck, remotes, sessioninfo, whoami, withr, yaml -GithubRepo: revdepcheck -GithubUsername: r-lib -GithubRef: master -GithubSha1: ee4ca3a7747d6f1f4b77edb900100be969fd30ba -RemoteHost: api.github.com -RemoteRepo: revdepcheck -RemoteUsername: r-lib -RemoteSha: ee4ca3a7747d6f1f4b77edb900100be969fd30ba - Package: rex Source: CRAN Version: 1.1.2 @@ -734,8 +611,8 @@ Requires: commonmark, hunspell, knitr, xml2 Package: stringi Source: CRAN -Version: 1.2.4 -Hash: 03ab60ef7fa4627b38ad67c95ce6b04c +Version: 1.1.7 +Hash: d3dbb18da9a7b73a5b59416e33ad2cbd Package: stringr Source: CRAN @@ -769,19 +646,11 @@ Hash: a149d4e6a2f7d6422e063a19cca52bb9 Requires: xfun Package: usethis -Source: github -Version: 1.4.0.9000 -Hash: 7cc9190f229ba4971678535221c3f172 +Source: CRAN +Version: 1.4.0 +Hash: bdf0ce7802818c5dfc592dd73d62db5b Requires: clipr, clisymbols, crayon, curl, desc, fs, gh, git2r, glue, rlang, rprojroot, rstudioapi, whisker -GithubRepo: usethis -GithubUsername: r-lib -GithubRef: master -GithubSha1: 01dd42bca6a2f7d377e6dcedea7da23f29fe7678 -RemoteHost: https://api.github.com -RemoteRepo: usethis -RemoteUsername: r-lib -RemoteSha: 01dd42bca6a2f7d377e6dcedea7da23f29fe7678 Package: utf8 Source: CRAN diff --git a/packrat/packrat.opts b/packrat/packrat.opts index fe842a8..b7bdb6d 100644 --- a/packrat/packrat.opts +++ b/packrat/packrat.opts @@ -6,7 +6,7 @@ vcs.ignore.src: FALSE external.packages: local.repos: load.external.packages.on.startup: TRUE -ignored.packages: +ignored.packages: tsmp ignored.directories: data inst diff --git a/tests/testthat/test.simple.R b/tests/testthat/test.simple.R index ac15544..eb82b48 100644 --- a/tests/testthat/test.simple.R +++ b/tests/testthat/test.simple.R @@ -3,8 +3,11 @@ library(tsmp) w <- 30 data <- toy_data$data # 3 dimensions matrix -Sys.sleep(1) -result <- simple.fast(data, w, verbose = 2) +if (skip_on_cran()) { + result <- simple.fast(data, w, verbose = 2) +} else { + result <- simple.fast(data, w, verbose = 0) +} test_that("SiMPle Results", { expect_equal(round(sum(result$mp), 3), 806.132) diff --git a/tests/testthat/test.stamps.R b/tests/testthat/test.stamps.R index 12d471e..6f6e6a6 100644 --- a/tests/testthat/test.stamps.R +++ b/tests/testthat/test.stamps.R @@ -33,13 +33,13 @@ if (skip_on_cran()) { }) test_that("Finish", { - Sys.sleep(1) + Sys.sleep(0.5) expect_message(stamp(toy_data$data[1:200, 1], window.size = 30), regex = "Finished") - Sys.sleep(1) + Sys.sleep(0.5) expect_message(stamp.par(toy_data$data[1:200, 1], window.size = 30), regex = "Finished") - Sys.sleep(1) + Sys.sleep(0.5) expect_message(mstomp(toy_data$data[1:200, 1], window.size = 30), regex = "Finished") - Sys.sleep(1) + Sys.sleep(0.5) expect_message(mstomp.par(toy_data$data[1:200, 1], window.size = 30), regex = "Finished") })