Low-rank ADVI

Submission Checklist

[x] Run unit tests: ./runTests.py src/test/unit
[x] Run cpplint: make cpplint
[x] Declare copyright holder and open-source license: see below
[ ] Flesh out more unit tests
[ ] Inline documentation
[ ] Argument validation (cmdstan)
[ ] C++ conventions check

Summary
Implement low-rank ADVI. See also #2750 and #2751.
Intended Effect
Make available a new variational family called lowrank which supports an intermediate between mean-field and full-rank ADVI, intended for more robust posterior variance estimates in large models.
How to Verify
Use the CmdStan interface implemented at wjn0/cmdstan@277b37001a5c3ba458478c84dea223713f43de8d
./model variational algorithm=lowrank rank=4 <...>
where 1 <= rank < # model params. The example models repo ARM/Ch.25/earnings2 is an interesting example.
Side Effects
Documentation
In progress.
Copyright and Licensing
Please list the copyright holder for the work you are submitting (this will be you or your assignee, such as a university or company):
Walter Nelson
By submitting this pull request, the copyright holder is agreeing to license the submitted work under the following licenses:

Code: BSD 3-clause (https://opensource.org/licenses/BSD-3-Clause)
Documentation: CC-BY 4.0 (https://creativecommons.org/licenses/by/4.0/)

Okay, with the last batch of commits, I think this is in a state that can be looked at. I'm tagging @bob-carpenter and @avehtari as we've discussed this issue previously.
Just going to lay out a couple of points that might help someone look at this PR.
Math
The math is exactly as implemented in Ong et al. (2017), with the exception that we parameterize the log-std additive factor instead of the std additive factor. This prevents a case where both the lower-triangular low-rank factor and the std additive factor might be zero, resulting in bad gradients. It's also more similar to the mean-field approximation implementation. Finally, it also makes for more sensible initializations - just like the mean-field approximation, a "zero" initialization corresponds to a standard independent multivariate Gaussian.
Implementation details
Some of the internal details of the base ADVI family change. Specifically, the dimensionality of eta (i.e. pre-transformation standard independent normal vectors) differs between the mean-field/full-rank and low-rank method. In the mean-field/full-rank, eta has length dimension (i.e. number of model params). In the low-rank, eta has length dimension + rank (i.e. number of model params + rank of approximation). Sampling, log-density, and related functions have to change accordingly. Thus we move these functions into the respective family classes. It looked like this was already in progress anyway.
The ADVI interface changes as well. Within the algorithms (eta adaptation, ELBO computation, ELBO gradient computation)  in several instances the code needs to instantiate a variational distribution. For the "fixed-rank" approximations (i.e. mean-field/full-rank), this is not problematic - just uses the C++ templates. However, for the low-rank approximation, we need to pass in the rank to properly instantiate it. So we move the fixed-rank interface into a new subclass, leaving most of the implementation as-is, and just creating virtual functions for instantiating variational distributions within the internal algos. Implementations for both the fixed-rank and low-rank approximations are then straightforward in subclasses, and we take care to instantiate properly in the low-rank ADVI service.
Testing
The low-rank variational family is unit tested in the same way the other two existing families are.
I've also gone ahead and begun implementing low-rank parallels to the other variational tests. The following is (as of this writing) an up-to-date list of what files are done and what files need to be done before merge:

[x] src/test/unit/variational/families/normal_lowrank_test.cpp
[x] src/test/unit/variational/advi_messages_test.cpp
[x] src/test/unit/variational/advi_multivar_no_constraint_test.cpp
[x] src/test/unit/variational/advi_multivar_with_constraint_test.cpp
[ ] src/test/unit/variational/advi_univar_no_constraint_test.cpp
[ ] src/test/unit/variational/advi_univar_with_constraint_test.cpp
[x] src/test/unit/variational/eta_adapt_big_test.cpp
[x] src/test/unit/variational/eta_adapt_fail_test.cpp
[ ] src/test/unit/variational/eta_adapt_mock_models_test.cpp
[ ] src/test/unit/variational/eta_adapt_small_test.cpp
[ ] src/test/unit/variational/gradient_warn_test.cpp
[ ] src/test/unit/variational/hier_logistic_cp_test.cpp
[ ] src/test/unit/variational/hier_logistic_test.cpp
[x] src/test/unit/variational/print_progress_test.cpp
[x] src/test/unit/variational/stochastic_gradient_ascent_test.cpp

C++ conventions
C++ is not one of my native languages, so any feedback on this would be significantly appreciated.
CmdStan
I've got a working CmdStan version at wjn0/cmdstan@277b370. I don't think this is ideal, and I'm not sure I've specified the argument constraints 100% correctly. Any feedback welcome, pls let me know if I should create a separate PR (assume we'll want to restrict discussion here).
Using the implementation
Now for the fun part :smile: It can be used by setting the variational algorithm to lowrank and setting a rank parameter (default is 1, which should work for all models - anything higher would fail for univariate models). In theory, rank=1 should give near-mean-field performance and rank=n-1 (where n is the number of model params) should give near-full-rank performance.
The clearest example I've found of this so far is in the example-models repo, ARM Ch.25 model earnings2. This is (I assume, didn't actually check the book - just tried a bunch until I found one with discrepant mean-field and full-rank performance) a mis-specified/poorly-identified model (posteriors of same betas are highly correlated, probably hyper-correlated predictors? didn't diagnose :). The full-rank approximation captures these correlations well. The low-rank approximation captures some of these correlations well, but not all (increasing as you increase the rank of the approximation). Note the convergence issues are on full display here so to see the behaviour I mention you might have to smash re-run a few times to get meaningful fits (under both full-rank and low-rank approxs, by the way).
Would welcome a rec for a better example model to try here!
Gotta say, after grokking a few of the C++ features I'd forgotten, working with the code here was a real pleasure. Hopefully I haven't abused the code that was already in place too badly :) Please let me know if anything is unclear.

Super cool!  I'm especially curious how general the low-rank approximation is and whether we could use it elsewhere.   What's the complexity of factoring for rank N approximations?
We could really use some low-rank covariance estimation in our MCMC algorithm, which currently only allows diagonal and dense settings.   @bbbales2 worked on this for his Ph.D. thesis and has some code somewhere we should track down before he disappears into the working world ether in a couple weeks.
Thanks for working through the ADVI interface---it's definitely rougher than our optimization or MCMC interfaces.  I can't take a look at it today or tomorrow, but should be able to get to it over the weekend with comments.
CmdStan has to be a different PR because it's a different interface.  So yes, please create a separate PR for that.  @mitzimorris has been digging into CmdStan lately and has added a bunch of new features and can probably help on that side.  It's very easy to get it into cmdstanr and cmdstanpy, and a bit more difficult to add to RStan and PyStan(3).  The user-facing doc is in yet a third repo (docs), which is where the updated CmdStan doc needs to go.   We'd also want to describe the algorithm in the reference manual and perhaps suggest/describe it in the user's guide, too.  They're all in the user-facing docs repo.  I can help with that if you're not keen to write a lot of doc.
The test sets Ong et al. used don't look a lot like the models people fit in Stan other than the hierarchical regression.  We have a lot of evaluation models to use. The ones in posteriordb have been better vetted than the ones in example-models, but not as well vetted as the one in stats-test-models (or something like that).  Rather than the typical ML test error and training error evals, I'd rather measure (a) calibration of probabiliistic predictions, (b) square error of expectation calcuations, and/or (c) measuring the ELBO.    With Stan, we care about recovering the posteriors or expectations our users write down as accurately as possible, not maximizing held out classification performance (that's a model tweaking issue, not an approximate fit issue).

So, relative to the complexity of the dense ADVI approximation (N^3 where N is the number of model params), complexity is R^3 where R is the rank of the approximation (matrix inversion). This is a happy consequence of the Woodbury lemma for inverses of a low-rank covariance matrix of this form (described in the Ong paper than I ever could, so I'll defer to them). The matrix determinant lemma results in something similar for the entropy computations. I don't know enough about HMC to say whether the inverse/determinant is the bottleneck there too, but I'm guessing yes? I'll plan to do some benchmarking to see how well this is borne out in the implementation as written too. @bbbales2 feel free to let me know if anything jumps out at you as potentially useful from this PR on the MCMC side, unfortunately HMC/MCMC in general just puts me squarely out of my depth mathematically haha.
I'll plan to give a more robust evaluation framework some thought over the next couple of days too, with the goal of implementing some stuff this weekend. Thanks for the refs on example models, I'll fit some of those and see if we can get some nice posterior kernel density estimate pairplots for visual assessment. In the original ADVI paper they had a few nice cases (IIRC) of comparing full-rank, mean-field, and MCMC.
I totally agree with you re: eval metrics, I think we really want to examine posterior variance (under)estimation as that's the main "gotcha" with mean-field ADVI identified in the lit IIRC. I assume by eval technique (b)/(c) you mean using MCMC samples to approximate the true KL of converged posteriors in different ways? I can't remember if they did that in the original ADVI paper, but definitely would be a nice way of looking at things if it's mathematically feasible (IIRC there are some mathy gotchas around this if not careful). Is there an existing way to extract the variational parameters/constraint transformations used for a given model when using the VI interfaces, or are you thinking we might use samples on the ADVI side too (assuming I've interpreted your comment correctly :)?
Anyway, super glad there's still excitement around this feature. I'll follow up with a CmdStan PR soon too. Assistance with other interfaces/documentation would be much appreciated as well, though of course I'm totally willing to assist as necessary! I struggle sometimes with R in particular, but cmdstanpy/pystan shouldn't be too much trouble for me.

Cool!
https://arxiv.org/abs/1905.11916 lists several examples where low-rank mass matrix is better than diagonal mass matrix and not worse than dense. It's a bit different from variational, but the same posteriors would be great for testing low-rank VI.

@spinkney thanks for your interest! This branch is developed in reference to develop, and I don't think those functions are in place in base_family there. Is it possible they're present on another branch, causing a conflict?

Yes, me munging two branches together. I'll have to ask those people.

This may be of interest to others here.
Collaborating with @spinkney , I managed to merge together the new RVI with this low-rank approach. It appears to be working.  The main merge conflicts had to do with the new RVI advi signatures, and some virtual functions that needed implementing in the normal_lowrank class.
Cmdstan here: https://github.com/stephensrmmartin/cmdstan/tree/feature/lowrank
Stan here: https://github.com/stephensrmmartin/stan

I got a branch of cmdstanr that is updated to the newest version and works with rvi and lowrank at my cmdstanr feature/rvi branch. So once you install @stephensrmmartin's lowrank and rvi cmdstan you can install my cmdstanr R with
remotes::install_github("spinkney/cmdstanr", ref = "feature/rvi")
library(cmdstanr)
file <- file.path(cmdstan_path(), "examples", "bernoulli", "bernoulli.stan")
mod <- cmdstan_model(file)

data_list <- list(N = 10, y = c(0,1,0,0,0,0,0,0,0,1))

fit <- mod$variational(
  data = data_list,
  algorithm = "lowrank",
  rank = 2
)

docs are also updated :)

Wow, this is incredible - thanks a lot for working on this!
I've just tried this on a pretty big model and got what I think is a OOM error:

When I run fit <- mod$variational(data = data_list, algorithm = "lowrank", rank = 2) on the bernoulli example it works fine.
I tried to run with rank=1 on my model (which has ~42K parameters) on an EC2 instance with 8GB, and got a std::bad_alloc error.
Switched to an EC2 instance with 32GB, I no longer see std::bad_alloc but I do get:

Begin eta adaptation.
Iteration:   1 / 250 [  0%]  (Adaptation)
Warning: Fitting finished unexpectedly! Use the $output() method for more information.

... and nothing in $output(). Also when I run this and switch to htop is see the 32GB quickly filling up...
Is this expected? Is the whole 42K x 42K covariance matrix computed at some step of the computation?

@adamhaber hmm, I can't say I've seen those errors before.
Does the number of parameters in your model scale with the number of data points (e.g. a latent variable model)? If so, I wonder if running a scaled-back version as a first step would help diagnose.
Thus far, I have only tested with CmdStan. My next to-do is to get Python bindings (likely PyCmdStan) working so that I can do more in-depth tests. Perhaps you could try fitting your model in CmdStan and seeing if the error pops up there too? It does look R-generated, given the reference to $output.
Alternatively, if scaling back your model is not possible, might I recommend disabling eta adaptation temporarily, and seeing if optimization proceeds normally?
My original planned use case for this (prototyping latent GP models) has around 10x parameters as yours so hopefully this is not some inherent limitation in the code (I have not had a chance to try these models yet though, unfortunately). I'm reasonably confident we don't ever compute the full covariance matrix (which in your case would be ~15 GB).

Thanks @wjn0 ! I'll try the scaled-back version and will let you know how it worked.
Any chance the issue might be related to differences between CmdStan's variational (2.26.1) vs. RStan's vb (2.21.3)? CmdStan's variational works perfectly on the Bernoulli example, so probably not an installation problem - but on the larger model, vb takes around ~20 mins while variational doesn't proceed past eta adaptation (waited ~1h). Setting adapt engaged = 0 didn't change it. It's definitely running (100% CPU on htop), but very different compared to vb...

@adamhaber sounds good. I unfortunately have not used Stan in R (either before this, or @spinkney's bindings [yet] -- which I assume you're using?) Perhaps they might be able to assist with some of your questions.
When you say

vb takes around ~20 mins

this is referring to mean-field ADVI in one of the Stan R packages?
And when you say

Setting adapt engaged = 0 didn't change it.

is this in cmdstan (i.e. compiling using stanc, and executing at the CLI)? Turning off adaptation should mean there is no eta adaptation at all -- something sounds a bit wonky there, but I'm not sure what.

this is referring to mean-field ADVI in one of the Stan R packages?

Yes, RStan's vb function with mean-field ADVI.

is this in cmdstan (i.e. compiling using stanc, and executing at the CLI)? Turning off adaptation should mean there is no eta adaptation at all -- something sounds a bit wonky there, but I'm not sure what.

Yes, this is cmdstan. What happens is that the program hangs after eta adaptation finishes (or right at the start without it). CPU is still on 100% and memory is filling up quickly, but nothing is printed for more than 1 hour, while the RStan version finishes in less than 20 minutes.

Update - tried this with the latest release of CmdStan and variational works fine, so this seems specific to this version of CmdStan (but not specific to the lowrank algorithm).

@adamhaber so, if I understand correctly, something in my branch of CmdStan seems to be breaking something for all variational procedures, not just lowrank (possibly something that comes out specifically only for large models?)?
Can I ask how you built this copy of cmdstan?
I greatly appreciate the debugging work you've done so far!

@adamhaber so, if I understand correctly, something in my branch of CmdStan seems to be breaking something for all variational procedures, not just lowrank (possibly something that comes out specifically only for large models?)?

That's my understanding as well, but not 100% sure about.

Can I ask how you built this copy of cmdstan?

git clone https://github.com/stephensrmmartin/cmdstan.git (following the advice above)
git checkout feature/lowrank
make stan-update
make build

I greatly appreciate the debugging work you've done so far!

Thanks for working on this!

Okay, now I'm wondering if perhaps this is something related to the RVI feature. @stephensrmmartin is there an issue/PR where I can get more info on RVI?
@adamhaber if you get a chance and are willing to drop down to the CmdStan CLI, I would be curious if my version of CmdStan here produces the same error: https://github.com/wjn0/cmdstan/commit/277b37001a5c3ba458478c84dea223713f43de8d
This might help us narrow it down. Thanks again.

OK, just tried it, and got this on make build:
--- Compiling the main object file. This might take up to a minute. ---
/usr/local/opt/llvm/bin/clang++ -std=c++1y -Wno-unknown-warning-option -Wno-tautological-compare -Wno-sign-compare -D_REENTRANT -Wno-ignored-attributes      -I stan/lib/stan_math/lib/tbb_2019_U8/include   -O3 -I src -I stan/src -I lib/rapidjson_1.1.0/ -I lib/CLI11-1.9.1/ -I stan/lib/stan_math/ -I stan/lib/stan_math/lib/eigen_3.3.9 -I stan/lib/stan_math/lib/boost_1.75.0 -I stan/lib/stan_math/lib/sundials_5.6.1/include    -DBOOST_DISABLE_ASSERTS         -c -o src/cmdstan/main.o src/cmdstan/main.cpp
In file included from src/cmdstan/main.cpp:1:
In file included from src/cmdstan/command.hpp:11:
In file included from src/cmdstan/arguments/argument_parser.hpp:4:
In file included from src/cmdstan/arguments/arg_method.hpp:8:
In file included from src/cmdstan/arguments/arg_variational.hpp:12:
src/cmdstan/arguments/arg_variational_rank.hpp:10:43: error: no member named 'rank' in namespace 'stan::services::experimental::advi'
using stan::services::experimental::advi::rank;
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
src/cmdstan/arguments/arg_variational_rank.hpp:16:20: error: use of undeclared identifier 'rank'
    _description = rank::description();
                   ^
src/cmdstan/arguments/arg_variational_rank.hpp:18:49: error: use of undeclared identifier 'rank'
    _default = boost::lexical_cast<std::string>(rank::default_value());
                                                ^
src/cmdstan/arguments/arg_variational_rank.hpp:19:22: error: use of undeclared identifier 'rank'
    _default_value = rank::default_value();
                     ^
src/cmdstan/arguments/arg_variational_rank.hpp:21:19: error: use of undeclared identifier 'rank'
    _good_value = rank::default_value();
                  ^
src/cmdstan/arguments/arg_variational_rank.hpp:23:14: error: use of undeclared identifier 'rank'
    _value = rank::default_value();
             ^
In file included from src/cmdstan/main.cpp:1:
src/cmdstan/command.hpp:32:10: fatal error: 'stan/services/experimental/advi/lowrank.hpp' file not found
#include <stan/services/experimental/advi/lowrank.hpp>
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7 errors generated.
make: *** [src/cmdstan/main.o] Error 1

@adamhaber My apologies, looks like I forgot to update my remote cmdstan repo to point the stan submodule to my copy of stan! You can update your local copy of my cmdstan repo to point to the branch referenced in this PR with (starting in your cmdstan dir):

cd stan
git remote add wjn0 https://github.com/wjn0/stan.git
git fetch wjn0
git checkout wjn0/feature/issue-2750-advi-lowrank

and then rebuilding cmdstan/examples as normal.

Thanks, that's really helpful. I was able to make build your branch, but the example fails with:
adamhaber:~/cmdstan$ make examples/bernoulli/bernoulli

--- Translating Stan model to C++ code ---
bin/stanc  --o=examples/bernoulli/bernoulli.hpp examples/bernoulli/bernoulli.stan

--- Compiling, linking C++ code ---
g++ -std=c++1y -pthread -D_REENTRANT -Wno-sign-compare -Wno-ignored-attributes      -I stan/lib/stan_math/lib/tbb_2019_U8/include   -O3 -I src -I stan/src -I lib/rapidjson_1.1.0/ -I lib/CLI11-1.9.1/ -I stan/lib/stan_math/ -I stan/lib/stan_math/lib/eigen_3.3.9 -I stan/lib/stan_math/lib/boost_1.75.0 -I stan/lib/stan_math/lib/sundials_5.6.1/include    -DBOOST_DISABLE_ASSERTS         -c -Wno-ignored-attributes   -x c++ -o examples/bernoulli/bernoulli.o examples/bernoulli/bernoulli.hpp
examples/bernoulli/bernoulli.hpp: In member function ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const’:
examples/bernoulli/bernoulli.hpp:112:15: error: ‘deserializer’ is not a member of ‘stan::io’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
               ^~~~~~~~~~~~
examples/bernoulli/bernoulli.hpp:112:44: error: expected primary-expression before ‘>’ token
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                            ^
examples/bernoulli/bernoulli.hpp:124:15: error: ‘in__’ was not declared in this scope
       theta = in__.template read_constrain_lub<local_scalar_t__, jacobian__>(
               ^~~~
examples/bernoulli/bernoulli.hpp:124:15: note: suggested alternative: ‘id_t’
       theta = in__.template read_constrain_lub<local_scalar_t__, jacobian__>(
               ^~~~
               id_t
examples/bernoulli/bernoulli.hpp:124:64: error: expected primary-expression before ‘,’ token
       theta = in__.template read_constrain_lub<local_scalar_t__, jacobian__>(
                                                                ^
examples/bernoulli/bernoulli.hpp: In member function ‘void bernoulli_model_namespace::bernoulli_model::write_array_impl(RNG&, VecR&, VecI&, VecVar&, bool, bool, std::ostream*) const’:
examples/bernoulli/bernoulli.hpp:152:15: error: ‘deserializer’ is not a member of ‘stan::io’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
               ^~~~~~~~~~~~
examples/bernoulli/bernoulli.hpp:152:44: error: expected primary-expression before ‘>’ token
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                            ^
examples/bernoulli/bernoulli.hpp:170:15: error: ‘in__’ was not declared in this scope
       theta = in__.template read_constrain_lub<local_scalar_t__, jacobian__>(
               ^~~~
examples/bernoulli/bernoulli.hpp:170:15: note: suggested alternative: ‘id_t’
       theta = in__.template read_constrain_lub<local_scalar_t__, jacobian__>(
               ^~~~
               id_t
examples/bernoulli/bernoulli.hpp:170:64: error: expected primary-expression before ‘,’ token
       theta = in__.template read_constrain_lub<local_scalar_t__, jacobian__>(
                                                                ^
examples/bernoulli/bernoulli.hpp: In instantiation of ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const [with bool propto__ = false; bool jacobian__ = false; VecR = Eigen::Matrix<double, -1, 1>; VecI = Eigen::Matrix<int, -1, 1>; stan::require_vector_like_t<VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::scalar_type_t<T2> = double; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:312:49:   required from ‘T_ bernoulli_model_namespace::bernoulli_model::log_prob(Eigen::Matrix<T_job_param, -1, 1>&, std::ostream*) const [with bool propto__ = false; bool jacobian__ = false; T_ = double; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:91:20:   required from ‘double stan::model::model_base_crtp<M>::log_prob(Eigen::VectorXd&, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; Eigen::VectorXd = Eigen::Matrix<double, -1, 1>; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:112:50: error: ‘in__’ was not declared in this scope
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
examples/bernoulli/bernoulli.hpp:112:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const [with bool propto__ = false; bool jacobian__ = false; VecR = Eigen::Matrix<stan::math::var_value<double>, -1, 1>; VecI = Eigen::Matrix<int, -1, 1>; stan::require_vector_like_t<VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::scalar_type_t<T2> = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:312:49:   required from ‘T_ bernoulli_model_namespace::bernoulli_model::log_prob(Eigen::Matrix<T_job_param, -1, 1>&, std::ostream*) const [with bool propto__ = false; bool jacobian__ = false; T_ = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:96:77:   required from ‘stan::math::var stan::model::model_base_crtp<M>::log_prob(Eigen::Matrix<stan::math::var_value<double>, -1, 1>&, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; stan::math::var = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:112:50: error: ‘in__’ was not declared in this scope
examples/bernoulli/bernoulli.hpp:112:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const [with bool propto__ = false; bool jacobian__ = true; VecR = Eigen::Matrix<double, -1, 1>; VecI = Eigen::Matrix<int, -1, 1>; stan::require_vector_like_t<VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::scalar_type_t<T2> = double; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:312:49:   required from ‘T_ bernoulli_model_namespace::bernoulli_model::log_prob(Eigen::Matrix<T_job_param, -1, 1>&, std::ostream*) const [with bool propto__ = false; bool jacobian__ = true; T_ = double; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:102:76:   required from ‘double stan::model::model_base_crtp<M>::log_prob_jacobian(Eigen::VectorXd&, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; Eigen::VectorXd = Eigen::Matrix<double, -1, 1>; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:112:50: error: ‘in__’ was not declared in this scope
examples/bernoulli/bernoulli.hpp:112:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const [with bool propto__ = false; bool jacobian__ = true; VecR = Eigen::Matrix<stan::math::var_value<double>, -1, 1>; VecI = Eigen::Matrix<int, -1, 1>; stan::require_vector_like_t<VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::scalar_type_t<T2> = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:312:49:   required from ‘T_ bernoulli_model_namespace::bernoulli_model::log_prob(Eigen::Matrix<T_job_param, -1, 1>&, std::ostream*) const [with bool propto__ = false; bool jacobian__ = true; T_ = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:107:76:   required from ‘stan::math::var stan::model::model_base_crtp<M>::log_prob_jacobian(Eigen::Matrix<stan::math::var_value<double>, -1, 1>&, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; stan::math::var = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:112:50: error: ‘in__’ was not declared in this scope
examples/bernoulli/bernoulli.hpp:112:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const [with bool propto__ = true; bool jacobian__ = false; VecR = Eigen::Matrix<double, -1, 1>; VecI = Eigen::Matrix<int, -1, 1>; stan::require_vector_like_t<VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::scalar_type_t<T2> = double; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:312:49:   required from ‘T_ bernoulli_model_namespace::bernoulli_model::log_prob(Eigen::Matrix<T_job_param, -1, 1>&, std::ostream*) const [with bool propto__ = true; bool jacobian__ = false; T_ = double; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:113:76:   required from ‘double stan::model::model_base_crtp<M>::log_prob_propto(Eigen::VectorXd&, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; Eigen::VectorXd = Eigen::Matrix<double, -1, 1>; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:112:50: error: ‘in__’ was not declared in this scope
examples/bernoulli/bernoulli.hpp:112:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const [with bool propto__ = true; bool jacobian__ = false; VecR = Eigen::Matrix<stan::math::var_value<double>, -1, 1>; VecI = Eigen::Matrix<int, -1, 1>; stan::require_vector_like_t<VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::scalar_type_t<T2> = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:312:49:   required from ‘T_ bernoulli_model_namespace::bernoulli_model::log_prob(Eigen::Matrix<T_job_param, -1, 1>&, std::ostream*) const [with bool propto__ = true; bool jacobian__ = false; T_ = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:118:76:   required from ‘stan::math::var stan::model::model_base_crtp<M>::log_prob_propto(Eigen::Matrix<stan::math::var_value<double>, -1, 1>&, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; stan::math::var = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:112:50: error: ‘in__’ was not declared in this scope
examples/bernoulli/bernoulli.hpp:112:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const [with bool propto__ = true; bool jacobian__ = true; VecR = Eigen::Matrix<double, -1, 1>; VecI = Eigen::Matrix<int, -1, 1>; stan::require_vector_like_t<VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::scalar_type_t<T2> = double; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:312:49:   required from ‘T_ bernoulli_model_namespace::bernoulli_model::log_prob(Eigen::Matrix<T_job_param, -1, 1>&, std::ostream*) const [with bool propto__ = true; bool jacobian__ = true; T_ = double; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:124:75:   required from ‘double stan::model::model_base_crtp<M>::log_prob_propto_jacobian(Eigen::VectorXd&, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; Eigen::VectorXd = Eigen::Matrix<double, -1, 1>; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:112:50: error: ‘in__’ was not declared in this scope
examples/bernoulli/bernoulli.hpp:112:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const [with bool propto__ = true; bool jacobian__ = true; VecR = Eigen::Matrix<stan::math::var_value<double>, -1, 1>; VecI = Eigen::Matrix<int, -1, 1>; stan::require_vector_like_t<VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::scalar_type_t<T2> = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:312:49:   required from ‘T_ bernoulli_model_namespace::bernoulli_model::log_prob(Eigen::Matrix<T_job_param, -1, 1>&, std::ostream*) const [with bool propto__ = true; bool jacobian__ = true; T_ = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:130:75:   required from ‘stan::math::var stan::model::model_base_crtp<M>::log_prob_propto_jacobian(Eigen::Matrix<stan::math::var_value<double>, -1, 1>&, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; stan::math::var = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:112:50: error: ‘in__’ was not declared in this scope
examples/bernoulli/bernoulli.hpp:112:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘void bernoulli_model_namespace::bernoulli_model::write_array_impl(RNG&, VecR&, VecI&, VecVar&, bool, bool, std::ostream*) const [with RNG = boost::random::additive_combine_engine<boost::random::linear_congruential_engine<unsigned int, 40014, 0,<PHONE_NUMBER>>, boost::random::linear_congruential_engine<unsigned int, 40692, 0,<PHONE_NUMBER>> >; VecR = Eigen::Matrix<double, -1, 1>; VecI = std::vector<int>; VecVar = std::vector<double, std::allocator<double> >; stan::require_vector_like_vt<std::is_floating_point, VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::require_std_vector_vt<std::is_floating_point, VecVar>* <anonymous> = 0; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:291:7:   required from ‘void bernoulli_model_namespace::bernoulli_model::write_array(RNG&, Eigen::Matrix<double, -1, 1>&, Eigen::Matrix<double, -1, 1>&, bool, bool, std::ostream*) const [with RNG = boost::random::additive_combine_engine<boost::random::linear_congruential_engine<unsigned int, 40014, 0,<PHONE_NUMBER>>, boost::random::linear_congruential_engine<unsigned int, 40692, 0,<PHONE_NUMBER>> >; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:138:61:   required from ‘void stan::model::model_base_crtp<M>::write_array(boost::random::ecuyer1988&, Eigen::VectorXd&, Eigen::VectorXd&, bool, bool, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; boost::random::ecuyer1988 = boost::random::additive_combine_engine<boost::random::linear_congruential_engine<unsigned int, 40014, 0,<PHONE_NUMBER>>, boost::random::linear_congruential_engine<unsigned int, 40692, 0,<PHONE_NUMBER>> >; Eigen::VectorXd = Eigen::Matrix<double, -1, 1>; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:152:50: error: ‘in__’ was not declared in this scope
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
examples/bernoulli/bernoulli.hpp:152:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const [with bool propto__ = false; bool jacobian__ = false; VecR = std::vector<double, std::allocator<double> >; VecI = std::vector<int>; stan::require_vector_like_t<VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::scalar_type_t<T2> = double; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:319:49:   required from ‘T__ bernoulli_model_namespace::bernoulli_model::log_prob(std::vector<T_l>&, std::vector<int>&, std::ostream*) const [with bool propto__ = false; bool jacobian__ = false; T__ = double; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:147:29:   required from ‘double stan::model::model_base_crtp<M>::log_prob(std::vector<double, std::allocator<double> >&, std::vector<int>&, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:112:50: error: ‘in__’ was not declared in this scope
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
examples/bernoulli/bernoulli.hpp:112:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const [with bool propto__ = false; bool jacobian__ = false; VecR = std::vector<stan::math::var_value<double>, std::allocator<stan::math::var_value<double> > >; VecI = std::vector<int>; stan::require_vector_like_t<VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::scalar_type_t<T2> = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:319:49:   required from ‘T__ bernoulli_model_namespace::bernoulli_model::log_prob(std::vector<T_l>&, std::vector<int>&, std::ostream*) const [with bool propto__ = false; bool jacobian__ = false; T__ = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:153:29:   required from ‘stan::math::var stan::model::model_base_crtp<M>::log_prob(std::vector<stan::math::var_value<double>, std::allocator<stan::math::var_value<double> > >&, std::vector<int>&, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; stan::math::var = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:112:50: error: ‘in__’ was not declared in this scope
examples/bernoulli/bernoulli.hpp:112:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const [with bool propto__ = false; bool jacobian__ = true; VecR = std::vector<double, std::allocator<double> >; VecI = std::vector<int>; stan::require_vector_like_t<VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::scalar_type_t<T2> = double; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:319:49:   required from ‘T__ bernoulli_model_namespace::bernoulli_model::log_prob(std::vector<T_l>&, std::vector<int>&, std::ostream*) const [with bool propto__ = false; bool jacobian__ = true; T__ = double; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:160:29:   required from ‘double stan::model::model_base_crtp<M>::log_prob_jacobian(std::vector<double, std::allocator<double> >&, std::vector<int>&, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:112:50: error: ‘in__’ was not declared in this scope
examples/bernoulli/bernoulli.hpp:112:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const [with bool propto__ = false; bool jacobian__ = true; VecR = std::vector<stan::math::var_value<double>, std::allocator<stan::math::var_value<double> > >; VecI = std::vector<int>; stan::require_vector_like_t<VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::scalar_type_t<T2> = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:319:49:   required from ‘T__ bernoulli_model_namespace::bernoulli_model::log_prob(std::vector<T_l>&, std::vector<int>&, std::ostream*) const [with bool propto__ = false; bool jacobian__ = true; T__ = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:166:29:   required from ‘stan::math::var stan::model::model_base_crtp<M>::log_prob_jacobian(std::vector<stan::math::var_value<double>, std::allocator<stan::math::var_value<double> > >&, std::vector<int>&, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; stan::math::var = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:112:50: error: ‘in__’ was not declared in this scope
examples/bernoulli/bernoulli.hpp:112:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const [with bool propto__ = true; bool jacobian__ = false; VecR = std::vector<double, std::allocator<double> >; VecI = std::vector<int>; stan::require_vector_like_t<VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::scalar_type_t<T2> = double; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:319:49:   required from ‘T__ bernoulli_model_namespace::bernoulli_model::log_prob(std::vector<T_l>&, std::vector<int>&, std::ostream*) const [with bool propto__ = true; bool jacobian__ = false; T__ = double; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:173:29:   required from ‘double stan::model::model_base_crtp<M>::log_prob_propto(std::vector<double, std::allocator<double> >&, std::vector<int>&, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:112:50: error: ‘in__’ was not declared in this scope
examples/bernoulli/bernoulli.hpp:112:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const [with bool propto__ = true; bool jacobian__ = false; VecR = std::vector<stan::math::var_value<double>, std::allocator<stan::math::var_value<double> > >; VecI = std::vector<int>; stan::require_vector_like_t<VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::scalar_type_t<T2> = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:319:49:   required from ‘T__ bernoulli_model_namespace::bernoulli_model::log_prob(std::vector<T_l>&, std::vector<int>&, std::ostream*) const [with bool propto__ = true; bool jacobian__ = false; T__ = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:179:29:   required from ‘stan::math::var stan::model::model_base_crtp<M>::log_prob_propto(std::vector<stan::math::var_value<double>, std::allocator<stan::math::var_value<double> > >&, std::vector<int>&, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; stan::math::var = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:112:50: error: ‘in__’ was not declared in this scope
examples/bernoulli/bernoulli.hpp:112:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const [with bool propto__ = true; bool jacobian__ = true; VecR = std::vector<double, std::allocator<double> >; VecI = std::vector<int>; stan::require_vector_like_t<VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::scalar_type_t<T2> = double; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:319:49:   required from ‘T__ bernoulli_model_namespace::bernoulli_model::log_prob(std::vector<T_l>&, std::vector<int>&, std::ostream*) const [with bool propto__ = true; bool jacobian__ = true; T__ = double; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:186:29:   required from ‘double stan::model::model_base_crtp<M>::log_prob_propto_jacobian(std::vector<double, std::allocator<double> >&, std::vector<int>&, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:112:50: error: ‘in__’ was not declared in this scope
examples/bernoulli/bernoulli.hpp:112:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘stan::scalar_type_t<T2> bernoulli_model_namespace::bernoulli_model::log_prob_impl(VecR&, VecI&, std::ostream*) const [with bool propto__ = true; bool jacobian__ = true; VecR = std::vector<stan::math::var_value<double>, std::allocator<stan::math::var_value<double> > >; VecI = std::vector<int>; stan::require_vector_like_t<VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::scalar_type_t<T2> = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:319:49:   required from ‘T__ bernoulli_model_namespace::bernoulli_model::log_prob(std::vector<T_l>&, std::vector<int>&, std::ostream*) const [with bool propto__ = true; bool jacobian__ = true; T__ = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:192:29:   required from ‘stan::math::var stan::model::model_base_crtp<M>::log_prob_propto_jacobian(std::vector<stan::math::var_value<double>, std::allocator<stan::math::var_value<double> > >&, std::vector<int>&, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; stan::math::var = stan::math::var_value<double>; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:112:50: error: ‘in__’ was not declared in this scope
examples/bernoulli/bernoulli.hpp:112:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
examples/bernoulli/bernoulli.hpp: In instantiation of ‘void bernoulli_model_namespace::bernoulli_model::write_array_impl(RNG&, VecR&, VecI&, VecVar&, bool, bool, std::ostream*) const [with RNG = boost::random::additive_combine_engine<boost::random::linear_congruential_engine<unsigned int, 40014, 0,<PHONE_NUMBER>>, boost::random::linear_congruential_engine<unsigned int, 40692, 0,<PHONE_NUMBER>> >; VecR = std::vector<double, std::allocator<double> >; VecI = std::vector<int>; VecVar = std::vector<double, std::allocator<double> >; stan::require_vector_like_vt<std::is_floating_point, VecR>* <anonymous> = 0; stan::require_vector_like_vt<std::is_integral, VecI>* <anonymous> = 0; stan::require_std_vector_vt<std::is_floating_point, VecVar>* <anonymous> = 0; std::ostream = std::basic_ostream<char>]’:
examples/bernoulli/bernoulli.hpp:304:7:   required from ‘void bernoulli_model_namespace::bernoulli_model::write_array(RNG&, std::vector<double, std::allocator<double> >&, std::vector<int>&, std::vector<double, std::allocator<double> >&, bool, bool, std::ostream*) const [with RNG = boost::random::additive_combine_engine<boost::random::linear_congruential_engine<unsigned int, 40014, 0,<PHONE_NUMBER>>, boost::random::linear_congruential_engine<unsigned int, 40692, 0,<PHONE_NUMBER>> >; std::ostream = std::basic_ostream<char>]’
stan/src/stan/model/model_base_crtp.hpp:200:70:   required from ‘void stan::model::model_base_crtp<M>::write_array(boost::random::ecuyer1988&, std::vector<double, std::allocator<double> >&, std::vector<int>&, std::vector<double, std::allocator<double> >&, bool, bool, std::ostream*) const [with M = bernoulli_model_namespace::bernoulli_model; boost::random::ecuyer1988 = boost::random::additive_combine_engine<boost::random::linear_congruential_engine<unsigned int, 40014, 0,<PHONE_NUMBER>>, boost::random::linear_congruential_engine<unsigned int, 40692, 0,<PHONE_NUMBER>> >; std::ostream = std::basic_ostream<char>]’
examples/bernoulli/bernoulli.hpp:357:1:   required from here
examples/bernoulli/bernoulli.hpp:152:50: error: ‘in__’ was not declared in this scope
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
examples/bernoulli/bernoulli.hpp:152:50: note: suggested alternative: ‘id_t’
     stan::io::deserializer<local_scalar_t__> in__(params_r__, params_i__);
                                              ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
                                              id_t
make/program:53: recipe for target 'examples/bernoulli/bernoulli' failed
make: *** [examples/bernoulli/bernoulli] Error 1

apologies in advance if this is just me messing up the installation :-)

Okay, now I'm wondering if perhaps this is something related to the RVI feature. @stephensrmmartin is there an issue/PR where I can get more info on RVI?
@adamhaber if you get a chance and are willing to drop down to the CmdStan CLI, I would be curious if my version of CmdStan here produces the same error: wjn0/cmdstan@277b370
This might help us narrow it down. Thanks again.

https://github.com/Dashadower/stan/tree/feature/rvi
I just merged that branch with this low-rank PR patchset. There were some merge conflicts I had to fix. E.g., some signatures and interfaces changed with RVI, so I changed low-rank's to match. Likewise, I had to tweak the RVI methods to call init_variational, so that low-rank could work. I also had to implement some virtual functions specifically for low-rank; I believe these are done correctly, but I haven't extensively tested it myself.

apologies in advance if this is just me messing up the installation :-)

@adamhaber definitely not you, just got the same thing on a fresh copy of mine. I just pushed up a version merged with the latest stan develop, hopefully that resolves the issue for you as it did for me. Sorry about that!
Thanks for the info @stephensrmmartin!

I've pulled feature/advi-lowrank-interface-sub and got the same error. Should I do something else within the Stan folder? Sorry for the naive questions, still not used to working with submodules and keeping everything on the right branch/commit/etc - which I suspect is what's giving me the error...

My apologies -- I think it's actually my lack of familiarity with git submodules that's giving us trouble! With that said, I think I've updated the right submodules now. The following gives me a working, fresh copy of CmdStan with low-rank support (whereas previously it was giving me the same error as you, about io):

git clone https://github.com/wjn0/cmdstan.git
cd cmdstan && git checkout feature/advi-lowrank-interface-sub (note: this CmdStan branch is different from the branch referenced in the lead text of this PR only in that it updates the Stan submodule to point to my copy of Stan w/ low rank support & updated math submodule)
git submodule update --init --recursive
make build -j4 (or however many cores)
make examples/bernoulli/bernoulli (as a test)

Please feel free to let me know if this doesn't work for you.

Thanks @wjn0 , that works for me as well!
Mean-field runs as expected on both the Bernoulli example and the large model.
Low rank works fine on the Bernoulli example, but seems to be very slow for this model (rank=1) - I'm running it with refresh=1 and nothing is printed in more than 1 hour. Again, CPU is 100% and memory use is high (~25GB), so something seems to be working in the background. Other than refresh=1 (which might be problemtic? I've seen lags in the outputs in previous variational runs, too), is there any way to monitor the progress of the lowrank algorithm in real time?

Thanks @wjn0 , that works for me as well!
Mean-field runs as expected on both the Bernoulli example and the large model.
Low rank works fine on the Bernoulli example, but seems to be very slow for this model (rank=1) - I'm running it with refresh=1 and nothing is printed in more than 1 hour. Again, CPU is 100% and memory use is high (~25GB), so something seems to be working in the background. Other than refresh=1 (which might be problemtic? I've seen lags in the outputs in previous variational runs, too), is there any way to monitor the progress of the lowrank algorithm in real time?

Could you try a smaller example and time the mean-field, lowrank, and fullrank?
And to confirm, this is without the RVI additions right? It's just the low-rank branch mentioned by @wjn0  (i.e., you are not using my branch, but his branch?)

Yes, this is based on these installation instructions:
git clone https://github.com/wjn0/cmdstan.git
cd cmdstan && git checkout feature/advi-lowrank-interface-sub (note: this CmdStan branch is different from the branch referenced in the lead text of this PR only in that it updates the Stan submodule to point to my copy of Stan w/ low rank support & updated math submodule to match upstream stan/develop)
git submodule update --init --recursive
make build -j4 (or however many cores)
make examples/bernoulli/bernoulli (as a test)

I'll run some benchmarks and post the results later today.

Hello! This feature would be very useful for me. It doesn't look like there has been progress in some time though... Are there any plans to pick this up?

I don't know that anyone's working on this.  We are working on coding a new variational inference algorithm that uses a low rank plus diagonal covariance matrix derived from L-BFGS optimization.

33+3/2

I don't know that anyone's working on this. We are working on coding a new variational inference algorithm that uses a low rank plus diagonal covariance matrix derived from L-BFGS optimization.

Awesome!


Add retries support

Try to fetch unsuccessful requests more then once. The amount
of attempts is controlled by the max retries setting.

Hey, @Ziinc one high-level comment. The retries logic needs to be applied in a worker. Middleware can't really re-schedule requests. (Well at least if we don't introduce responses to middlewares).
E.g. we're making a decision if we plan to re-try requests after all middlewares are already applied.

@Ziinc Can we agree to support the global configs on the high level for retries? I will introduce the spider level configs, so they will take advantage over the global configs eventually

Yup I understand that part about the rescheduling
https://github.com/oltarasenko/crawly/pull/39#discussion_r360400575
As for the global configs, how I handled it in #31 was to use it as a fallback, so if it wasn't provided in a tuple, it would check with a get_env

To summarize:
As I understand the main issue left for now is the fact that I had to "tune" the unique request middleware. Honestly speaking I think it's a bit of a problem, and I would want to keep middlewares untouched.
I have an idea in mind, which sounds quite suitable. E.g. I want to move middlewares to a request. So request will know how exactly it should be processed upon creation. E.g. there will be something like a route of processors to execute on the request.
I will try to submit a new version to a review as soon as possible. But it would be nice to do it after the #31 is merged.

So, conceptually, the flow would be like this (taking into account #34 )?

I would describe it this way:

Could it be something similar to this:

ideas:

unique request middleware remains unchanged
only new requests created through new_request pass through middlewares again
requests that are passed to retry_request do not go through middlewares, and instead go to the response storage
the Processors (pipeline behaviour modules) can call new_request and retry_request. Anything that falls under the concern of "converting a request into response" should be considered a Processor.
the fetcher processor  (for #34, maybe we can come up with a better name) converts the request to a response.
the retry processor receives the failed response from the previous pipeline module, and records the number of times it sees the particular failed request. Drops the request after count exceeds.

pros:

reuse of the pipeline concept
middlewares are untouched by retrying logic
retry logic can be completely customized by advanced users.
fetchers are pluggable, sole purpose is to convert a request into a response
allows extending of the way get_request is called, allows for Processors to implement features like throttling. We can also abstract the backoff logic into a processor module as well.

cons:

new terminology, more customizability
needs a diagram to be explained
retry logic skips middlewares (though i think this is more of a pro than con, actually. Depends on scenario)

@oltarasenko what are your thoughts on this? I can come up with a draft PR for the processors concept if you think that it is viable to solve both retries and pluggable response fetching.

@Ziinc I am not quite sure about making it more complex. I have another idea in mind, already working on a PR which should make the procedure simple and middlewares will not be changed. Just give me a bit of time to prepare it.

@Ziinc Please check the latest implementation here. The idea I have in mind is the following.

We abstract the Crawly.Request even more (so it goes far away from the original HTTPoison.Request)
We add middlewares to the request structure. So the idea that request itself is something like a router, which identifies how to Route/Process itself.
It allows to "mangle" the request during retries, saying ok, when retrying I should ignore following middlewares: ...
It allows specifying middlewares on the spider level as well. (And on the parsing level if needed)

@Ziinc could you please have a glance?

Hey, @Ziinc regarding the:

I don't see why we need to duplicate Elixir behaviour with the convenience functions on the Request module

I am quite open for a discussion and changes here. So lets have this conversation, let me try to explain what I had in mind, and let's make a decision based on the discussion.
Let me start with the idea:
This PR changes the Crawly.Request type definition to opaque type and the idea I am trying to push is that: now one should really reason what is the internal representation of Crawly.Request. Instead, you're working with the Request as with a black box through the getter and setter API. This is for example similar to https://hexdocs.pm/elixir/List.html. E.g. we don't know what is list, we just operate with it.
Fundamentally this approach has some pros and cons:
Pros:

It's possible to change the internal representation of the module without updating the entire codebase (as well as API stays the same);
Introduces something like separation of concerns. (This is probably driven by my bad experience with deeply nested maps, but in my practice, I saw cases when people was defining maps in other application, was sending them outside and pattern matched them in their own maps. Which was especially painful when the maps was very deep (e.g. had 3-4 layers of deepness)). So getting back to the topic:
The fact that Crawly.Request is a map that is a coincidence (from the architecture point of view). If we would allow the outside world do something like request.url or %{request: req} then we will not really be able to encapsulate the Request data type :(
Cons:
More code to write
Maybe harder to start using. E.g. you need to use functional API instead of built-in map notation.

Now finally:
In Crawly itself: I had to add default middlewares to request middlewares. This job can be done kind of seamlessly on a setter. And I did it via setter.

OK, I understand what you want to achieve.
As for nested map pattern matching, I think that since pattern matching is an essential part of elixir, it doesn't make sense to completely prevent/block users from working around what is already familiar to them. For example, Ecto.Changeset is essentially a map that allows for pattern matching, although there are separate setter functions for updating the changeset, which may have some side effects.
Would having an opaque typespec make it harder to understand, especially with the internal implementation and data type hidden away?
Besides, when debugging, the first thing that would be done would be to call IO.inspect/1. The user would then realize that the underlying implementation is a map and then "hack together" a solution to update the map directly, bypassing the getters/setters.
I don't quite understand how it will introduce a separation of concerns. The Request struct represents how the fetcher will execute the request. All that it is concerned about is to represent the request. It doesn't need to know how or why it is updated to a certain state. If anything, by adding in getter/setter functions, introduces less separation by mixing the representation with the updating.
Another concern I have is the amount of code that would be required to implement the getters/setters that would result in much more maintenance. Considering the number of options and fields in HTTPoison.Request, there would be at least an addition of a few thousand lines of code.

I do think that introducing getter/setter functions would have minimal benefits compared to the costs (maintenance/complexity/difficulty to understand/duplicated efforts)

Ok, I accept your points. I would re-raise this discussion separately on the next stages of the project development, once (or if) it will be more important for us to relay on opaque structures. For now I am closing this PR. Will re-do the re-tries part separately.


Install gcc 10 from debian testing

Some recent balenaOS images using kernel 5.10 and gcc 9.3.0
are unable to compile kernel modules using gcc 8 in debian buster.
gcc: error: unrecognized command line option '-mstack-protector-guard=sysreg'
Resolves: https://github.com/balena-os/kernel-module-build/issues/37
Change-type: patch
Signed-off-by: Kyle Harding<EMAIL_ADDRESS>

using
FROM balenalib/raspberrypi4-64-debian:buster

RUN install_packages curl wget build-essential libelf-dev awscli bc flex libssl-dev python bison

# install gcc 10
RUN echo 'deb http://deb.debian.org/debian testing main' >> /etc/apt/sources.list && install_packages awscli python3-yaml gcc-9 libc6-dev

COPY . /usr/src/app
WORKDIR /usr/src/app

ENV VERSION '2.88.4.dev'
RUN BALENA_MACHINE_NAME=raspberrypi4-64 ./build.sh build --device raspberrypi4-64 --os-version "$VERSION" --src example_module

CMD [ "/usr/src/app/run.sh" ]

we can't install gcc-9. i guess this is no longer available?
right now if we try to build for 2.88.4, it works but the current base image used is bullseye imo, not buster

It looks like you're installing gcc-9 on line 6...why does this say gcc 10?

this PR is from a year ago, I honestly don't recall what was going through my head at the time

using
FROM balenalib/raspberrypi4-64-debian:buster

RUN install_packages curl wget build-essential libelf-dev awscli bc flex libssl-dev python bison

# install gcc 10
RUN echo 'deb http://deb.debian.org/debian testing main' >> /etc/apt/sources.list && install_packages awscli python3-yaml gcc-9 libc6-dev

COPY . /usr/src/app
WORKDIR /usr/src/app

ENV VERSION '2.88.4.dev'
RUN BALENA_MACHINE_NAME=raspberrypi4-64 ./build.sh build --device raspberrypi4-64 --os-version "$VERSION" --src example_module

CMD [ "/usr/src/app/run.sh" ]

we can't install gcc-9. i guess this is no longer available?
right now if we try to build for 2.88.4, it works but the current base image used is bullseye imo, not buster

@rahul-thakoor Yeah, we should have pinned to buster as part of this PR. If you've confirmed it works can you push the additional required commit(s)?

@klutchell can you please check?
I couldn't get it to work with buster. i pinned to bullseye


Pin busybox to 1.28

In busybox:latest, nslookup does not work in K8s. See: https://bugs.busybox.net/show_bug.cgi?id=11161. This inconsistency makes following the Debugging DNS Resolution guide quite confusing/difficult (Is my cluster wonky or the image I'm testing with?). According to this comment in the Busybox Docker repo, this change was intentional upstream. At least for the time being I suggest we pin the Busybox version used to prevent confusion.

Registered.

@marshallford 👋 I'm willing to approve this PR, with the understanding that I'll point any issues about busybox versions to you.
/lgtm
/approve


Auto renew token does not work

the auto renew function does not work, there is error with 'googleapi: Error 401: Invalid Credentials, authError'

already fixed in PR #16


test: scale not check SocketA/B in live

rerun skydive-scale-tests

rerun skydive-scale-tests

rerun skydive-scale-tests

rerun skydive-scale-tests

rerun skydive-scale-tests


CAN Bus transmission example

An example of use of can bus

Solid addition! It's nice how we can offload work to the bx_can crate. It also means APIs between HALs etc will be similar.


Migrate helm ambient integration tests to use --set profile=ambient

Is this the right place to submit this?

[X] This is not a security vulnerability or a crashing bug
[X] This is not a question about how to use Istio

Bug Description
This issue has been raised to track the ambient helm upgrade tests migration to use ambient profile once the previous minor release is no longer 1.20.x . Currently the test uses 1.20 for trying upgrade, where the helm profile changes are not available, and we would like to migrate to this as soon as 1.21 is available for the tests to use.
Reference PR:
https://github.com/istio/istio/pull/49179/files
Version
1.20

Additional Information
No response

@adilmp1 you can get started with this task, as this will be in the same area as you are currently working on. You can ping me on slack for further inputs

The script that has to be fixed is at: https://github.com/istio/istio/blob/master/tests/integration/helm/util.go#L147 and
https://github.com/istio/istio/blob/master/tests/integration/helm/util.go#L76


Sender does not support punycode.

Got an escalation regarding this.

@chrisda or @MSFTTracyP could you please merge this request?

Docs Build status updates of commit c86b4ed:
:white_check_mark: Validation status: passed

File
Status
Preview URL
Details

microsoft-365/security/office-365-security/tenant-allow-block-list.md
:white_check_mark:Succeeded

For more details, please refer to the build report.
Note: Broken links written as relative paths are included in the above build report. For broken links written as absolute paths or external URLs, see the broken link report.
For any questions, please:Try searching the docs.microsoft.com contributor guidesPost your question in the Docs support channel

Docs Build status updates of commit 9f71b24:
:white_check_mark: Validation status: passed

File
Status
Preview URL
Details

microsoft-365/security/office-365-security/tenant-allow-block-list.md
:white_check_mark:Succeeded

For more details, please refer to the build report.
Note: Broken links written as relative paths are included in the above build report. For broken links written as absolute paths or external URLs, see the broken link report.
For any questions, please:Try searching the docs.microsoft.com contributor guidesPost your question in the Docs support channel


ISPN-13795 docs revision

https://issues.redhat.com/browse/ISPN-13795
Needs backport to 13.0.x

merged! thanks @oraNod !


Attempt to resolve occasional shutdown hangs in distributed operation

@Pansysk75 could you please try this patch to see if it resolves the issues we were discussing?

@hkaiser Still getting hangs at the same spot occasionally.
In the 2 node setup, node 0 initiates the dijkstra termination algorithm and successfully invokes dijkstra_termination_action on node 1, but the invocation of dijkstra_termination_action from node 1 with destination node 0 does not seem to be picked up by node 0 (note that the newly added latch gets decremented all the way to 0).
Thus, node 0 hangs on the following step:
https://github.com/STEllAR-GROUP/hpx/blob/4647d1931cd3902f4e9f674f8f51cc28e8756409/libs/full/runtime_distributed/src/server/runtime_support_server.cpp#L377-L382
I confirmed this with additional debug logging.
Is there a flag for additional parcelport logging messages?

@Pansysk75 thanks! I have added some more changes, this time on the receiving end of the final parcel.

Is there a flag for additional parcelport logging messages?

This should be enabled by the settings you already use. Look for log messages that are tagged with [PT]. I would consider it a bug if those were not emitted.

Performance test reportHPX PerformanceComparisonBENCHMARKFORK_JOIN_EXECUTORPARALLEL_EXECUTORSCHEDULER_EXECUTORFor Each(=)+(=)InfoPropertyBeforeAfterHPX Datetime2023-03-06T15:59:25+00:002023-05-09T17:32:26+00:00HPX Commit6b6e1e71343e80ad04bf610e41c26a41c1f37333c11be54504cb8f3da5b68cc08f9b9b8bc2e9a5d3Hostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduEnvfileDatetime2023-03-10T03:27:49.135034-06:002023-05-09T14:03:50.922952-05:00Compiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1ClusternamerostamrostamComparisonBENCHMARKNO-EXECUTORFuture Overhead - Create Thread Hierarchical - Latch-InfoPropertyBeforeAfterHPX Datetime2023-03-06T15:59:25+00:002023-05-09T17:32:26+00:00HPX Commit6b6e1e71343e80ad04bf610e41c26a41c1f37333c11be54504cb8f3da5b68cc08f9b9b8bc2e9a5d3Hostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduEnvfileDatetime2023-03-10T03:28:21.991297-06:002023-05-09T14:04:24.792503-05:00Compiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1ClusternamerostamrostamComparisonBENCHMARKFORK_JOIN_EXECUTOR_DEFAULT_FORK_JOIN_POLICY_ALLOCATORPARALLEL_EXECUTOR_DEFAULT_PARALLEL_POLICY_ALLOCATORSCHEDULER_EXECUTOR_DEFAULT_SCHEDULER_EXECUTOR_ALLOCATORStream Benchmark - Add(=)(=)(=)Stream Benchmark - Scale(=)(=)(=)Stream Benchmark - Triad(=)(=)(=)Stream Benchmark - Copy(=)(=)(=)InfoPropertyBeforeAfterHPX Datetime2023-03-06T15:59:25+00:002023-05-09T17:32:26+00:00HPX Commit6b6e1e71343e80ad04bf610e41c26a41c1f37333c11be54504cb8f3da5b68cc08f9b9b8bc2e9a5d3Hostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduEnvfileDatetime2023-03-10T03:28:29.145749-06:002023-05-09T14:04:31.947806-05:00Compiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1ClusternamerostamrostamExplanation of SymbolsSymbolMEANING=No performance change (confidence interval within ±1%)(=)Probably no performance change (confidence interval within ±2%)(+)/(-)Very small performance improvement/degradation (≤1%)+/-Small performance improvement/degradation (≤5%)++/--Large performance improvement/degradation (≤10%)+++/---Very large performance improvement/degradation (>10%)?Probably no change, but quite large uncertainty (confidence interval with ±5%)??Unclear result, very large uncertainty (±10%)???Something unexpected…

Now the issue does not appear, at least not in the way that it did before.
There is another occasional hang, however.
There seems to be a non-terminating base_set_event_action thread in the queue of the node initiating the shutdown.
This prevents the thread manager from reporting as idle, so we get stuck here, at the first run of the dijkstra routine:
https://github.com/STEllAR-GROUP/hpx/blob/bae1f089cbec2fc752cf193a375a71106702aecd/libs/full/runtime_distributed/src/server/runtime_support_server.cpp#L248
In the meanwhile, I'll check how these correlate with including the partitioned_vector facilities.

@hkaiser Now the issue does not appear, at least not in the way that it did before. There is another occasional hang, however.
There seems to be a non-terminating base_set_event_action thread in the queue of the node initiating the shutdown. This prevents the thread manager from reporting as idle, so we get stuck here, at the first run of the dijkstra routine:
https://github.com/STEllAR-GROUP/hpx/blob/bae1f089cbec2fc752cf193a375a71106702aecd/libs/full/runtime_distributed/src/server/runtime_support_server.cpp#L248
In the meanwhile, I'll check how these issues correlate with including the partitioned_vector facilities, which is how I've reproducing this issue all along.
Edit: The issues still appear without the partitioned_vector facilities, they just surface less often.

Thanks! I'll have some ideas what could be done about this. Also, the segmented algorithms do not hang on the CI anymore. Some progress, it seems.

@Pansysk75 I added some more possible fixes. Could you please try again?

Performance test reportHPX PerformanceComparisonBENCHMARKFORK_JOIN_EXECUTORPARALLEL_EXECUTORSCHEDULER_EXECUTORFor Each(=)+(=)InfoPropertyBeforeAfterHPX Commit6b6e1e71343e80ad04bf610e41c26a41c1f37333d12542155856a9e85aaf036c0ef84ed71f5c8c75HPX Datetime2023-03-06T15:59:25+00:002023-05-11T14:47:42+00:00EnvfileClusternamerostamrostamCompiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1Hostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduDatetime2023-03-10T03:27:49.135034-06:002023-05-11T09:55:37.335862-05:00ComparisonBENCHMARKNO-EXECUTORFuture Overhead - Create Thread Hierarchical - Latch(=)InfoPropertyBeforeAfterHPX Commit6b6e1e71343e80ad04bf610e41c26a41c1f37333d12542155856a9e85aaf036c0ef84ed71f5c8c75HPX Datetime2023-03-06T15:59:25+00:002023-05-11T14:47:42+00:00EnvfileClusternamerostamrostamCompiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1Hostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduDatetime2023-03-10T03:28:21.991297-06:002023-05-11T09:56:09.622876-05:00ComparisonBENCHMARKFORK_JOIN_EXECUTOR_DEFAULT_FORK_JOIN_POLICY_ALLOCATORPARALLEL_EXECUTOR_DEFAULT_PARALLEL_POLICY_ALLOCATORSCHEDULER_EXECUTOR_DEFAULT_SCHEDULER_EXECUTOR_ALLOCATORStream Benchmark - Add(=)(=)(=)Stream Benchmark - Scale(=)(=)(=)Stream Benchmark - Triad(=)(=)(=)Stream Benchmark - Copy(=)-(=)InfoPropertyBeforeAfterHPX Commit6b6e1e71343e80ad04bf610e41c26a41c1f37333d12542155856a9e85aaf036c0ef84ed71f5c8c75HPX Datetime2023-03-06T15:59:25+00:002023-05-11T14:47:42+00:00EnvfileClusternamerostamrostamCompiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1Hostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduDatetime2023-03-10T03:28:29.145749-06:002023-05-11T09:56:17.220908-05:00Explanation of SymbolsSymbolMEANING=No performance change (confidence interval within ±1%)(=)Probably no performance change (confidence interval within ±2%)(+)/(-)Very small performance improvement/degradation (≤1%)+/-Small performance improvement/degradation (≤5%)++/--Large performance improvement/degradation (≤10%)+++/---Very large performance improvement/degradation (>10%)?Probably no change, but quite large uncertainty (confidence interval with ±5%)??Unclear result, very large uncertainty (±10%)???Something unexpected…

@hkaiser The hangs are very sparse now. Here's some clues about the latest issue I mentioned:
The non-terminating base_set_event_action which occasionally prevents shutdown seems to be a remnant from startup, lanuched (I think) around here:
https://github.com/STEllAR-GROUP/hpx/blob/242eb290e7f5f83ce1c15dc7c4ad430203094504/libs/full/init_runtime/src/pre_main.cpp#L188C7-L198
Also in the logs, there are 8 "entering local barrier" messages, but only 7 "exiting local barrier" on startup, I assume it's related.
Here are the logs from node 0. I suppose around line 27070 is where the interesting stuff happens (regex for create_work.*base_set and base_set_event_action.*terminated was also useful):
debug_log_node0.txt
Hope this helps!

Performance test reportHPX PerformanceComparisonBENCHMARKFORK_JOIN_EXECUTORPARALLEL_EXECUTORSCHEDULER_EXECUTORFor Each(=)?(=)InfoPropertyBeforeAfterHPX Commit6b6e1e71343e80ad04bf610e41c26a41c1f37333bc70f4db5ecc6b4db0f2d6f08bb6d0ce27648152HPX Datetime2023-03-06T15:59:25+00:002023-05-12T13:05:56+00:00Datetime2023-03-10T03:27:49.135034-06:002023-05-12T08:15:00.136231-05:00ClusternamerostamrostamHostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduEnvfileCompiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1ComparisonBENCHMARKNO-EXECUTORFuture Overhead - Create Thread Hierarchical - Latch(=)InfoPropertyBeforeAfterHPX Commit6b6e1e71343e80ad04bf610e41c26a41c1f37333bc70f4db5ecc6b4db0f2d6f08bb6d0ce27648152HPX Datetime2023-03-06T15:59:25+00:002023-05-12T13:05:56+00:00Datetime2023-03-10T03:28:21.991297-06:002023-05-12T08:15:32.890107-05:00ClusternamerostamrostamHostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduEnvfileCompiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1ComparisonBENCHMARKFORK_JOIN_EXECUTOR_DEFAULT_FORK_JOIN_POLICY_ALLOCATORPARALLEL_EXECUTOR_DEFAULT_PARALLEL_POLICY_ALLOCATORSCHEDULER_EXECUTOR_DEFAULT_SCHEDULER_EXECUTOR_ALLOCATORStream Benchmark - Add(=)=(=)Stream Benchmark - Scale(=)(=)(=)Stream Benchmark - Triad(=)(=)(=)Stream Benchmark - Copy(=)-=InfoPropertyBeforeAfterHPX Commit6b6e1e71343e80ad04bf610e41c26a41c1f37333bc70f4db5ecc6b4db0f2d6f08bb6d0ce27648152HPX Datetime2023-03-06T15:59:25+00:002023-05-12T13:05:56+00:00Datetime2023-03-10T03:28:29.145749-06:002023-05-12T08:15:40.101883-05:00ClusternamerostamrostamHostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduEnvfileCompiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1Explanation of SymbolsSymbolMEANING=No performance change (confidence interval within ±1%)(=)Probably no performance change (confidence interval within ±2%)(+)/(-)Very small performance improvement/degradation (≤1%)+/-Small performance improvement/degradation (≤5%)++/--Large performance improvement/degradation (≤10%)+++/---Very large performance improvement/degradation (>10%)?Probably no change, but quite large uncertainty (confidence interval with ±5%)??Unclear result, very large uncertainty (±10%)???Something unexpected…

Performance test reportHPX PerformanceComparisonBENCHMARKFORK_JOIN_EXECUTORPARALLEL_EXECUTORSCHEDULER_EXECUTORFor Each(=)??-InfoPropertyBeforeAfterHPX Datetime2023-05-10T12:07:53+00:002023-05-12T20:07:09+00:00HPX Commitdcb541576898d370113946ba15fb58c20c8325b2232ed2c52bb96b59888ec99a4c4bef4f556afb0cDatetime2023-05-10T14:50:18.616050-05:002023-05-12T15:15:10.530511-05:00Compiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1ClusternamerostamrostamHostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduEnvfileComparisonBENCHMARKNO-EXECUTORFuture Overhead - Create Thread Hierarchical - Latch(=)InfoPropertyBeforeAfterHPX Datetime2023-05-10T12:07:53+00:002023-05-12T20:07:09+00:00HPX Commitdcb541576898d370113946ba15fb58c20c8325b2232ed2c52bb96b59888ec99a4c4bef4f556afb0cDatetime2023-05-10T14:52:35.047119-05:002023-05-12T15:17:24.551604-05:00Compiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1ClusternamerostamrostamHostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduEnvfileComparisonBENCHMARKFORK_JOIN_EXECUTOR_DEFAULT_FORK_JOIN_POLICY_ALLOCATORPARALLEL_EXECUTOR_DEFAULT_PARALLEL_POLICY_ALLOCATORSCHEDULER_EXECUTOR_DEFAULT_SCHEDULER_EXECUTOR_ALLOCATORStream Benchmark - Add(=)(=)(=)Stream Benchmark - Scale(=)==Stream Benchmark - Triad(=)(=)(=)Stream Benchmark - Copy(=)==InfoPropertyBeforeAfterHPX Datetime2023-05-10T12:07:53+00:002023-05-12T20:07:09+00:00HPX Commitdcb541576898d370113946ba15fb58c20c8325b2232ed2c52bb96b59888ec99a4c4bef4f556afb0cDatetime2023-05-10T14:52:52.237641-05:002023-05-12T15:17:41.827014-05:00Compiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1ClusternamerostamrostamHostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduEnvfileExplanation of SymbolsSymbolMEANING=No performance change (confidence interval within ±1%)(=)Probably no performance change (confidence interval within ±2%)(+)/(-)Very small performance improvement/degradation (≤1%)+/-Small performance improvement/degradation (≤5%)++/--Large performance improvement/degradation (≤10%)+++/---Very large performance improvement/degradation (>10%)?Probably no change, but quite large uncertainty (confidence interval with ±5%)??Unclear result, very large uncertainty (±10%)???Something unexpected…

Performance test reportHPX PerformanceComparisonBENCHMARKFORK_JOIN_EXECUTORPARALLEL_EXECUTORSCHEDULER_EXECUTORFor Each(=)??-InfoPropertyBeforeAfterHPX Commitdcb541576898d370113946ba15fb58c20c8325b27b471b66bf824eefcbc53e137075685419911c7cHPX Datetime2023-05-10T12:07:53+00:002023-05-13T20:51:56+00:00Datetime2023-05-10T14:50:18.616050-05:002023-05-13T16:00:11.266315-05:00Compiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1EnvfileClusternamerostamrostamHostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduComparisonBENCHMARKNO-EXECUTORFuture Overhead - Create Thread Hierarchical - Latch=InfoPropertyBeforeAfterHPX Commitdcb541576898d370113946ba15fb58c20c8325b27b471b66bf824eefcbc53e137075685419911c7cHPX Datetime2023-05-10T12:07:53+00:002023-05-13T20:51:56+00:00Datetime2023-05-10T14:52:35.047119-05:002023-05-13T16:02:26.005081-05:00Compiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1EnvfileClusternamerostamrostamHostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduComparisonBENCHMARKFORK_JOIN_EXECUTOR_DEFAULT_FORK_JOIN_POLICY_ALLOCATORPARALLEL_EXECUTOR_DEFAULT_PARALLEL_POLICY_ALLOCATORSCHEDULER_EXECUTOR_DEFAULT_SCHEDULER_EXECUTOR_ALLOCATORStream Benchmark - Add(=)(=)(=)Stream Benchmark - Scale(=)(=)=Stream Benchmark - Triad(=)(=)(=)Stream Benchmark - Copy(=)(=)(=)InfoPropertyBeforeAfterHPX Commitdcb541576898d370113946ba15fb58c20c8325b27b471b66bf824eefcbc53e137075685419911c7cHPX Datetime2023-05-10T12:07:53+00:002023-05-13T20:51:56+00:00Datetime2023-05-10T14:52:52.237641-05:002023-05-13T16:02:43.253457-05:00Compiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1EnvfileClusternamerostamrostamHostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduExplanation of SymbolsSymbolMEANING=No performance change (confidence interval within ±1%)(=)Probably no performance change (confidence interval within ±2%)(+)/(-)Very small performance improvement/degradation (≤1%)+/-Small performance improvement/degradation (≤5%)++/--Large performance improvement/degradation (≤10%)+++/---Very large performance improvement/degradation (>10%)?Probably no change, but quite large uncertainty (confidence interval with ±5%)??Unclear result, very large uncertainty (±10%)???Something unexpected…

Performance test reportHPX PerformanceComparisonBENCHMARKFORK_JOIN_EXECUTORPARALLEL_EXECUTORSCHEDULER_EXECUTORFor Each(=)??-InfoPropertyBeforeAfterHPX Datetime2023-05-10T12:07:53+00:002023-05-14T00:54:22+00:00HPX Commitdcb541576898d370113946ba15fb58c20c8325b27fe0f1542686848aaa62f21d395f1425600ae4c6EnvfileHostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduCompiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1ClusternamerostamrostamDatetime2023-05-10T14:50:18.616050-05:002023-05-13T20:00:07.468789-05:00ComparisonBENCHMARKNO-EXECUTORFuture Overhead - Create Thread Hierarchical - Latch(=)InfoPropertyBeforeAfterHPX Datetime2023-05-10T12:07:53+00:002023-05-14T00:54:22+00:00HPX Commitdcb541576898d370113946ba15fb58c20c8325b27fe0f1542686848aaa62f21d395f1425600ae4c6EnvfileHostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduCompiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1ClusternamerostamrostamDatetime2023-05-10T14:52:35.047119-05:002023-05-13T20:02:21.454063-05:00ComparisonBENCHMARKFORK_JOIN_EXECUTOR_DEFAULT_FORK_JOIN_POLICY_ALLOCATORPARALLEL_EXECUTOR_DEFAULT_PARALLEL_POLICY_ALLOCATORSCHEDULER_EXECUTOR_DEFAULT_SCHEDULER_EXECUTOR_ALLOCATORStream Benchmark - Add(=)=(=)Stream Benchmark - Scale(=)(=)(=)Stream Benchmark - Triad(=)=(=)Stream Benchmark - Copy(=)(=)=InfoPropertyBeforeAfterHPX Datetime2023-05-10T12:07:53+00:002023-05-14T00:54:22+00:00HPX Commitdcb541576898d370113946ba15fb58c20c8325b27fe0f1542686848aaa62f21d395f1425600ae4c6EnvfileHostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduCompiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1ClusternamerostamrostamDatetime2023-05-10T14:52:52.237641-05:002023-05-13T20:02:38.749526-05:00Explanation of SymbolsSymbolMEANING=No performance change (confidence interval within ±1%)(=)Probably no performance change (confidence interval within ±2%)(+)/(-)Very small performance improvement/degradation (≤1%)+/-Small performance improvement/degradation (≤5%)++/--Large performance improvement/degradation (≤10%)+++/---Very large performance improvement/degradation (>10%)?Probably no change, but quite large uncertainty (confidence interval with ±5%)??Unclear result, very large uncertainty (±10%)???Something unexpected…

Performance test reportHPX PerformanceComparisonBENCHMARKFORK_JOIN_EXECUTORPARALLEL_EXECUTORSCHEDULER_EXECUTORFor Each(=)??-InfoPropertyBeforeAfterHPX Commitdcb541576898d370113946ba15fb58c20c8325b2e05101d8e017a4bbd6c67185e28038f8c3ebe954HPX Datetime2023-05-10T12:07:53+00:002023-05-14T15:03:02+00:00Datetime2023-05-10T14:50:18.616050-05:002023-05-14T10:10:08.240967-05:00EnvfileHostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduClusternamerostamrostamCompiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1ComparisonBENCHMARKNO-EXECUTORFuture Overhead - Create Thread Hierarchical - Latch=InfoPropertyBeforeAfterHPX Commitdcb541576898d370113946ba15fb58c20c8325b2e05101d8e017a4bbd6c67185e28038f8c3ebe954HPX Datetime2023-05-10T12:07:53+00:002023-05-14T15:03:02+00:00Datetime2023-05-10T14:52:35.047119-05:002023-05-14T10:12:22.649534-05:00EnvfileHostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduClusternamerostamrostamCompiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1ComparisonBENCHMARKFORK_JOIN_EXECUTOR_DEFAULT_FORK_JOIN_POLICY_ALLOCATORPARALLEL_EXECUTOR_DEFAULT_PARALLEL_POLICY_ALLOCATORSCHEDULER_EXECUTOR_DEFAULT_SCHEDULER_EXECUTOR_ALLOCATORStream Benchmark - Add(=)(=)(=)Stream Benchmark - Scale(=)(=)=Stream Benchmark - Triad(=)=(=)Stream Benchmark - Copy=(=)=InfoPropertyBeforeAfterHPX Commitdcb541576898d370113946ba15fb58c20c8325b2e05101d8e017a4bbd6c67185e28038f8c3ebe954HPX Datetime2023-05-10T12:07:53+00:002023-05-14T15:03:02+00:00Datetime2023-05-10T14:52:52.237641-05:002023-05-14T10:12:39.915258-05:00EnvfileHostnamemedusa08.rostam.cct.lsu.edumedusa08.rostam.cct.lsu.eduClusternamerostamrostamCompiler/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1/opt/apps/llvm/13.0.1/bin/clang++ 13.0.1Explanation of SymbolsSymbolMEANING=No performance change (confidence interval within ±1%)(=)Probably no performance change (confidence interval within ±2%)(+)/(-)Very small performance improvement/degradation (≤1%)+/-Small performance improvement/degradation (≤5%)++/--Large performance improvement/degradation (≤10%)+++/---Very large performance improvement/degradation (>10%)?Probably no change, but quite large uncertainty (confidence interval with ±5%)??Unclear result, very large uncertainty (±10%)???Something unexpected…

bors merge


Node.js support

Well there ya go :-)

Really appreciate your work!

No worries, I just changed uses of let to var, added bluebird's Promise and changed your use of startswith to the current es5 version :smile:


Udemy Course - 10 out of 15 chapters only downloaded

youtube-dl --cookies /Users/[user]/Downloads/udemy-cookies.txt -o '%(playlist)s/%(chapter_number)s - %(chapter)s/%(playlist_index)s. %(title)s.%(ext)s' [udemy course link]
Downloaded up until chapter 10. There are a total of 15 chapters.
Error:
Unable to download webpage: HTTP Error 403: Unauthorized (caused by HTTPError()); please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; type  youtube-dl -U  to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.

Bother to read the new issue template and fill in it appropriately.

I honestly dont understand all this. I'm not tech savvy.
Please help me. Excuse my ignorance in this field.

I would sincerely appreciate if you could help me out

I've already pointed out: read issue template and fill in.


bump meow and sax

this should fix the meow issues.

meow still fails

any idea why?

It works on my computer. Can you point me to where/what exactly is failing?

@joamatab , I re-ran the failing CI job for meow and it's passing now. Probably the 0.9.0 library was not yet published on pypi when I pushed this fix to gplugins.

Thank you Floris!


Removal of StringJsonServiceAccountConfig after oauth plugin upgrade.

Once upgrading to 0.8 version of the Google OAuth plugin is successful, we can remove StringJsonServiceAccountConfig and use the secret bytes with the JSONServiceAccountConfig directly.

Resolved by #91


Count the number of connections > users online

Hi guys,
I'm new in the world of the websockets and Ratchet.
I need to display, in my front, the number of users connected.
For me, it makes senses that this count as to be done when a new connection is open.
So...
public function onOpen(ConnectionInterface $conn)
{
        // ....

        $count = $this->clients->count() + 1;
        $conn->countClient = $count;
        $data = json_decode($count);

        $this->clients->attach($conn);

        echo "New connection! ({$conn->resourceId})\n";
}

What I struggle with, is to have this value in my front:
function connect() {

        var conn = new WebSocket('ws://localhost:8080?token={{ user.user_id }}');

        // OPEN THE CONNECTION
        conn.onopen = function (e) {
            console.log("Connection established!", );
        };
}

Thanks for you help and advices

Looks like you're half way there.
Think about events+actions; what triggers happen and how do you want to react to them.
Server side Event: Client connects
Action 1: Increment counter
Action 2: Notify all connections of new value
Server side Event: Client disconnects
Action 1: Decrement counter
Action 2: Notify all connections of new value
Client side Event: Receive new connection count value
Action: Update UI

@cboden I understand but I'm really new in the websocket planet.
Can you maybe give me more details ?


Destroyed savefile

If you have saved after a modded moon, the save file will be destroyed when the save file is loaded.

LogOutput.log

Seems to be fixed with version 1.1.6. Thanks.