added corr
This commit is contained in:
+27
-1
@@ -20,7 +20,7 @@ template<class T, template<typename ...> class VT>
|
||||
types::GetLongType<T>
|
||||
sum(const VT<T>& v) {
|
||||
types::GetLongType<T> ret = 0;
|
||||
for (const auto& _v : v)
|
||||
for (auto _v : v)
|
||||
ret += _v;
|
||||
return ret;
|
||||
}
|
||||
@@ -363,6 +363,32 @@ inline decayed_t<VT, types::GetFPType<types::GetLongType<T>>> vars(const VT<T>&
|
||||
return ret;
|
||||
}
|
||||
|
||||
template<class T, template<typename ...> class VT,
|
||||
class T2, template<typename ...> class VT2
|
||||
>
|
||||
auto corr(const VT<T>& x, const VT2<T2>&y) {
|
||||
typedef types::Coercion<decays<T>, decays<T2>> InnerType;
|
||||
typedef types::GetLongType<InnerType> LongType;
|
||||
typedef types::GetFPType<LongType> FPType;
|
||||
// assert(x.size == y.size);
|
||||
const uint32_t& len = x.size;
|
||||
LongType sx{0}, sy{0}, sxy{0}, sx2{0}, sy2{0};
|
||||
for (uint32_t i = 0; i < len; ++i){
|
||||
sx += x[i];
|
||||
sx2 += x[i] * x[i];
|
||||
sy += y[i];
|
||||
sxy += x[i] * y[i];
|
||||
sy2 += y[i] * y[i];
|
||||
}
|
||||
return (sxy - FPType(sx*sy))
|
||||
/
|
||||
(len * sqrt(
|
||||
(sx2 - FPType(sx*sx)/len) * (sy2 - FPType(sy*sy)/len)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
template<class T, template<typename ...> class VT>
|
||||
inline types::GetFPType<types::GetLongType<decays<T>>> stddev(const VT<T>& arr) {
|
||||
return sqrt(var(arr));
|
||||
|
||||
+1
-2
@@ -36,7 +36,7 @@ public:
|
||||
// reset scratch space to initial capacity.
|
||||
void cleanup();
|
||||
};
|
||||
|
||||
void fclose_gc(void*);
|
||||
|
||||
#ifndef __AQ_USE_THREADEDGC__
|
||||
class QUERY_DECLSPEC GC {
|
||||
@@ -103,7 +103,6 @@ public:
|
||||
}
|
||||
constexpr static void(*_free) (void*) = free;
|
||||
};
|
||||
|
||||
#else
|
||||
class GC {
|
||||
public:
|
||||
|
||||
@@ -635,3 +635,4 @@ get_procedure(Context* cxt, const char* name) {
|
||||
}
|
||||
|
||||
void* CreateNULLServer(Context*) { return nullptr; }
|
||||
void fclose_gc(void* fp) { fclose((FILE*)fp); }
|
||||
+6
-6
@@ -67,11 +67,11 @@ typedef void (*module_init_fn)(Context*);
|
||||
int n_recv = 0;
|
||||
char** n_recvd = nullptr;
|
||||
|
||||
__AQEXPORT__(void) wait_engine(){
|
||||
__AQEXPORT__(void) wait_engine() {
|
||||
PROMPT_ACQUIRE();
|
||||
}
|
||||
|
||||
__AQEXPORT__(void) wake_engine(){
|
||||
__AQEXPORT__(void) wake_engine() {
|
||||
ENGINE_RELEASE();
|
||||
}
|
||||
|
||||
@@ -108,7 +108,7 @@ have_hge() {
|
||||
Context* _g_cxt;
|
||||
|
||||
__AQEXPORT__(StoredProcedure)
|
||||
get_procedure_ex(const char* name){
|
||||
get_procedure_ex(const char* name) {
|
||||
return get_procedure(_g_cxt, name);
|
||||
}
|
||||
|
||||
@@ -134,13 +134,13 @@ void activate_callback_based_trigger(Context* context, const char* cmd)
|
||||
|
||||
// This function contains heap allocations, free after use
|
||||
template<class String_T>
|
||||
char* to_lpstr(const String_T& str){
|
||||
char* to_lpstr(const String_T& str) {
|
||||
auto ret = static_cast<char*>(malloc(str.size() + 1));
|
||||
memcpy(ret, str.c_str(), str.size());
|
||||
ret[str.size()] = '\0';
|
||||
return ret;
|
||||
}
|
||||
char* copy_lpstr(const char* str){
|
||||
char* copy_lpstr(const char* str) {
|
||||
auto len = strlen(str);
|
||||
auto ret = static_cast<char*>(malloc(len + 1));
|
||||
memcpy(ret, str, len + 1);
|
||||
@@ -639,7 +639,7 @@ extern "C" int __DLLEXPORT__ dllmain(int argc, char** argv) {
|
||||
cxt->log("ready: %s\n", ready? "true":"false");
|
||||
while (running) {
|
||||
std::this_thread::sleep_for(1ms);
|
||||
if(ready){
|
||||
if(ready) {
|
||||
cxt->log("running: %s\n", running? "true":"false");
|
||||
cxt->log("ready: %s\n", ready? "true":"false");
|
||||
void* handle = dlopen("./dll.so", RTLD_NOW);
|
||||
|
||||
@@ -355,7 +355,7 @@ public:
|
||||
inline vector_type<_Ty> subvec_deep(uint32_t start = 0) const { return subvec_deep(start, size); }
|
||||
vector_type<_Ty> getRef() { return vector_type<_Ty>(container, size); }
|
||||
~vector_type() {
|
||||
if (capacity > 0) GC::gc_handle->reg(container, sizeof(_Ty) * capacity);//free(container);
|
||||
if (capacity > 0) GC::gc_handle->reg(container, sizeof(_Ty) * capacity);//*/free(container);
|
||||
container = nullptr;
|
||||
size = capacity = 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user