Skip to content

Commit 5bd62c4

Browse files
committed
Add daft benchmark & fix tags
1 parent f1a971a commit 5bd62c4

File tree

7 files changed

+352
-1
lines changed

7 files changed

+352
-1
lines changed

daft-parquet/benchmark.sh

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#!/bin/bash
2+
3+
# Install
4+
sudo apt-get update
5+
sudo apt-get install -y python3-pip
6+
pip install --break-system-packages pandas
7+
pip install --break-system-packages packaging
8+
pip install --break-system-packages daft==0.4.9
9+
10+
# Use for Daft (Parquet, partitioned)
11+
# seq 0 99 | xargs -P100 -I{} bash -c 'wget --continue https://datasets.clickhouse.com/hits_compatible/athena_partitioned/hits_{}.parquet'
12+
13+
# Use for Daft (Parquet, single)
14+
wget --continue https://datasets.clickhouse.com/hits_compatible/athena/hits.parquet
15+
16+
# Run the queries
17+
./run.sh 2>&1 | tee daft_log.txt

daft-parquet/queries.sql

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
SELECT COUNT(*) FROM hits;
2+
SELECT COUNT(*) FROM hits WHERE AdvEngineID <> 0;
3+
SELECT SUM(AdvEngineID), COUNT(*), AVG(ResolutionWidth) FROM hits;
4+
SELECT AVG(UserID) FROM hits;
5+
SELECT COUNT(DISTINCT UserID) FROM hits;
6+
SELECT COUNT(DISTINCT SearchPhrase) FROM hits;
7+
SELECT MIN(EventDate) as m1, MAX(EventDate) as m2 FROM hits;
8+
SELECT AdvEngineID, COUNT(*) FROM hits WHERE AdvEngineID <> 0 GROUP BY AdvEngineID ORDER BY COUNT(*) DESC;
9+
SELECT RegionID, COUNT(DISTINCT UserID) AS u FROM hits GROUP BY RegionID ORDER BY u DESC LIMIT 10;
10+
SELECT RegionID, SUM(AdvEngineID), COUNT(*) AS c, AVG(ResolutionWidth), COUNT(DISTINCT UserID) FROM hits GROUP BY RegionID ORDER BY c DESC LIMIT 10;
11+
SELECT MobilePhoneModel, COUNT(DISTINCT UserID) AS u FROM hits WHERE MobilePhoneModel <> '' GROUP BY MobilePhoneModel ORDER BY u DESC LIMIT 10;
12+
SELECT MobilePhone, MobilePhoneModel, COUNT(DISTINCT UserID) AS u FROM hits WHERE MobilePhoneModel <> '' GROUP BY MobilePhone, MobilePhoneModel ORDER BY u DESC LIMIT 10;
13+
SELECT SearchPhrase, COUNT(*) AS c FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY c DESC LIMIT 10;
14+
SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10;
15+
SELECT SearchEngineID, SearchPhrase, COUNT(*) AS c FROM hits WHERE SearchPhrase <> '' GROUP BY SearchEngineID, SearchPhrase ORDER BY c DESC LIMIT 10;
16+
SELECT UserID, COUNT(*) FROM hits GROUP BY UserID ORDER BY COUNT(*) DESC LIMIT 10;
17+
SELECT UserID, SearchPhrase, COUNT(*) FROM hits GROUP BY UserID, SearchPhrase ORDER BY COUNT(*) DESC LIMIT 10;
18+
SELECT UserID, SearchPhrase, COUNT(*) FROM hits GROUP BY UserID, SearchPhrase LIMIT 10;
19+
SELECT UserID, extract(minute FROM EventTime) AS m, SearchPhrase, COUNT(*) FROM hits GROUP BY UserID, m, SearchPhrase ORDER BY COUNT(*) DESC LIMIT 10;
20+
SELECT UserID FROM hits WHERE UserID = 435090932899640449;
21+
SELECT COUNT(*) FROM hits WHERE URL LIKE '%google%';
22+
SELECT SearchPhrase, MIN(URL), COUNT(*) AS c FROM hits WHERE URL LIKE '%google%' AND SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY c DESC LIMIT 10;
23+
SELECT SearchPhrase, MIN(URL), MIN(Title), COUNT(*) AS c, COUNT(DISTINCT UserID) FROM hits WHERE Title LIKE '%Google%' AND URL NOT LIKE '%.google.%' AND SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY c DESC LIMIT 10;
24+
SELECT * FROM hits WHERE URL LIKE '%google%' ORDER BY EventTime LIMIT 10;
25+
SELECT SearchPhrase FROM hits WHERE SearchPhrase <> '' ORDER BY EventTime LIMIT 10;
26+
SELECT SearchPhrase FROM hits WHERE SearchPhrase <> '' ORDER BY SearchPhrase LIMIT 10;
27+
SELECT SearchPhrase FROM hits WHERE SearchPhrase <> '' ORDER BY EventTime, SearchPhrase LIMIT 10;
28+
SELECT CounterID, AVG(length(URL)) AS l, COUNT(*) AS c FROM hits WHERE URL <> '' GROUP BY CounterID HAVING COUNT(*) > 100000 ORDER BY l DESC LIMIT 25;
29+
SELECT REGEXP_REPLACE(Referer, '^https?://(?:www\.)?([^/]+)/.*$', '\1') AS k, AVG(length(Referer)) AS l, COUNT(*) AS c, MIN(Referer) as m FROM hits WHERE Referer <> '' GROUP BY k HAVING COUNT(*) > 100000 ORDER BY l DESC LIMIT 25;
30+
SELECT SUM(ResolutionWidth) AS s0, SUM(ResolutionWidth + 1) AS s1, SUM(ResolutionWidth + 2) AS s2, SUM(ResolutionWidth + 3) AS s3, SUM(ResolutionWidth + 4) AS s4, SUM(ResolutionWidth + 5) AS s5, SUM(ResolutionWidth + 6) AS s6, SUM(ResolutionWidth + 7) AS s7, SUM(ResolutionWidth + 8) AS s8, SUM(ResolutionWidth + 9) AS s9, SUM(ResolutionWidth + 10) AS s10, SUM(ResolutionWidth + 11) AS s11, SUM(ResolutionWidth + 12) AS s12, SUM(ResolutionWidth + 13) AS s13, SUM(ResolutionWidth + 14) AS s14, SUM(ResolutionWidth + 15) AS s15, SUM(ResolutionWidth + 16) AS s16, SUM(ResolutionWidth + 17) AS s17, SUM(ResolutionWidth + 18) AS s18, SUM(ResolutionWidth + 19) AS s19, SUM(ResolutionWidth + 20) AS s20, SUM(ResolutionWidth + 21) AS s21, SUM(ResolutionWidth + 22) AS s22, SUM(ResolutionWidth + 23) AS s23, SUM(ResolutionWidth + 24) AS s24, SUM(ResolutionWidth + 25) AS s25, SUM(ResolutionWidth + 26) AS s26, SUM(ResolutionWidth + 27) AS s27, SUM(ResolutionWidth + 28) AS s28, SUM(ResolutionWidth + 29) AS s29, SUM(ResolutionWidth + 30) AS s30, SUM(ResolutionWidth + 31) AS s31, SUM(ResolutionWidth + 32) AS s32, SUM(ResolutionWidth + 33) AS s33, SUM(ResolutionWidth + 34) AS s34, SUM(ResolutionWidth + 35) AS s35, SUM(ResolutionWidth + 36) AS s36, SUM(ResolutionWidth + 37) AS s37, SUM(ResolutionWidth + 38) AS s38, SUM(ResolutionWidth + 39) AS s39, SUM(ResolutionWidth + 40) AS s40, SUM(ResolutionWidth + 41) AS s41, SUM(ResolutionWidth + 42) AS s42, SUM(ResolutionWidth + 43) AS s43, SUM(ResolutionWidth + 44) AS s44, SUM(ResolutionWidth + 45) AS s45, SUM(ResolutionWidth + 46) AS s46, SUM(ResolutionWidth + 47) AS s47, SUM(ResolutionWidth + 48) AS s48, SUM(ResolutionWidth + 49) AS s49, SUM(ResolutionWidth + 50) AS s50, SUM(ResolutionWidth + 51) AS s51, SUM(ResolutionWidth + 52) AS s52, SUM(ResolutionWidth + 53) AS s53, SUM(ResolutionWidth + 54) AS s54, SUM(ResolutionWidth + 55) AS s55, SUM(ResolutionWidth + 56) AS s56, SUM(ResolutionWidth + 57) AS s57, SUM(ResolutionWidth + 58) AS s58, SUM(ResolutionWidth + 59) AS s59, SUM(ResolutionWidth + 60) AS s60, SUM(ResolutionWidth + 61) AS s61, SUM(ResolutionWidth + 62) AS s62, SUM(ResolutionWidth + 63) AS s63, SUM(ResolutionWidth + 64) AS s64, SUM(ResolutionWidth + 65) AS s65, SUM(ResolutionWidth + 66) AS s66, SUM(ResolutionWidth + 67) AS s67, SUM(ResolutionWidth + 68) AS s68, SUM(ResolutionWidth + 69) AS s69, SUM(ResolutionWidth + 70) AS s70, SUM(ResolutionWidth + 71) AS s71, SUM(ResolutionWidth + 72) AS s72, SUM(ResolutionWidth + 73) AS s73, SUM(ResolutionWidth + 74) AS s74, SUM(ResolutionWidth + 75) AS s75, SUM(ResolutionWidth + 76) AS s76, SUM(ResolutionWidth + 77) AS s77, SUM(ResolutionWidth + 78) AS s78, SUM(ResolutionWidth + 79) AS s79, SUM(ResolutionWidth + 80) AS s80, SUM(ResolutionWidth + 81) AS s81, SUM(ResolutionWidth + 82) AS s82, SUM(ResolutionWidth + 83) AS s83, SUM(ResolutionWidth + 84) AS s84, SUM(ResolutionWidth + 85) AS s85, SUM(ResolutionWidth + 86) AS s86, SUM(ResolutionWidth + 87) AS s87, SUM(ResolutionWidth + 88) AS s88, SUM(ResolutionWidth + 89) AS s89 FROM hits;
31+
SELECT SearchEngineID, ClientIP, COUNT(*) AS c, SUM(IsRefresh), AVG(ResolutionWidth) FROM hits WHERE SearchPhrase <> '' GROUP BY SearchEngineID, ClientIP ORDER BY c DESC LIMIT 10;
32+
SELECT WatchID, ClientIP, COUNT(*) AS c, SUM(IsRefresh), AVG(ResolutionWidth) FROM hits WHERE SearchPhrase <> '' GROUP BY WatchID, ClientIP ORDER BY c DESC LIMIT 10;
33+
SELECT WatchID, ClientIP, COUNT(*) AS c, SUM(IsRefresh), AVG(ResolutionWidth) FROM hits GROUP BY WatchID, ClientIP ORDER BY c DESC LIMIT 10;
34+
SELECT URL, COUNT(*) AS c FROM hits GROUP BY URL ORDER BY c DESC LIMIT 10;
35+
SELECT 1, URL, COUNT(*) AS c FROM hits GROUP BY 1, URL ORDER BY c DESC LIMIT 10;
36+
SELECT ClientIP, ClientIP - 1, ClientIP - 2, ClientIP - 3, COUNT(*) AS c FROM hits GROUP BY ClientIP, ClientIP - 1, ClientIP - 2, ClientIP - 3 ORDER BY c DESC LIMIT 10;
37+
SELECT URL, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND DontCountHits = 0 AND IsRefresh = 0 AND URL <> '' GROUP BY URL ORDER BY PageViews DESC LIMIT 10;
38+
SELECT Title, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND DontCountHits = 0 AND IsRefresh = 0 AND Title <> '' GROUP BY Title ORDER BY PageViews DESC LIMIT 10;
39+
SELECT URL, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND IsRefresh = 0 AND IsLink <> 0 AND IsDownload = 0 GROUP BY URL ORDER BY PageViews DESC LIMIT 1010;
40+
SELECT TraficSourceID, SearchEngineID, AdvEngineID, CASE WHEN (SearchEngineID = 0 AND AdvEngineID = 0) THEN Referer ELSE '' END AS Src, URL AS Dst, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND IsRefresh = 0 GROUP BY TraficSourceID, SearchEngineID, AdvEngineID, Src, Dst ORDER BY PageViews DESC LIMIT 1010;
41+
SELECT URLHash, EventDate, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND IsRefresh = 0 AND TraficSourceID IN (-1, 6) AND RefererHash = 3594120000172545465 GROUP BY URLHash, EventDate ORDER BY PageViews DESC LIMIT 110;
42+
SELECT WindowClientWidth, WindowClientHeight, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-01' AND EventDate <= '2013-07-31' AND IsRefresh = 0 AND DontCountHits = 0 AND URLHash = 2868770270353813622 GROUP BY WindowClientWidth, WindowClientHeight ORDER BY PageViews DESC LIMIT 10010;
43+
SELECT DATE_TRUNC('minute', EventTime) AS M, COUNT(*) AS PageViews FROM hits WHERE CounterID = 62 AND EventDate >= '2013-07-14' AND EventDate <= '2013-07-15' AND IsRefresh = 0 AND DontCountHits = 0 GROUP BY DATE_TRUNC('minute', EventTime) ORDER BY DATE_TRUNC('minute', EventTime) LIMIT 1010;

daft-parquet/query.py

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
#!/usr/bin/env python3
2+
3+
import daft
4+
import timeit
5+
import traceback
6+
import pandas as pd
7+
from daft import col, DataType, TimeUnit
8+
from pathlib import Path
9+
10+
hits = None
11+
12+
with open("queries.sql") as f:
13+
sql_list = [q.strip() for q in f.read().split(';') if q.strip()]
14+
15+
def daft_offset(df, start ,end):
16+
pandas_df = df.to_pandas()
17+
sliced_df = pandas_df.iloc[start:end]
18+
return sliced_df
19+
20+
queries = []
21+
for idx, sql in enumerate(sql_list):
22+
query_entry = {"sql": sql}
23+
24+
if idx+1 in [19, 36, 43]:
25+
if idx+1 == 19:
26+
query_entry["lambda"] = lambda: (
27+
hits.with_column("m", col("EventTime").dt.minute())
28+
.groupby("UserID", "m", "SearchPhrase")
29+
.agg(daft.sql_expr("COUNT(1)").alias("COUNT(*)"))
30+
.sort("COUNT(*)", desc=True)
31+
.limit(10)
32+
.select("UserID", "m", "SearchPhrase", "COUNT(*)")
33+
)
34+
elif idx+1 == 36:
35+
query_entry["lambda"] = lambda: (
36+
hits.groupby(
37+
"ClientIP",
38+
daft.sql_expr("ClientIP - 1").alias("ClientIP - 1"),
39+
daft.sql_expr("ClientIP - 2").alias("ClientIP - 2"),
40+
daft.sql_expr("ClientIP - 3").alias("ClientIP - 3"))
41+
.agg(daft.sql_expr("COUNT(1)").alias("c"))
42+
.sort("c", desc=True)
43+
.limit(10)
44+
.select("ClientIP", "ClientIP - 1", "ClientIP - 2", "ClientIP - 3", "c")
45+
)
46+
elif idx+1 == 43:
47+
query_entry["lambda"] = lambda: (
48+
hits.with_column("M", col("EventTime").dt.truncate("1 minute"))
49+
.where("CounterID = 62 AND EventDate >= '2013-07-14' AND EventDate <= '2013-07-15' AND IsRefresh = 0 AND DontCountHits = 0")
50+
.groupby("M")
51+
.agg(daft.sql_expr("COUNT(1)").alias("PageViews"))
52+
.sort("M", desc=False)
53+
.limit(1010)
54+
.select("M", "PageViews")
55+
)
56+
57+
if 39 <= idx+1 <= 43:
58+
if idx+1 == 39:
59+
query_entry["extra_api"] = lambda df: daft_offset(df, 1000, 1010)
60+
elif idx+1 == 40:
61+
query_entry["extra_api"] = lambda df: daft_offset(df, 1000, 1010)
62+
elif idx+1 == 41:
63+
query_entry["extra_api"] = lambda df: daft_offset(df, 100, 110)
64+
elif idx+1 == 42:
65+
query_entry["extra_api"] = lambda df: daft_offset(df, 10000, 10010)
66+
elif idx+1 == 43:
67+
query_entry["extra_api"] = lambda df: daft_offset(df, 1000, 1010)
68+
69+
queries.append(query_entry)
70+
71+
def run_single_query(query, i):
72+
try:
73+
start = timeit.default_timer()
74+
75+
global hits
76+
if hits is None:
77+
# Use for Daft (Parquet, partitioned)
78+
# Use absolute path when using wildcards
79+
# hits = daft.read_parquet("/path/to/hits_*.parquet")
80+
81+
# Use for Daft (Parquet, single)
82+
hits = daft.read_parquet("hits.parquet")
83+
hits = hits.with_column("EventTime", col("EventTime").cast(daft.DataType.timestamp("s")))
84+
hits = hits.with_column("EventDate", col("EventDate").cast(daft.DataType.date()))
85+
hits = hits.with_column("URL", col("URL").decode("utf-8"))
86+
hits = hits.with_column("Title", col("Title").decode("utf-8"))
87+
hits = hits.with_column("Referer", col("Referer").decode("utf-8"))
88+
hits = hits.with_column("MobilePhoneModel", col("MobilePhoneModel").decode("utf-8"))
89+
hits = hits.with_column("SearchPhrase", col("SearchPhrase").decode("utf-8"))
90+
91+
result = None
92+
93+
if "lambda" in query:
94+
result = query["lambda"]()
95+
else:
96+
result = daft.sql(query["sql"])
97+
98+
result.collect()
99+
100+
if "extra_api" in query:
101+
result = query["extra_api"](result)
102+
103+
run_time = timeit.default_timer() - start
104+
105+
return run_time
106+
except Exception as e:
107+
print(f"Error executing query {query_idx+1}: {str(e)[:100]}", file=sys.stderr)
108+
traceback.print_exc()
109+
return None
110+
111+
if __name__ == "__main__":
112+
import sys
113+
query_idx = int(sys.argv[1]) - 1
114+
query = queries[query_idx]
115+
116+
times = []
117+
for i in range(3):
118+
elapsed = run_single_query(query, i)
119+
times.append(f"{elapsed}" if elapsed else "")
120+
121+
print(','.join(times))
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
{
2+
"system": "Daft (Parquet, partitioned)",
3+
"date": "2025-04-10",
4+
"machine": "c6a.4xlarge, 500gb gp2",
5+
"cluster_size": 1,
6+
"comment": "",
7+
"tags": [
8+
"Rust",
9+
"stateless",
10+
"serverless",
11+
"embedded",
12+
"dataframe"
13+
],
14+
"load_time": 0,
15+
"data_size": 14779976446,
16+
"result": [
17+
[2.9239969809987088,0.24281721499937703,0.25061354499848676],
18+
[2.943689669999003,0.24701748600091378,0.2412866730010137],
19+
[3.3013779040011286,0.3499440380001033,0.34748943700105883],
20+
[0.5240946279991476,0.14416759599953366,0.14079303099970275],
21+
[8.358806038000694,8.191848701000708,8.301089013999444],
22+
[7.3857230829999025,7.083538949000285,6.779509707001125],
23+
[0.44852974800051015,0.09936009000011836,0.09527912199882849],
24+
[2.9437991849990794,0.24986934899970947,0.249939440000162],
25+
[3.2667164159993263,2.9141958559994237,2.997278159000416],
26+
[6.341243853001288,2.2626934529998834,2.3228578489997744],
27+
[1.1101171179998346,0.8267360560002999,0.7852608660014084],
28+
[1.1224606880005012,0.8311700009999186,0.799573213000258],
29+
[5.719661522000024,2.2495632319987635,2.2330354629993963],
30+
[3.9945796060001157,2.910399188000156,2.8959377400005906],
31+
[5.794290511999861,2.249771316000988,2.2831605970004603],
32+
[6.017177588000777,2.6195074140014185,2.6053394909995404],
33+
[9.390984196999852,5.380491128000358,5.675109460000385],
34+
[7.000278958999843,2.909169999000369,2.9183442980011023],
35+
[10.517328523001197,9.270337152998763,9.211842022999917],
36+
[0.4838494970008469,0.13263488300071913,0.13043909699990763],
37+
[13.509324963999461,2.8007291499998246,2.7599115609991713],
38+
[15.182025014000828,3.0815161779992195,3.0070982840006764],
39+
[25.465576216000045,7.294880023000587,7.23245921400121],
40+
[55.77252582199981,14.482481478000409,14.470004283999515],
41+
[5.588168801001302,3.3266251870009,3.264028256000529],
42+
[11.422374611000123,11.096233861000655,11.42879000799985],
43+
[8.442051498999717,6.437731754000197,6.3204276689994],
44+
[13.50050955000006,4.382914202000393,4.389906216998497],
45+
[54.93292986199958,54.7095186509996,54.55201650199888],
46+
[1.810280910000074,1.694118317000175,1.718246561000342],
47+
[6.6975024990006204,1.7159326830005739,1.6963492020004196],
48+
[7.2224263429998246,2.2286510949998046,2.2376933390005433],
49+
[14.639526433000356,12.763357517000259,12.641049649000706],
50+
[20.836833830000614,12.953915013998994,13.191902100001244],
51+
[19.975888697999835,12.617277572000603,12.521102639999299],
52+
[2.9711594529999275,2.7580122080016736,2.77822500900038],
53+
[0.7095541710004909,0.3223742640002456,0.2954207420007151],
54+
[0.5843301879995124,0.15686079099941708,0.14083533799930592],
55+
[0.6433542939994368,0.16117779100022744,0.14962360200115654],
56+
[0.9204736569990928,0.4168329120002454,0.4444124349993217],
57+
[0.5595925659999921,0.10117537899895979,0.09999015900029917],
58+
[0.5403744819996064,0.09798703699925682,0.09515768100027344],
59+
[0.5390828099989449,0.08939602699865645,0.08288451900079963]
60+
]
61+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
{
2+
"system": "Daft (Parquet, single)",
3+
"date": "2025-04-10",
4+
"machine": "c6a.4xlarge, 500gb gp2",
5+
"cluster_size": 1,
6+
"comment": "",
7+
"tags": [
8+
"Rust",
9+
"stateless",
10+
"serverless",
11+
"embedded",
12+
"dataframe"
13+
],
14+
"load_time": 0,
15+
"data_size": 14779976446,
16+
"result": [
17+
[3.7661174910008413,0.24369674700028554,0.2084103370016237],
18+
[3.875728433000404,0.2710822070002905,0.2448596260001068],
19+
[4.437644478999573,0.37059677300021576,0.3738455969996721],
20+
[1.7555348349997075,0.1765103719990293,0.16613175199927355],
21+
[9.246005683000476,8.021207697000136,7.9671034419989155],
22+
[8.395427339999515,6.894040901999688,6.937520977000531],
23+
[0.3870741339997039,0.12874933700004476,0.11846869800137938],
24+
[4.032850421999683,0.27275637599996116,0.27422388899867656],
25+
[4.48173838799994,2.9867709099999047,2.9398520889990323],
26+
[7.820063309000034,2.3338501990001532,2.297853408001174],
27+
[2.550961462000487,0.831118198000695,0.8376970059998712],
28+
[2.6340099579992966,0.8703369129998464,0.8628015900012542],
29+
[6.752234794999822,2.222958735999782,2.232471744000577],
30+
[5.255753490000643,2.9050689529994997,2.930579284000487],
31+
[6.612870382001347,2.2050894149997475,2.23886461300026],
32+
[6.808695531000922,2.6192918489996373,2.6568191360001947],
33+
[10.58538459600095,5.351642343999629,5.352705452000009],
34+
[8.140032625000458,2.8994017459990573,2.8980922949995147],
35+
[11.584158911999111,9.256097968000176,9.276376194000477],
36+
[1.5025645540008554,0.19396826999945915,0.17483294299927366],
37+
[13.306670707999729,2.671392956001,2.641569294000874],
38+
[14.934801787001561,2.7154280849990755,2.688567492999937],
39+
[25.46551972100133,5.02428535099898,4.921547977000955],
40+
[63.64726643300128,24.418693142999473,24.98236643400014],
41+
[6.463048370998877,3.3630810270005895,3.1713167640009488],
42+
[12.681365424999967,10.957809773999543,11.052705301999595],
43+
[9.517097973999626,6.553240066999933,6.373768290999578],
44+
[13.353289077998852,4.344104071999027,4.224701305000053],
45+
[55.07765850400028,54.390547955999864,54.564625152999724],
46+
[1.9125421499993536,1.7788892349999514,1.8072454829998605],
47+
[8.256591348999791,1.7278820299998188,1.7305858340005216],
48+
[8.80483117300173,2.2188438910015975,2.2703534689990192],
49+
[16.096305291001045,13.049876507999215,12.798272336000082],
50+
[20.626275730000998,12.63391932200102,12.84786659099882],
51+
[19.942403981998723,12.12704556800054,12.179334143000233],
52+
[3.1018452330008586,2.8029017110002314,2.8341677140015236],
53+
[0.7097889510005189,0.33531982000022253,0.31982642600087274],
54+
[0.5140427599999384,0.1496123090000765,0.13467889399908017],
55+
[0.6331659280003805,0.1702573789989401,0.1500775069998781],
56+
[1.011886082998899,0.42512062800051353,0.4513590800015663],
57+
[0.4912343949999922,0.1039613590000954,0.08932384900072066],
58+
[0.46491453100134095,0.08819261000098777,0.08146828899953107],
59+
[0.38542473499910557,0.08088228899941896,0.07185498099897814]
60+
]
61+
}

0 commit comments

Comments
 (0)