diff --git a/studies/study_018/README.md b/studies/study_018/README.md new file mode 100644 index 0000000..20a9a3f --- /dev/null +++ b/studies/study_018/README.md @@ -0,0 +1,7 @@ +# An Experimental Study of Decentralized Matching + +This HumanStudy-Hub package was reconstructed from a published paper. + +- Review `study.json` for the study overview and readiness status. +- Review `audit/missing_information.json` before running the study. +- Run `python task/adapter.py --smoke-test` to check the package entry point. diff --git a/studies/study_018/audit/missing_information.json b/studies/study_018/audit/missing_information.json new file mode 100644 index 0000000..103244d --- /dev/null +++ b/studies/study_018/audit/missing_information.json @@ -0,0 +1,55 @@ +{ + "_description": "Authoritative researcher checklist. Each entry names a place where this package could not, or by design does not, perfectly reproduce the original study, why, and what a researcher should decide or do next.", + "study": "decentralized_matching_experiment", + "entries": [ + { + "study": "decentralized_matching_experiment", + "field": "task.timing_discretization", + "reason": "The original market runs in continuous real time (10-second offer-response window; 30-second end-of-market inactivity window). A turn-based agent harness has no wall clock, so task/adapter.py discretizes both into a random-draw tick model (see task/task.json 'timing_discretization').", + "impact": "Qualitative properties are preserved (full information, free asynchronous-order offers, tentative matches, no scripted turn order), but exact real-time race conditions (e.g. two participants acting within the same second) cannot occur, and the mapping from 'ticks' to seconds is a modeling choice, not measured data. inactivity_ticks/max_ticks are set heuristically (task.json defaults) and have not been calibrated against the paper's empirical offer-rate distributions (Table 5).", + "suggested_action": "If precise convergence-time comparisons to Table 5 (minutes to final matching) matter, calibrate inactivity_ticks/max_ticks against the paper's reported offers-per-minute figures, or extend adapter.py with an explicit simulated clock rather than a tick counter." + }, + { + "study": "decentralized_matching_experiment", + "field": "materials.instructions_script (unilateral and large arms)", + "reason": "The uploaded open materials (input/open_materials/instructions.pdf) contain the verbatim instruction slides only for the main 8-per-side, both-sides-propose treatment. The paper states the auxiliary treatments 'operated as in our main treatments' with the stated size/proposing-rule change, but does not reproduce their exact slide wording.", + "impact": "task/adapter.py's build_instructions() derives unilateral/large instruction text by substituting the group-size number and inserting a proposing-rule sentence for unilateral arms (evidence_label='derived', see materials/materials.json and materials/instructions_script.json 'not_covered_by_this_script'). This is a plausible but not verbatim adaptation.", + "suggested_action": "If the researcher has the original unilateral/large-market instruction slides, replace build_instructions()'s substitution logic with the verbatim text for those arms." + }, + { + "study": "decentralized_matching_experiment", + "field": "evaluation.median_classification_large_markets", + "reason": "evaluation.py classifies final matchings as median/food-optimal/color-optimal by brute-force enumeration of all stable matchings (permutation search), which is only tractable up to n_per_side<=9 (MAX_ENUMERABLE_N). The two 'large' arms use n_per_side=15.", + "impact": "For large_unique_sm and large_three_stable, evaluate() reports market- and pair-level stability (blocking-pair counts) correctly, but the 'median_and_extremal_classification' block is skipped for those two arms and reports a 'skipped_reason' instead of numbers. This means the paper's most striking large-market finding (every 3-stable-partner agent in large markets matches with their median stable partner) cannot currently be checked by this package.", + "suggested_action": "Implement a polynomial-time stable-matching-lattice / rotation-poset enumeration algorithm (e.g. Irving-Leather rotations) in evaluation.py to replace brute-force permutation search for n>9, or compute food-/color-optimal matchings via the already-implemented deferred_acceptance() and median status via a lattice-based algorithm without full enumeration." + }, + { + "study": "decentralized_matching_experiment", + "field": "evaluation.dynamic_model_benchmarks", + "reason": "The paper compares experimental dynamics against four simulated theoretical algorithms (2RDA, DACC, RPS, RBR; Tables 7-8) and against conditional-logit regressions of offer targeting (Tables 6, 9, A5-A7). These are substantial separate analyses beyond the core stability/median outcome measures.", + "impact": "This package's evaluate() does not reimplement those baseline algorithms or regressions, so it cannot reproduce Tables 6-9's specific comparisons (e.g. offers-to-blocking-partners over time, match-level cycle counts vs. RPS/RBR simulations).", + "suggested_action": "If needed, add a separate analysis module that (a) replays the same payoff matrices through 2RDA/DACC/RPS/RBR (algorithm descriptions are in the paper's Online Appendix, input/open_materials/paper/matching_experiment_appendix.pdf, Section on 'Comparison with Dynamic Models') and (b) fits the same conditional-logit specification to the events log evaluate() already receives." + }, + { + "study": "decentralized_matching_experiment", + "field": "task.conditions (payoff_treatment_index defaults)", + "reason": "The paper ran 140 experimental markets across 31 cardinal payoff treatments per Table 1; this package's task.json wires each of its 8 arms to one representative treatment (chosen, where possible, so a bilateral arm and its unilateral counterpart use the *same* underlying cardinal matrix). All 31 treatments are transcribed verbatim in materials/payoff_matrices_verbatim.json.", + "impact": "Running this package's default 8 arms will not, by itself, reproduce the paper's full cardinal-representation comparisons (e.g. Table 3's four 5-stable-matching cardinal variants, or the two-alignment/generic-correlation unique-SM variants).", + "suggested_action": "To replicate a specific cardinal comparison from the paper, add further arms to task.json's 'conditions' list pointing payoff_treatment_index at the desired treatment index (1-31); no code change to adapter.py is required." + }, + { + "study": "decentralized_matching_experiment", + "field": "task.run_sessions sample size", + "reason": "The paper's headline percentages (e.g. 88.24% of main-treatment markets stable) are computed over 85/43/12 real experimental markets across many sessions of human subjects. run_sessions(llm, seed, n) lets a researcher choose n sessions per arm at run time; it does not hard-code or guarantee the paper's original sample sizes.", + "impact": "Small n (e.g. the n=1 used by --smoke-test) will produce noisy, non-representative estimates; evaluation.py's 'notes' field says so explicitly on every call.", + "suggested_action": "Run with a larger n (e.g. n>=10-20 per arm) before treating evaluate()'s output as informative about a given model's tendency to reach stability/median outcomes." + }, + { + "study": "decentralized_matching_experiment", + "field": "source.participant_population", + "reason": "Original participants were UCLA undergraduates recruited through CASSEL; the paper reports no demographic breakdown beyond that, and average/SD payments per treatment (source/evidence.json:design_lab_and_subjects).", + "impact": "This package cannot condition simulated agents on the original subject pool's demographics because none beyond 'UCLA undergraduate, lab-experiment-experienced' were reported; all simulated agents are otherwise-undifferentiated instances of the injected model.", + "suggested_action": "No action possible without additional demographic data from the authors; treat any injected model as a stand-in for 'an incentivized lab participant', not a specific population." + } + ] +} diff --git a/studies/study_018/evaluation/__pycache__/evaluation.cpython-311.pyc b/studies/study_018/evaluation/__pycache__/evaluation.cpython-311.pyc new file mode 100644 index 0000000..500730a Binary files /dev/null and b/studies/study_018/evaluation/__pycache__/evaluation.cpython-311.pyc differ diff --git a/studies/study_018/evaluation/evaluation.py b/studies/study_018/evaluation/evaluation.py new file mode 100644 index 0000000..fdd13b6 --- /dev/null +++ b/studies/study_018/evaluation/evaluation.py @@ -0,0 +1,313 @@ +"""Evaluation for the decentralized two-sided matching-market experiment. + +evaluate(sessions) derives every metric directly from the session logs returned by +task/adapter.py's run_sessions() -- no separate data file, no pre-aggregation. It +reproduces (on whatever data the agents actually generate) the paper's headline +outcome measures: market-level and pair-level stability rates, and, for market +structures small enough to enumerate exactly (n_per_side <= 9, i.e. all of this +package's 'main' and 'unilateral' arms), the share of stable matchings/matches that +are the median, food-optimal, or color-optimal stable outcome (paper Tables 2-4). +""" + +import itertools +from collections import defaultdict + +MAX_ENUMERABLE_N = 9 # 9! = 362,880 permutations; brute-force enumeration is fast up to here + + +def _payoff(matrix, f, c): + ci = int(c.split("-")[1]) - 1 + return matrix[f][ci][0], matrix[f][ci][1] + + +def blocking_pairs(matrix, matching, foods, colors): + """matching: food -> color or None. Returns list of (f, c) blocking pairs.""" + rev = {c: f for f, c in matching.items() if c} + blockers = [] + for f in foods: + cur_c = matching.get(f) + f_cur_pay = _payoff(matrix, f, cur_c)[0] if cur_c else -1 + for c in colors: + if c == cur_c: + continue + f_pay, c_pay = _payoff(matrix, f, c) + if f_pay > f_cur_pay: + other_f = rev.get(c) + c_cur_pay = _payoff(matrix, other_f, c)[1] if other_f else -1 + if c_pay > c_cur_pay: + blockers.append((f, c)) + return blockers + + +def deferred_acceptance(matrix, foods, colors, proposing_side): + """Standard Gale-Shapley DA. proposing_side: 'food' or 'color'. Returns a matching + dict food->color (proposer-optimal for the given proposing side).""" + n = len(foods) + if proposing_side == "food": + prefs = {f: sorted(colors, key=lambda c: -_payoff(matrix, f, c)[0]) for f in foods} + next_idx = {f: 0 for f in foods} + held = {} # color -> food currently held + free = list(foods) + while free: + f = free.pop() + if next_idx[f] >= n: + continue + c = prefs[f][next_idx[f]] + next_idx[f] += 1 + if c not in held: + held[c] = f + else: + incumbent = held[c] + f_pay = _payoff(matrix, f, c)[1] + inc_pay = _payoff(matrix, incumbent, c)[1] + if f_pay > inc_pay: + held[c] = f + free.append(incumbent) + else: + free.append(f) + return {f: c for c, f in held.items()} + else: + prefs = {c: sorted(foods, key=lambda f: -_payoff(matrix, f, c)[1]) for c in colors} + next_idx = {c: 0 for c in colors} + held = {} # food -> color currently held + free = list(colors) + while free: + c = free.pop() + if next_idx[c] >= n: + continue + f = prefs[c][next_idx[c]] + next_idx[c] += 1 + if f not in held: + held[f] = c + else: + incumbent = held[f] + c_pay = _payoff(matrix, f, c)[0] + inc_pay = _payoff(matrix, f, incumbent)[0] + if c_pay > inc_pay: + held[f] = c + free.append(incumbent) + else: + free.append(c) + return dict(held) + + +def _is_stable(matrix, matching, foods, colors): + return len(blocking_pairs(matrix, matching, foods, colors)) == 0 + + +def enumerate_stable_matchings(matrix, foods, colors): + """Brute-force enumeration by permutation search. Only called for n <= MAX_ENUMERABLE_N.""" + n = len(foods) + stable = [] + for perm in itertools.permutations(range(n)): + matching = {foods[i]: colors[perm[i]] for i in range(n)} + if _is_stable(matrix, matching, foods, colors): + stable.append(matching) + return stable + + +def classify_matching(matching, stable_matchings, foods, colors, matrix): + """Classify a (stable) matching as median / food_optimal / color_optimal / other, + given the full enumerated set of stable matchings. Returns one of those 4 labels, + or None if `matching` is not itself stable / not in the enumerated set.""" + if not stable_matchings or matching not in stable_matchings: + return None + # food-optimal: matching each food to its best stable partner (by food payoff) + food_optimal = {} + color_optimal = {} + for f in foods: + best_c, best_pay = None, -1 + worst_c, worst_pay = None, 10 ** 9 + for sm in stable_matchings: + c = sm[f] + pay = _payoff(matrix, f, c)[0] + if pay > best_pay: + best_pay, best_c = pay, c + if pay < worst_pay: + worst_pay, worst_c = pay, c + food_optimal[f] = best_c + color_optimal[f] = worst_c # food's worst partner = color-optimal outcome for that food + if matching == food_optimal: + return "food_optimal" + if matching == color_optimal: + return "color_optimal" + # median: each agent matched to the median-ranked partner among its stable partners + is_median = True + for f in foods: + partners = sorted({sm[f] for sm in stable_matchings}, key=lambda c: -_payoff(matrix, f, c)[0]) + median_partner = partners[(len(partners) - 1) // 2] if len(partners) % 2 == 1 else None + if median_partner is None or matching[f] != median_partner: + is_median = False + break + if is_median: + return "median" + return "non_extremal_non_median" + + +def _agent_stable_partner_rank(matrix, foods, colors, stable_matchings, matched_food, matched_color, side, agent): + """Return 'best'/'median'/'worst'/None classification of `matched_color` (or food) + among `agent`'s own set of stable partners, from `agent`'s own preference order.""" + if side == "food": + partners = sorted({sm[agent] for sm in stable_matchings}, key=lambda c: -_payoff(matrix, agent, c)[0]) + target = matched_color + else: + partners = sorted({f for f in foods if any(sm[f] == agent for sm in stable_matchings)}, + key=lambda f: -_payoff(matrix, f, agent)[1]) + target = matched_food + if target not in partners: + return None + idx = partners.index(target) + if idx == 0: + return "best" + if idx == len(partners) - 1 and len(partners) > 1: + return "worst" + if len(partners) % 2 == 1 and idx == (len(partners) - 1) // 2: + return "median" + return "other_stable" + + +def evaluate(sessions): + if not sessions: + return {"not_ready": {"reason": "no sessions provided"}} + + by_arm = defaultdict(list) + for s in sessions: + by_arm[s["arm"]].append(s) + + arm_results = {} + for arm, arm_sessions in by_arm.items(): + n = arm_sessions[0]["n_per_side"] + foods = ["food-%d" % (i + 1) for i in range(n)] + colors = ["color-%d" % (j + 1) for j in range(n)] + + n_markets = len(arm_sessions) + n_stable_markets = 0 + pair_stability_ratios = [] + unmatched_fracs = [] + offers_per_market = [] + ticks_per_market = [] + parse_fallback_count = 0 + total_events = 0 + median_share_market = [] + food_optimal_share_market = [] + color_optimal_share_market = [] + median_share_match = 0 + food_optimal_share_match = 0 + color_optimal_share_match = 0 + classified_matches = 0 + enumeration_skipped = n > MAX_ENUMERABLE_N + + for s in arm_sessions: + matrix = s["payoff_matrix"] + matching = s["final_matching"] + offers = [e for e in s["events"] if e["action"] == "OFFER"] + offers_per_market.append(len(offers)) + ticks_per_market.append(s["n_ticks_used"]) + total_events += len(s["events"]) + parse_fallback_count += sum(1 for e in s["events"] if e.get("parse_fallback") or e.get("response_parse_fallback")) + + bp = blocking_pairs(matrix, matching, foods, colors) + is_stable = len(bp) == 0 + if is_stable: + n_stable_markets += 1 + n_pairs = sum(1 for v in matching.values() if v) + n_agents_in_bp = len({a for pair in bp for a in pair}) + pair_stability_ratio = 1.0 if n_pairs == 0 else 1 - (n_agents_in_bp / (2 * n)) + pair_stability_ratios.append(pair_stability_ratio) + unmatched_fracs.append(1 - n_pairs / n) + + if not enumeration_skipped: + stable_matchings = enumerate_stable_matchings(matrix, foods, colors) + if is_stable and stable_matchings: + label = classify_matching(matching, stable_matchings, foods, colors, matrix) + median_share_market.append(1 if label == "median" else 0) + food_optimal_share_market.append(1 if label == "food_optimal" else 0) + color_optimal_share_market.append(1 if label == "color_optimal" else 0) + for f, c in matching.items(): + if not c: + continue + classified_matches += 1 + rank = _agent_stable_partner_rank(matrix, foods, colors, stable_matchings, f, c, "food", f) + # a stable *match* is one where both f and c are mutually stable partners in some sm + is_stable_pair = any(sm[f] == c for sm in stable_matchings) + if is_stable_pair: + if rank == "median": + median_share_match += 1 + elif rank == "best": + food_optimal_share_match += 1 + elif rank == "worst": + color_optimal_share_match += 1 + + arm_results[arm] = { + "n_markets": n_markets, + "n_per_side": n, + "pct_markets_stable": 100.0 * n_stable_markets / n_markets, + "avg_pct_pairs_without_blocking_partner": 100.0 * sum(pair_stability_ratios) / n_markets, + "avg_pct_unmatched_agents": 100.0 * sum(unmatched_fracs) / n_markets, + "avg_n_offers_per_market": sum(offers_per_market) / n_markets, + "avg_n_ticks_per_market": sum(ticks_per_market) / n_markets, + "parse_fallback_rate": (parse_fallback_count / total_events) if total_events else 0.0, + "median_and_extremal_classification": ( + { + "skipped_reason": "n_per_side=%d exceeds brute-force enumeration cap (%d); exact stable-matching" + " set, and hence median/extremal classification, is not computed for this arm." + " See audit/missing_information.json:'median_classification_large_markets'." % (n, MAX_ENUMERABLE_N) + } if enumeration_skipped else { + "pct_of_stable_markets_that_are_median": ( + 100.0 * sum(median_share_market) / len(median_share_market) if median_share_market else None + ), + "pct_of_stable_markets_that_are_food_optimal": ( + 100.0 * sum(food_optimal_share_market) / len(food_optimal_share_market) if food_optimal_share_market else None + ), + "pct_of_stable_markets_that_are_color_optimal": ( + 100.0 * sum(color_optimal_share_market) / len(color_optimal_share_market) if color_optimal_share_market else None + ), + "pct_of_stable_matches_that_are_median": ( + 100.0 * median_share_match / classified_matches if classified_matches else None + ), + "pct_of_stable_matches_that_are_food_optimal": ( + 100.0 * food_optimal_share_match / classified_matches if classified_matches else None + ), + "pct_of_stable_matches_that_are_color_optimal": ( + 100.0 * color_optimal_share_match / classified_matches if classified_matches else None + ), + } + ), + } + + comparisons = {} + pairs = [ + ("main_unique_sm", "unilateral_unique_sm", "bilateral_vs_unilateral__unique_sm"), + ("main_four_by_four", "unilateral_four_by_four", "bilateral_vs_unilateral__four_by_four"), + ("main_five_stable", "unilateral_five_stable", "bilateral_vs_unilateral__five_stable"), + ] + for a, b, key in pairs: + if a in arm_results and b in arm_results: + comparisons[key] = { + "bilateral_pct_markets_stable": arm_results[a]["pct_markets_stable"], + "unilateral_pct_markets_stable": arm_results[b]["pct_markets_stable"], + "paper_reports": "bilateral 88.24% / unilateral 60.47% overall (paper Table 4); " + "see source/evidence.json:finding_unilateral_comparison", + } + if "main_unique_sm" in arm_results and "large_unique_sm" in arm_results: + comparisons["main_vs_large__unique_sm"] = { + "main_pct_markets_stable": arm_results["main_unique_sm"]["pct_markets_stable"], + "large_pct_markets_stable": arm_results["large_unique_sm"]["pct_markets_stable"], + "paper_reports": "main 88.24% / large 66.67% overall (paper Table 4); " + "see source/evidence.json:finding_large_market_comparison", + } + + return { + "by_arm": arm_results, + "cross_arm_comparisons": comparisons, + "notes": [ + "All figures above are computed from the sessions actually produced by run_sessions() for " + "whatever model was injected as llm() -- they are not copied from the paper. Compare them " + "against the paper's own figures recorded in source/evidence.json (entries prefixed 'finding_') " + "and paper.pdf Tables 2-4, which describe human-subject behavior, not a ground truth the agents " + "are expected to reproduce.", + "Sample sizes here are typically much smaller than the paper's (85/43/12 real experimental " + "markets); treat any single evaluate() call as illustrative unless the researcher requests a " + "much larger n in run_sessions().", + ], + } diff --git a/studies/study_018/materials/instructions_script.json b/studies/study_018/materials/instructions_script.json new file mode 100644 index 0000000..802737f --- /dev/null +++ b/studies/study_018/materials/instructions_script.json @@ -0,0 +1,96 @@ +{ + "_description": "Verbatim transcription of the participant-facing CASSEL lab instruction slide deck, extracted from the contributor-uploaded open materials at input/open_materials/instructions.pdf. This is the script read/shown to every human participant before and during the main (8-per-side, both-sides-propose) treatment. Slide repeats present in the source PDF (the deck reveals bullet points one at a time across several near-duplicate slides) are preserved faithfully but collapsed into one slide entry with a note, so the wording is not lost but is not needlessly duplicated.", + "evidence_label": "verbatim", + "source": "input/open_materials/instructions.pdf, all pages", + "slides": [ + { + "id": "welcome", + "text": "Welcome to CASSEL\nWelcome to the CASSEL Lab, and thank you for participating in today's experiment.\n\nPlace all of your personal belongings away, so we can have your complete attention.\n\nIt is very important that you do not touch the computer until you are instructed to do so. When you are told to use the computer, please use it only as instructed. In particular, do not attempt to browse the web or use programs unrelated to the experiment.\n\nRaise your hand if you need a writing utensil." + }, + { + "id": "the_experiment_intro", + "text": "The Experiment\nToday's experiment is an experiment on matching.\n\nYou will be paid for your participation in cash. Each of you may earn different amounts. How much you earn depends on your and others' decisions.\n\nYou will be using the computer for the entire experiment, and all interaction between you and others will be through the computer terminals.\n\nPlease DO NOT socialize or talk." + }, + { + "id": "computer_instructions", + "text": "Computer Instructions\nWe will go through this computer practice session very slowly and it is important that you follow the instructions.\n\nIf you have any questions, raise your hand and your question will be answered so everyone can hear.\n\nAgain, please do not hit any keys until you are told to do so, and when you are told to enter information, type exactly what you are told to type." + }, + { + "id": "start_program", + "text": "To Start The Program\nPlease double click on the ICON labeled \"MC\"." + }, + { + "id": "log_on", + "text": "Log On Screen\nWhen the computer prompts you to Log In, type your first and last name.\n\nThen click \"submit\" to confirm." + }, + { + "id": "experimental_interface_intro", + "text": "Experimental Interface\nYou should now see the experimental interface. The screen is divided into several sections." + }, + { + "id": "the_experiment_rules", + "note": "This slide's bullet points are built up one-at-a-time across 6 near-identical slides in the source deck (pages repeat the growing bullet list). The full, final bullet list is transcribed once here; no wording differs across the repeats other than which bullets have appeared so far.", + "text": "The Experiment\n\n• In each round, you will randomly be assigned the role of a \"color\" or a \"fruit\".\n\n• There will be 8 colors and 8 fruit in your group.\n\n• You will try to match with a member of the opposite group.\n\n• For example, if you are color blue you may match with \"apple,\" \"banana,\" etc.\n\n• You derive different payoffs from different matches.\n\n• In each round of the experiment you will see all payoffs from each possible matching." + }, + { + "id": "experimental_interface_layout", + "text": "Experimental Interface\n\nYour Type\n\nPotential Matches" + }, + { + "id": "payoffs_1", + "text": "Payoffs\nIn each round, you see a table (left panel) with the payoff you get from each match.\n\nSuppose you are cyan:" + }, + { + "id": "payoffs_2", + "text": "Payoffs\nTo summarize, in each round, if you match with someone, you receive the corresponding payoff in the table.\n\nIf you match with no one, your payoff in that round is 0." + }, + { + "id": "getting_matched_preview", + "text": "Getting Matched - Preview\n\nYou get matched by making an offer that gets accepted, or by accepting an offer you receive.\n\nA match is broken if an alternative offer is accepted." + }, + { + "id": "making_offers", + "text": "Making Offers\n\nYou make an offer by clicking on the name you want to match with (right panel).\n\n[Clickable buttons. Only one offer at a time.]" + }, + { + "id": "making_offers_interface", + "text": "Making Offers - Interface\n\nAfter choosing a target for an offer, you will have to confirm." + }, + { + "id": "response_to_offers", + "text": "Response to Offers\n\nIf you receive an offer, a window opens.\n\nYou can accept or reject.\n\nIf you wait more than 10 seconds the offer is rejected for you." + }, + { + "id": "response_to_offers_interface", + "text": "Response to Offers - Interface\n\n[Offer Timer]\n[Offer Decision]" + }, + { + "id": "current_matches", + "text": "Current Matches\nIn each round, you see a table (right) with the current matches.\n\n[Example shown: blue matched to cherry]" + }, + { + "id": "matches_temporary", + "text": "Matches are Temporary\nUntil the round ends, matches are temporary.\n\nA match can be broken by accepting alternative offers." + }, + { + "id": "end_of_round", + "text": "The End of a Round\nA round ends when there are no new offers during 30 seconds.\n\n[Game Timer]" + }, + { + "id": "end_of_round_recording", + "text": "The End of a Round - Recording\nAt the end of each round, please record the details of the round on the provided sheet (please fill id now)." + }, + { + "id": "earnings", + "text": "Your Earnings\n\nToday 1 point = 1 cent.\n\nYou will be paid at the end of the experiment the total amount you have earned in all rounds but the practice round.\n\nYou need not tell any other participant how much you have earned." + }, + { + "id": "begin", + "text": "Let the Experiment Begin!\n\nTo ensure your privacy and that of others in the experiment, please pull out the dividers as far as they will go.\n\nIf there are no questions, we will now begin the actual experiment." + } + ], + "not_covered_by_this_script": { + "evidence_label": "missing", + "note": "The uploaded instructions.pdf only covers the main treatment: 8 participants per side, both sides free to propose. The paper states auxiliary treatments (unilateral offers -- only foods propose; large markets -- 15 per side) 'otherwise operated as in our main treatments' / 'resembles our main treatments', but does not reproduce the exact slide wording used for those sessions. task/adapter.py derives (evidence_label='derived') adapted instruction text for those arms by substituting the group size and adding an explicit proposing-rule sentence; the exact original wording for those variants is unavailable and is flagged in audit/missing_information.json." + } +} diff --git a/studies/study_018/materials/materials.json b/studies/study_018/materials/materials.json new file mode 100644 index 0000000..76326ab --- /dev/null +++ b/studies/study_018/materials/materials.json @@ -0,0 +1,54 @@ +{ + "_description": "Index of participant-visible material for the single empirical study in this package (Echenique, Robinson-Cortes & Yariv, 'An Experimental Study of Decentralized Matching'). All conditions share one experimental paradigm -- a decentralized one-to-one two-sided matching market with full information and non-binding offers -- so materials are organized by the treatment dimensions the paper varies: proposing rule (bilateral vs. unilateral), market size (8-per-side vs. 15-per-side), and market structure / cardinal payoff representation (which determines the number of stable matchings and stable partners).", + "study": "decentralized_matching_experiment", + "groups": [ + { + "condition_dimension": "instructions", + "items": [ + { + "id": "cassel_instructions_main", + "applies_to": "main treatments (bilateral, 8 per side)", + "file": "materials/instructions_script.json", + "evidence_label": "verbatim", + "source": "input/open_materials/instructions.pdf" + }, + { + "id": "cassel_instructions_derived_variants", + "applies_to": "unilateral-offer and large-market arms", + "description": "adapter.py builds these by substituting group size (8->15) and, for unilateral arms, inserting an explicit sentence that only foods may make offers (colors may only accept/reject) -- see task/adapter.py:build_instructions().", + "evidence_label": "derived", + "derivation": "Paper text states these treatments 'operated as in our main treatments' with the stated size/proposing-rule change; exact original slide wording for these variants was not among the uploaded materials.", + "source": "source/paper_metadata.json section 4 (Experimental Design); audit/missing_information.json" + } + ] + }, + { + "condition_dimension": "payoff_matrices", + "items": [ + { + "id": "all_31_cardinal_treatments", + "file": "materials/payoff_matrices_verbatim.json", + "evidence_label": "verbatim", + "source": "input/open_materials/Payoff Matrices.txt", + "description": "All 31 cardinal payoff-matrix treatments referenced in Table 1 of the paper (7 unique-stable-matching, 6 two-embedded-4x4, 4 five-stable-matching, and their one-sided/unilateral counterparts, plus 5 large 15-per-side matrices). task/adapter.py selects one matrix per (structure, proposing, size) arm by default (see task/task.json 'conditions'); a researcher may repoint an arm at any other treatment index in the same file to explore cardinal-representation effects, exactly as the paper does across its 140 experimental markets." + } + ] + }, + { + "condition_dimension": "response_format", + "items": [ + { + "id": "offer_and_response_actions", + "evidence_label": "reported", + "description": "Each acting participant either (a) proposes a single match offer to one member of the other side (any member, matched or not, one offer outstanding at a time), or (b) if it just received an offer, accepts or rejects it. An unmatched agent at market end earns 0. In the original, a received offer must be answered within 10 seconds or is auto-rejected, and a market ends after 30 seconds pass with no new offer; task/task.json documents how adapter.py discretizes these two real-time clocks into a turn/tick model (see task.json 'timing_discretization').", + "source": "source/paper_metadata.json section 4" + } + ] + } + ], + "payment": { + "evidence_label": "reported", + "text": "1 point = 1 cent. Participants are paid, in cash, the sum of their earnings across all non-practice rounds, plus a $5 show-up fee. Average total payment was $40 in main treatments, $33 in unilateral-offer treatments, and $24 in the 15x15 large-market treatments.", + "source": "paper.pdf p.14-15 (Section 4)" + } +} diff --git a/studies/study_018/materials/payoff_matrices_verbatim.json b/studies/study_018/materials/payoff_matrices_verbatim.json new file mode 100644 index 0000000..aa8246b --- /dev/null +++ b/studies/study_018/materials/payoff_matrices_verbatim.json @@ -0,0 +1,11978 @@ +{ + "_description": "Cardinal payoff matrices for the decentralized matching experiment, transcribed verbatim from the contributor-uploaded open-materials file 'Payoff Matrices.txt' (extracted at input/open_materials/Payoff Matrices.txt). Each entry is one cardinal treatment referenced in Table 1 of the paper. The (food-i, color-j) matrix cell is [food_i_payoff, color_j_payoff] in cents, i.e. the payoff food-i gets from matching with color-j (first number) and the payoff color-j gets from matching with food-i (second number). An unmatched agent earns 0.", + "evidence_label": "verbatim", + "source": "input/open_materials/Payoff Matrices.txt (full file; no truncation)", + "naming_note": "The source labels food-side agents 'food-i' and color-side agents 'color-j'. The CASSEL instructions script (materials/instructions_script.json) refers to the food side colloquially as 'fruit' -- both terms denote the same market side; the payoff-matrix and paper's formal notation ('food') is used as the canonical role name throughout this package.", + "treatments": [ + { + "index": 1, + "label": "baseline:unique-SM [two_aligned]", + "experimental_markets": 4, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 700, + 50 + ], + [ + 200, + 50 + ], + [ + 800, + 50 + ], + [ + 400, + 50 + ], + [ + 100, + 50 + ], + [ + 600, + 50 + ], + [ + 300, + 50 + ], + [ + 500, + 50 + ] + ], + "food-2": [ + [ + 700, + 150 + ], + [ + 200, + 150 + ], + [ + 800, + 150 + ], + [ + 400, + 150 + ], + [ + 100, + 150 + ], + [ + 600, + 150 + ], + [ + 300, + 150 + ], + [ + 500, + 150 + ] + ], + "food-3": [ + [ + 700, + 250 + ], + [ + 200, + 250 + ], + [ + 800, + 250 + ], + [ + 400, + 250 + ], + [ + 100, + 250 + ], + [ + 600, + 250 + ], + [ + 300, + 250 + ], + [ + 500, + 250 + ] + ], + "food-4": [ + [ + 700, + 750 + ], + [ + 200, + 750 + ], + [ + 800, + 750 + ], + [ + 400, + 750 + ], + [ + 100, + 750 + ], + [ + 600, + 750 + ], + [ + 300, + 750 + ], + [ + 500, + 750 + ] + ], + "food-5": [ + [ + 700, + 450 + ], + [ + 200, + 450 + ], + [ + 800, + 450 + ], + [ + 400, + 450 + ], + [ + 100, + 450 + ], + [ + 600, + 450 + ], + [ + 300, + 450 + ], + [ + 500, + 450 + ] + ], + "food-6": [ + [ + 700, + 350 + ], + [ + 200, + 350 + ], + [ + 800, + 350 + ], + [ + 400, + 350 + ], + [ + 100, + 350 + ], + [ + 600, + 350 + ], + [ + 300, + 350 + ], + [ + 500, + 350 + ] + ], + "food-7": [ + [ + 700, + 650 + ], + [ + 200, + 650 + ], + [ + 800, + 650 + ], + [ + 400, + 650 + ], + [ + 100, + 650 + ], + [ + 600, + 650 + ], + [ + 300, + 650 + ], + [ + 500, + 650 + ] + ], + "food-8": [ + [ + 700, + 550 + ], + [ + 200, + 550 + ], + [ + 800, + 550 + ], + [ + 400, + 550 + ], + [ + 100, + 550 + ], + [ + 600, + 550 + ], + [ + 300, + 550 + ], + [ + 500, + 550 + ] + ] + } + }, + { + "index": 2, + "label": "baseline:unique-SM [one_aligned]", + "experimental_markets": 4, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 500, + 350 + ], + [ + 100, + 400 + ], + [ + 600, + 450 + ], + [ + 400, + 200 + ], + [ + 800, + 550 + ], + [ + 300, + 150 + ], + [ + 700, + 500 + ], + [ + 200, + 300 + ] + ], + "food-2": [ + [ + 500, + 350 + ], + [ + 100, + 50 + ], + [ + 600, + 100 + ], + [ + 400, + 250 + ], + [ + 800, + 500 + ], + [ + 300, + 450 + ], + [ + 700, + 200 + ], + [ + 200, + 100 + ] + ], + "food-3": [ + [ + 500, + 200 + ], + [ + 100, + 300 + ], + [ + 600, + 250 + ], + [ + 400, + 350 + ], + [ + 800, + 450 + ], + [ + 300, + 100 + ], + [ + 700, + 50 + ], + [ + 200, + 400 + ] + ], + "food-4": [ + [ + 500, + 150 + ], + [ + 100, + 200 + ], + [ + 600, + 150 + ], + [ + 400, + 500 + ], + [ + 800, + 250 + ], + [ + 300, + 400 + ], + [ + 700, + 450 + ], + [ + 200, + 700 + ] + ], + "food-5": [ + [ + 500, + 400 + ], + [ + 100, + 150 + ], + [ + 600, + 50 + ], + [ + 400, + 300 + ], + [ + 800, + 200 + ], + [ + 300, + 250 + ], + [ + 700, + 100 + ], + [ + 200, + 350 + ] + ], + "food-6": [ + [ + 500, + 100 + ], + [ + 100, + 250 + ], + [ + 600, + 200 + ], + [ + 400, + 0 + ], + [ + 800, + 350 + ], + [ + 300, + 500 + ], + [ + 700, + 300 + ], + [ + 200, + 50 + ] + ], + "food-7": [ + [ + 500, + 300 + ], + [ + 100, + 550 + ], + [ + 600, + 350 + ], + [ + 400, + 100 + ], + [ + 800, + 400 + ], + [ + 300, + 200 + ], + [ + 700, + 150 + ], + [ + 200, + 250 + ] + ], + "food-8": [ + [ + 500, + 250 + ], + [ + 100, + 0 + ], + [ + 600, + 300 + ], + [ + 400, + 200 + ], + [ + 800, + 100 + ], + [ + 300, + 50 + ], + [ + 700, + 350 + ], + [ + 200, + 150 + ] + ] + } + }, + { + "index": 3, + "label": "baseline:unique-SM [egal_matching]", + "experimental_markets": 4, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 300, + 300 + ], + [ + 250, + 250 + ], + [ + 200, + 200 + ], + [ + 250, + 150 + ], + [ + 600, + 350 + ], + [ + 150, + 100 + ], + [ + 100, + 50 + ], + [ + 50, + 50 + ] + ], + "food-2": [ + [ + 200, + 250 + ], + [ + 300, + 300 + ], + [ + 350, + 400 + ], + [ + 150, + 100 + ], + [ + 500, + 250 + ], + [ + 250, + 250 + ], + [ + 300, + 450 + ], + [ + 200, + 150 + ] + ], + "food-3": [ + [ + 450, + 550 + ], + [ + 400, + 500 + ], + [ + 300, + 300 + ], + [ + 400, + 400 + ], + [ + 200, + 150 + ], + [ + 0, + 50 + ], + [ + 250, + 150 + ], + [ + 400, + 100 + ] + ], + "food-4": [ + [ + 50, + 100 + ], + [ + 350, + 450 + ], + [ + 200, + 250 + ], + [ + 300, + 300 + ], + [ + 100, + 100 + ], + [ + 400, + 350 + ], + [ + 150, + 100 + ], + [ + 100, + 50 + ] + ], + "food-5": [ + [ + 50, + 150 + ], + [ + 250, + 300 + ], + [ + 400, + 500 + ], + [ + 100, + 200 + ], + [ + 300, + 300 + ], + [ + 50, + 150 + ], + [ + 250, + 400 + ], + [ + 350, + 0 + ] + ], + "food-6": [ + [ + 150, + 200 + ], + [ + 0, + 100 + ], + [ + 50, + 150 + ], + [ + 200, + 250 + ], + [ + 400, + 200 + ], + [ + 300, + 300 + ], + [ + 150, + 200 + ], + [ + 200, + 200 + ] + ], + "food-7": [ + [ + 100, + 50 + ], + [ + 150, + 200 + ], + [ + 50, + 50 + ], + [ + 400, + 350 + ], + [ + 250, + 50 + ], + [ + 200, + 200 + ], + [ + 300, + 300 + ], + [ + 150, + 50 + ] + ], + "food-8": [ + [ + 100, + 150 + ], + [ + 350, + 400 + ], + [ + 50, + 100 + ], + [ + 150, + 100 + ], + [ + 400, + 200 + ], + [ + 100, + 100 + ], + [ + 150, + 0 + ], + [ + 300, + 300 + ] + ] + } + }, + { + "index": 4, + "label": "baseline:unique-SM [generic_corr-0.9]", + "experimental_markets": 4, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 590, + 260 + ], + [ + 470, + 290 + ], + [ + 350, + 340 + ], + [ + 510, + 380 + ], + [ + 310, + 400 + ], + [ + 550, + 320 + ], + [ + 430, + 100 + ], + [ + 390, + 240 + ] + ], + "food-2": [ + [ + 100, + 180 + ], + [ + 20, + 210 + ], + [ + 300, + 500 + ], + [ + 60, + 460 + ], + [ + 220, + 480 + ], + [ + 260, + 360 + ], + [ + 180, + 60 + ], + [ + 140, + 120 + ] + ], + "food-3": [ + [ + 200, + 340 + ], + [ + 280, + 490 + ], + [ + 80, + 300 + ], + [ + 0, + 180 + ], + [ + 40, + 360 + ], + [ + 240, + 120 + ], + [ + 120, + 180 + ], + [ + 160, + 360 + ] + ], + "food-4": [ + [ + 550, + 300 + ], + [ + 470, + 370 + ], + [ + 350, + 540 + ], + [ + 430, + 340 + ], + [ + 390, + 640 + ], + [ + 510, + 200 + ], + [ + 630, + 220 + ], + [ + 590, + 280 + ] + ], + "food-5": [ + [ + 260, + 220 + ], + [ + 100, + 250 + ], + [ + 140, + 260 + ], + [ + 340, + 260 + ], + [ + 300, + 600 + ], + [ + 60, + 80 + ], + [ + 180, + 140 + ], + [ + 220, + 80 + ] + ], + "food-6": [ + [ + 210, + 60 + ], + [ + 370, + 330 + ], + [ + 170, + 380 + ], + [ + 330, + 420 + ], + [ + 130, + 440 + ], + [ + 90, + 160 + ], + [ + 290, + 340 + ], + [ + 250, + 200 + ] + ], + "food-7": [ + [ + 440, + 140 + ], + [ + 560, + 450 + ], + [ + 400, + 460 + ], + [ + 480, + 220 + ], + [ + 360, + 520 + ], + [ + 520, + 280 + ], + [ + 640, + 260 + ], + [ + 600, + 320 + ] + ], + "food-8": [ + [ + 390, + 100 + ], + [ + 470, + 410 + ], + [ + 630, + 420 + ], + [ + 510, + 300 + ], + [ + 590, + 560 + ], + [ + 350, + 240 + ], + [ + 550, + 300 + ], + [ + 430, + 160 + ] + ] + } + }, + { + "index": 5, + "label": "baseline:unique-SM [generic_corr+0.9]", + "experimental_markets": 4, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 290, + 200 + ], + [ + 410, + 300 + ], + [ + 450, + 450 + ], + [ + 490, + 560 + ], + [ + 250, + 340 + ], + [ + 530, + 420 + ], + [ + 370, + 410 + ], + [ + 330, + 190 + ] + ], + "food-2": [ + [ + 420, + 440 + ], + [ + 220, + 180 + ], + [ + 340, + 330 + ], + [ + 260, + 360 + ], + [ + 460, + 220 + ], + [ + 300, + 300 + ], + [ + 500, + 490 + ], + [ + 380, + 390 + ] + ], + "food-3": [ + [ + 490, + 360 + ], + [ + 410, + 380 + ], + [ + 330, + 250 + ], + [ + 210, + 400 + ], + [ + 450, + 420 + ], + [ + 250, + 340 + ], + [ + 370, + 290 + ], + [ + 290, + 270 + ] + ], + "food-4": [ + [ + 330, + 160 + ], + [ + 450, + 420 + ], + [ + 410, + 490 + ], + [ + 250, + 440 + ], + [ + 210, + 260 + ], + [ + 290, + 380 + ], + [ + 490, + 330 + ], + [ + 370, + 230 + ] + ], + "food-5": [ + [ + 300, + 280 + ], + [ + 260, + 460 + ], + [ + 380, + 210 + ], + [ + 420, + 480 + ], + [ + 460, + 460 + ], + [ + 500, + 500 + ], + [ + 220, + 210 + ], + [ + 340, + 150 + ] + ], + "food-6": [ + [ + 510, + 320 + ], + [ + 590, + 260 + ], + [ + 430, + 290 + ], + [ + 550, + 600 + ], + [ + 310, + 180 + ], + [ + 390, + 260 + ], + [ + 350, + 250 + ], + [ + 470, + 110 + ] + ], + "food-7": [ + [ + 190, + 240 + ], + [ + 230, + 220 + ], + [ + 390, + 410 + ], + [ + 110, + 520 + ], + [ + 270, + 380 + ], + [ + 150, + 460 + ], + [ + 310, + 450 + ], + [ + 350, + 350 + ] + ], + "food-8": [ + [ + 400, + 400 + ], + [ + 280, + 340 + ], + [ + 480, + 370 + ], + [ + 240, + 640 + ], + [ + 360, + 300 + ], + [ + 200, + 540 + ], + [ + 320, + 370 + ], + [ + 440, + 310 + ] + ] + } + }, + { + "index": 6, + "label": "baseline:unique-SM [generic_udif20]", + "experimental_markets": 5, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 280, + 160 + ], + [ + 240, + 300 + ], + [ + 300, + 420 + ], + [ + 340, + 310 + ], + [ + 380, + 470 + ], + [ + 260, + 110 + ], + [ + 360, + 570 + ], + [ + 320, + 350 + ] + ], + "food-2": [ + [ + 295, + 240 + ], + [ + 255, + 320 + ], + [ + 275, + 440 + ], + [ + 315, + 290 + ], + [ + 195, + 490 + ], + [ + 215, + 130 + ], + [ + 175, + 550 + ], + [ + 235, + 310 + ] + ], + "food-3": [ + [ + 460, + 140 + ], + [ + 520, + 360 + ], + [ + 400, + 320 + ], + [ + 480, + 190 + ], + [ + 540, + 510 + ], + [ + 440, + 150 + ], + [ + 500, + 530 + ], + [ + 420, + 430 + ] + ], + "food-4": [ + [ + 280, + 220 + ], + [ + 240, + 280 + ], + [ + 220, + 400 + ], + [ + 300, + 270 + ], + [ + 160, + 530 + ], + [ + 260, + 210 + ], + [ + 180, + 610 + ], + [ + 200, + 370 + ] + ], + "food-5": [ + [ + 410, + 180 + ], + [ + 330, + 260 + ], + [ + 470, + 380 + ], + [ + 430, + 330 + ], + [ + 370, + 450 + ], + [ + 390, + 90 + ], + [ + 350, + 510 + ], + [ + 450, + 410 + ] + ], + "food-6": [ + [ + 330, + 200 + ], + [ + 410, + 340 + ], + [ + 370, + 360 + ], + [ + 350, + 210 + ], + [ + 310, + 430 + ], + [ + 430, + 190 + ], + [ + 290, + 490 + ], + [ + 390, + 390 + ] + ], + "food-7": [ + [ + 450, + 260 + ], + [ + 490, + 240 + ], + [ + 510, + 460 + ], + [ + 430, + 250 + ], + [ + 410, + 410 + ], + [ + 470, + 230 + ], + [ + 390, + 470 + ], + [ + 370, + 290 + ] + ], + "food-8": [ + [ + 570, + 120 + ], + [ + 490, + 220 + ], + [ + 510, + 340 + ], + [ + 550, + 230 + ], + [ + 530, + 390 + ], + [ + 590, + 170 + ], + [ + 610, + 590 + ], + [ + 630, + 330 + ] + ] + } + }, + { + "index": 7, + "label": "baseline:unique-SM [generic_udif70]", + "experimental_markets": 5, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 240, + 0 + ], + [ + 310, + 210 + ], + [ + 520, + 240 + ], + [ + 380, + 520 + ], + [ + 30, + 140 + ], + [ + 170, + 290 + ], + [ + 100, + 320 + ], + [ + 450, + 420 + ] + ], + "food-2": [ + [ + 520, + 350 + ], + [ + 170, + 280 + ], + [ + 310, + 170 + ], + [ + 240, + 100 + ], + [ + 450, + 420 + ], + [ + 100, + 220 + ], + [ + 30, + 250 + ], + [ + 380, + 350 + ] + ], + "food-3": [ + [ + 360, + 490 + ], + [ + 290, + 490 + ], + [ + 500, + 520 + ], + [ + 220, + 240 + ], + [ + 430, + 70 + ], + [ + 150, + 150 + ], + [ + 80, + 180 + ], + [ + 10, + 0 + ] + ], + "food-4": [ + [ + 350, + 420 + ], + [ + 420, + 350 + ], + [ + 210, + 310 + ], + [ + 490, + 310 + ], + [ + 280, + 210 + ], + [ + 0, + 570 + ], + [ + 70, + 670 + ], + [ + 140, + 280 + ] + ], + "food-5": [ + [ + 530, + 280 + ], + [ + 460, + 0 + ], + [ + 250, + 100 + ], + [ + 390, + 170 + ], + [ + 180, + 0 + ], + [ + 320, + 80 + ], + [ + 600, + 600 + ], + [ + 670, + 140 + ] + ], + "food-6": [ + [ + 70, + 70 + ], + [ + 140, + 140 + ], + [ + 210, + 380 + ], + [ + 350, + 450 + ], + [ + 0, + 280 + ], + [ + 490, + 360 + ], + [ + 420, + 530 + ], + [ + 280, + 210 + ] + ], + "food-7": [ + [ + 140, + 140 + ], + [ + 420, + 420 + ], + [ + 350, + 450 + ], + [ + 490, + 380 + ], + [ + 280, + 350 + ], + [ + 70, + 430 + ], + [ + 0, + 460 + ], + [ + 210, + 70 + ] + ], + "food-8": [ + [ + 200, + 210 + ], + [ + 270, + 70 + ], + [ + 60, + 30 + ], + [ + 340, + 30 + ], + [ + 480, + 490 + ], + [ + 550, + 500 + ], + [ + 410, + 390 + ], + [ + 130, + 490 + ] + ] + } + }, + { + "index": 8, + "label": "baseline:4-by-4 [Mkt_1]", + "experimental_markets": 5, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 300, + 400 + ], + [ + 400, + 350 + ], + [ + 250, + 250 + ], + [ + 350, + 250 + ], + [ + 50, + 200 + ], + [ + 100, + 150 + ], + [ + 150, + 50 + ], + [ + 200, + 100 + ] + ], + "food-2": [ + [ + 350, + 300 + ], + [ + 400, + 250 + ], + [ + 250, + 200 + ], + [ + 300, + 400 + ], + [ + 100, + 150 + ], + [ + 150, + 50 + ], + [ + 200, + 100 + ], + [ + 50, + 200 + ] + ], + "food-3": [ + [ + 250, + 250 + ], + [ + 350, + 400 + ], + [ + 300, + 400 + ], + [ + 400, + 350 + ], + [ + 150, + 50 + ], + [ + 200, + 100 + ], + [ + 50, + 200 + ], + [ + 100, + 150 + ] + ], + "food-4": [ + [ + 400, + 200 + ], + [ + 250, + 200 + ], + [ + 350, + 300 + ], + [ + 300, + 300 + ], + [ + 200, + 100 + ], + [ + 50, + 0 + ], + [ + 100, + 150 + ], + [ + 150, + 50 + ] + ], + "food-5": [ + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 300, + 500 + ], + [ + 400, + 450 + ], + [ + 250, + 350 + ], + [ + 350, + 350 + ] + ], + "food-6": [ + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 350, + 400 + ], + [ + 400, + 350 + ], + [ + 250, + 300 + ], + [ + 300, + 500 + ] + ], + "food-7": [ + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 250, + 350 + ], + [ + 350, + 500 + ], + [ + 300, + 500 + ], + [ + 400, + 450 + ] + ], + "food-8": [ + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 400, + 300 + ], + [ + 250, + 300 + ], + [ + 350, + 400 + ], + [ + 300, + 400 + ] + ] + } + }, + { + "index": 9, + "label": "baseline:4-by-4 [Mkt_2]", + "experimental_markets": 9, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 400, + 400 + ], + [ + 500, + 350 + ], + [ + 350, + 250 + ], + [ + 450, + 250 + ], + [ + 50, + 200 + ], + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 200, + 100 + ] + ], + "food-2": [ + [ + 450, + 300 + ], + [ + 500, + 250 + ], + [ + 350, + 200 + ], + [ + 400, + 400 + ], + [ + 100, + 150 + ], + [ + 150, + 50 + ], + [ + 200, + 100 + ], + [ + 50, + 0 + ] + ], + "food-3": [ + [ + 350, + 250 + ], + [ + 450, + 400 + ], + [ + 400, + 400 + ], + [ + 500, + 350 + ], + [ + 150, + 50 + ], + [ + 200, + 100 + ], + [ + 50, + 0 + ], + [ + 100, + 150 + ] + ], + "food-4": [ + [ + 500, + 200 + ], + [ + 350, + 200 + ], + [ + 450, + 300 + ], + [ + 400, + 300 + ], + [ + 200, + 100 + ], + [ + 50, + 0 + ], + [ + 100, + 150 + ], + [ + 150, + 50 + ] + ], + "food-5": [ + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 300, + 400 + ], + [ + 400, + 300 + ], + [ + 250, + 250 + ], + [ + 350, + 200 + ] + ], + "food-6": [ + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 350, + 250 + ], + [ + 400, + 200 + ], + [ + 250, + 200 + ], + [ + 300, + 400 + ] + ], + "food-7": [ + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 250, + 200 + ], + [ + 350, + 400 + ], + [ + 300, + 400 + ], + [ + 400, + 300 + ] + ], + "food-8": [ + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 400, + 150 + ], + [ + 250, + 150 + ], + [ + 350, + 300 + ], + [ + 300, + 250 + ] + ] + } + }, + { + "index": 10, + "label": "baseline:4-by-4 [Mkt_3]", + "experimental_markets": 9, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 300, + 400 + ], + [ + 450, + 350 + ], + [ + 250, + 250 + ], + [ + 350, + 250 + ], + [ + 50, + 0 + ], + [ + 100, + 150 + ], + [ + 150, + 50 + ], + [ + 200, + 100 + ] + ], + "food-2": [ + [ + 350, + 300 + ], + [ + 400, + 250 + ], + [ + 200, + 200 + ], + [ + 250, + 400 + ], + [ + 100, + 150 + ], + [ + 150, + 50 + ], + [ + 0, + 100 + ], + [ + 50, + 200 + ] + ], + "food-3": [ + [ + 150, + 250 + ], + [ + 250, + 400 + ], + [ + 200, + 400 + ], + [ + 350, + 350 + ], + [ + 150, + 50 + ], + [ + 0, + 100 + ], + [ + 50, + 0 + ], + [ + 100, + 150 + ] + ], + "food-4": [ + [ + 400, + 200 + ], + [ + 250, + 200 + ], + [ + 350, + 300 + ], + [ + 300, + 300 + ], + [ + 200, + 100 + ], + [ + 50, + 0 + ], + [ + 100, + 150 + ], + [ + 150, + 50 + ] + ], + "food-5": [ + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 300, + 400 + ], + [ + 400, + 350 + ], + [ + 250, + 250 + ], + [ + 350, + 250 + ] + ], + "food-6": [ + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 350, + 300 + ], + [ + 400, + 250 + ], + [ + 250, + 200 + ], + [ + 300, + 400 + ] + ], + "food-7": [ + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 250, + 250 + ], + [ + 350, + 400 + ], + [ + 300, + 400 + ], + [ + 400, + 350 + ] + ], + "food-8": [ + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 400, + 200 + ], + [ + 250, + 200 + ], + [ + 350, + 300 + ], + [ + 300, + 300 + ] + ] + } + }, + { + "index": 11, + "label": "baseline:4-by-4 [Mkt2_higher_outmarket_payoffs]", + "experimental_markets": 4, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 400, + 400 + ], + [ + 200, + 200 + ], + [ + 450, + 250 + ], + [ + 200, + 200 + ], + [ + 350, + 250 + ], + [ + 200, + 200 + ], + [ + 500, + 350 + ], + [ + 200, + 200 + ] + ], + "food-2": [ + [ + 500, + 200 + ], + [ + 200, + 200 + ], + [ + 400, + 300 + ], + [ + 200, + 200 + ], + [ + 450, + 300 + ], + [ + 200, + 200 + ], + [ + 350, + 200 + ], + [ + 200, + 200 + ] + ], + "food-3": [ + [ + 200, + 200 + ], + [ + 400, + 150 + ], + [ + 200, + 200 + ], + [ + 350, + 300 + ], + [ + 200, + 200 + ], + [ + 250, + 150 + ], + [ + 200, + 200 + ], + [ + 300, + 250 + ] + ], + "food-4": [ + [ + 450, + 300 + ], + [ + 200, + 200 + ], + [ + 400, + 400 + ], + [ + 200, + 200 + ], + [ + 350, + 200 + ], + [ + 200, + 200 + ], + [ + 500, + 250 + ], + [ + 200, + 200 + ] + ], + "food-5": [ + [ + 200, + 200 + ], + [ + 350, + 250 + ], + [ + 200, + 200 + ], + [ + 250, + 200 + ], + [ + 200, + 200 + ], + [ + 400, + 200 + ], + [ + 200, + 200 + ], + [ + 300, + 400 + ] + ], + "food-6": [ + [ + 350, + 250 + ], + [ + 200, + 200 + ], + [ + 500, + 350 + ], + [ + 200, + 200 + ], + [ + 400, + 400 + ], + [ + 200, + 200 + ], + [ + 450, + 400 + ], + [ + 200, + 200 + ] + ], + "food-7": [ + [ + 200, + 200 + ], + [ + 250, + 200 + ], + [ + 200, + 200 + ], + [ + 300, + 400 + ], + [ + 200, + 200 + ], + [ + 350, + 400 + ], + [ + 200, + 200 + ], + [ + 400, + 300 + ] + ], + "food-8": [ + [ + 200, + 200 + ], + [ + 300, + 400 + ], + [ + 200, + 200 + ], + [ + 250, + 250 + ], + [ + 200, + 200 + ], + [ + 400, + 300 + ], + [ + 200, + 200 + ], + [ + 350, + 200 + ] + ] + } + }, + { + "index": 12, + "label": "baseline:4-by-4 [Mkt_3_higher_fruit_payoff]", + "experimental_markets": 4, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 50, + 200 + ], + [ + 500, + 400 + ], + [ + 200, + 100 + ], + [ + 450, + 250 + ], + [ + 150, + 50 + ], + [ + 100, + 0 + ], + [ + 400, + 400 + ], + [ + 350, + 250 + ] + ], + "food-2": [ + [ + 200, + 250 + ], + [ + 150, + 50 + ], + [ + 400, + 350 + ], + [ + 50, + 100 + ], + [ + 250, + 400 + ], + [ + 300, + 400 + ], + [ + 100, + 0 + ], + [ + 0, + 150 + ] + ], + "food-3": [ + [ + 150, + 50 + ], + [ + 450, + 400 + ], + [ + 100, + 150 + ], + [ + 500, + 400 + ], + [ + 50, + 0 + ], + [ + 200, + 100 + ], + [ + 350, + 300 + ], + [ + 400, + 400 + ] + ], + "food-4": [ + [ + 400, + 200 + ], + [ + 0, + 100 + ], + [ + 300, + 300 + ], + [ + 100, + 0 + ], + [ + 350, + 300 + ], + [ + 250, + 200 + ], + [ + 150, + 50 + ], + [ + 50, + 100 + ] + ], + "food-5": [ + [ + 300, + 400 + ], + [ + 50, + 100 + ], + [ + 350, + 250 + ], + [ + 150, + 50 + ], + [ + 250, + 250 + ], + [ + 400, + 350 + ], + [ + 0, + 150 + ], + [ + 100, + 0 + ] + ], + "food-6": [ + [ + 350, + 300 + ], + [ + 100, + 0 + ], + [ + 300, + 400 + ], + [ + 0, + 150 + ], + [ + 250, + 200 + ], + [ + 400, + 250 + ], + [ + 50, + 100 + ], + [ + 150, + 50 + ] + ], + "food-7": [ + [ + 200, + 100 + ], + [ + 350, + 200 + ], + [ + 150, + 50 + ], + [ + 400, + 300 + ], + [ + 100, + 150 + ], + [ + 50, + 0 + ], + [ + 500, + 250 + ], + [ + 450, + 300 + ] + ], + "food-8": [ + [ + 100, + 150 + ], + [ + 500, + 350 + ], + [ + 50, + 0 + ], + [ + 400, + 450 + ], + [ + 200, + 100 + ], + [ + 150, + 50 + ], + [ + 450, + 350 + ], + [ + 350, + 200 + ] + ] + } + }, + { + "index": 13, + "label": "baseline:4-by-4 [Mkt_3_higher_color_payoff]", + "experimental_markets": 4, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 300, + 500 + ], + [ + 100, + 0 + ], + [ + 400, + 350 + ], + [ + 0, + 150 + ], + [ + 350, + 400 + ], + [ + 150, + 50 + ], + [ + 50, + 100 + ], + [ + 250, + 300 + ] + ], + "food-2": [ + [ + 50, + 200 + ], + [ + 400, + 250 + ], + [ + 150, + 50 + ], + [ + 300, + 400 + ], + [ + 100, + 150 + ], + [ + 250, + 200 + ], + [ + 350, + 300 + ], + [ + 200, + 100 + ] + ], + "food-3": [ + [ + 300, + 400 + ], + [ + 0, + 150 + ], + [ + 250, + 300 + ], + [ + 100, + 0 + ], + [ + 400, + 300 + ], + [ + 50, + 100 + ], + [ + 150, + 50 + ], + [ + 350, + 400 + ] + ], + "food-4": [ + [ + 200, + 100 + ], + [ + 400, + 350 + ], + [ + 100, + 150 + ], + [ + 350, + 250 + ], + [ + 50, + 200 + ], + [ + 250, + 250 + ], + [ + 300, + 400 + ], + [ + 150, + 50 + ] + ], + "food-5": [ + [ + 350, + 350 + ], + [ + 50, + 100 + ], + [ + 400, + 450 + ], + [ + 150, + 50 + ], + [ + 300, + 500 + ], + [ + 100, + 0 + ], + [ + 0, + 150 + ], + [ + 250, + 350 + ] + ], + "food-6": [ + [ + 100, + 150 + ], + [ + 350, + 400 + ], + [ + 200, + 100 + ], + [ + 400, + 350 + ], + [ + 150, + 50 + ], + [ + 300, + 400 + ], + [ + 250, + 250 + ], + [ + 50, + 200 + ] + ], + "food-7": [ + [ + 400, + 450 + ], + [ + 150, + 50 + ], + [ + 350, + 500 + ], + [ + 50, + 100 + ], + [ + 250, + 350 + ], + [ + 0, + 150 + ], + [ + 100, + 0 + ], + [ + 300, + 500 + ] + ], + "food-8": [ + [ + 150, + 50 + ], + [ + 250, + 200 + ], + [ + 50, + 0 + ], + [ + 300, + 300 + ], + [ + 200, + 100 + ], + [ + 350, + 300 + ], + [ + 400, + 200 + ], + [ + 100, + 150 + ] + ] + } + }, + { + "index": 14, + "label": "baseline:5-SMs [20-20shift]", + "experimental_markets": 5, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 500, + 350 + ], + [ + 480, + 310 + ], + [ + 460, + 440 + ], + [ + 440, + 340 + ], + [ + 400, + 390 + ], + [ + 420, + 390 + ], + [ + 540, + 290 + ], + [ + 520, + 380 + ] + ], + "food-2": [ + [ + 470, + 330 + ], + [ + 450, + 350 + ], + [ + 490, + 320 + ], + [ + 350, + 380 + ], + [ + 390, + 370 + ], + [ + 370, + 370 + ], + [ + 410, + 310 + ], + [ + 430, + 420 + ] + ], + "food-3": [ + [ + 510, + 270 + ], + [ + 490, + 250 + ], + [ + 430, + 380 + ], + [ + 450, + 300 + ], + [ + 570, + 430 + ], + [ + 550, + 450 + ], + [ + 530, + 370 + ], + [ + 470, + 340 + ] + ], + "food-4": [ + [ + 510, + 250 + ], + [ + 490, + 230 + ], + [ + 430, + 420 + ], + [ + 550, + 400 + ], + [ + 530, + 490 + ], + [ + 570, + 410 + ], + [ + 470, + 270 + ], + [ + 450, + 320 + ] + ], + "food-5": [ + [ + 510, + 310 + ], + [ + 410, + 370 + ], + [ + 390, + 340 + ], + [ + 470, + 320 + ], + [ + 450, + 450 + ], + [ + 370, + 490 + ], + [ + 490, + 330 + ], + [ + 430, + 360 + ] + ], + "food-6": [ + [ + 460, + 290 + ], + [ + 440, + 290 + ], + [ + 500, + 400 + ], + [ + 520, + 360 + ], + [ + 380, + 470 + ], + [ + 480, + 470 + ], + [ + 420, + 410 + ], + [ + 400, + 440 + ] + ], + "food-7": [ + [ + 430, + 370 + ], + [ + 490, + 330 + ], + [ + 510, + 300 + ], + [ + 390, + 420 + ], + [ + 370, + 510 + ], + [ + 470, + 350 + ], + [ + 450, + 350 + ], + [ + 410, + 300 + ] + ], + "food-8": [ + [ + 460, + 390 + ], + [ + 440, + 270 + ], + [ + 520, + 360 + ], + [ + 480, + 440 + ], + [ + 540, + 410 + ], + [ + 400, + 430 + ], + [ + 420, + 390 + ], + [ + 500, + 400 + ] + ] + } + }, + { + "index": 15, + "label": "baseline:5-SMs [20-20]", + "experimental_markets": 5, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 310, + 410 + ], + [ + 390, + 330 + ], + [ + 370, + 300 + ], + [ + 330, + 360 + ], + [ + 290, + 340 + ], + [ + 350, + 410 + ], + [ + 410, + 310 + ], + [ + 270, + 470 + ] + ], + "food-2": [ + [ + 380, + 350 + ], + [ + 440, + 290 + ], + [ + 340, + 320 + ], + [ + 420, + 380 + ], + [ + 360, + 440 + ], + [ + 300, + 350 + ], + [ + 400, + 350 + ], + [ + 320, + 370 + ] + ], + "food-3": [ + [ + 390, + 270 + ], + [ + 370, + 270 + ], + [ + 450, + 380 + ], + [ + 350, + 320 + ], + [ + 330, + 420 + ], + [ + 430, + 450 + ], + [ + 410, + 250 + ], + [ + 470, + 390 + ] + ], + "food-4": [ + [ + 340, + 330 + ], + [ + 320, + 410 + ], + [ + 420, + 340 + ], + [ + 300, + 440 + ], + [ + 400, + 400 + ], + [ + 280, + 430 + ], + [ + 360, + 290 + ], + [ + 380, + 450 + ] + ], + "food-5": [ + [ + 350, + 390 + ], + [ + 310, + 310 + ], + [ + 250, + 360 + ], + [ + 330, + 420 + ], + [ + 390, + 320 + ], + [ + 290, + 330 + ], + [ + 370, + 330 + ], + [ + 270, + 350 + ] + ], + "food-6": [ + [ + 390, + 370 + ], + [ + 350, + 350 + ], + [ + 290, + 400 + ], + [ + 310, + 300 + ], + [ + 410, + 300 + ], + [ + 270, + 470 + ], + [ + 330, + 370 + ], + [ + 370, + 330 + ] + ], + "food-7": [ + [ + 340, + 310 + ], + [ + 320, + 390 + ], + [ + 380, + 420 + ], + [ + 400, + 400 + ], + [ + 420, + 360 + ], + [ + 440, + 370 + ], + [ + 360, + 390 + ], + [ + 300, + 410 + ] + ], + "food-8": [ + [ + 390, + 290 + ], + [ + 430, + 370 + ], + [ + 350, + 280 + ], + [ + 370, + 340 + ], + [ + 330, + 380 + ], + [ + 470, + 390 + ], + [ + 410, + 270 + ], + [ + 450, + 430 + ] + ] + } + }, + { + "index": 16, + "label": "baseline:5-SMs [70-20]", + "experimental_markets": 5, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 340, + 170 + ], + [ + 380, + 540 + ], + [ + 400, + 400 + ], + [ + 420, + 260 + ], + [ + 440, + 310 + ], + [ + 300, + 380 + ], + [ + 320, + 490 + ], + [ + 360, + 490 + ] + ], + "food-2": [ + [ + 390, + 380 + ], + [ + 290, + 470 + ], + [ + 310, + 50 + ], + [ + 410, + 50 + ], + [ + 270, + 660 + ], + [ + 370, + 100 + ], + [ + 350, + 350 + ], + [ + 330, + 420 + ] + ], + "food-3": [ + [ + 390, + 240 + ], + [ + 470, + 260 + ], + [ + 350, + 540 + ], + [ + 450, + 400 + ], + [ + 330, + 520 + ], + [ + 430, + 520 + ], + [ + 370, + 560 + ], + [ + 410, + 140 + ] + ], + "food-4": [ + [ + 390, + 30 + ], + [ + 450, + 400 + ], + [ + 350, + 120 + ], + [ + 330, + 470 + ], + [ + 430, + 590 + ], + [ + 470, + 310 + ], + [ + 370, + 70 + ], + [ + 410, + 0 + ] + ], + "food-5": [ + [ + 350, + 450 + ], + [ + 250, + 330 + ], + [ + 330, + 470 + ], + [ + 390, + 120 + ], + [ + 290, + 170 + ], + [ + 270, + 170 + ], + [ + 310, + 210 + ], + [ + 370, + 280 + ] + ], + "food-6": [ + [ + 390, + 100 + ], + [ + 350, + 50 + ], + [ + 370, + 190 + ], + [ + 330, + 330 + ], + [ + 470, + 380 + ], + [ + 450, + 450 + ], + [ + 430, + 420 + ], + [ + 410, + 70 + ] + ], + "food-7": [ + [ + 380, + 310 + ], + [ + 340, + 190 + ], + [ + 420, + 330 + ], + [ + 360, + 540 + ], + [ + 300, + 240 + ], + [ + 320, + 240 + ], + [ + 440, + 140 + ], + [ + 400, + 350 + ] + ], + "food-8": [ + [ + 310, + 520 + ], + [ + 370, + 120 + ], + [ + 330, + 260 + ], + [ + 290, + 190 + ], + [ + 350, + 450 + ], + [ + 270, + 590 + ], + [ + 390, + 280 + ], + [ + 410, + 210 + ] + ] + } + }, + { + "index": 17, + "label": "baseline:5-SMs [70-70]", + "experimental_markets": 5, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 330, + 310 + ], + [ + 540, + 140 + ], + [ + 190, + 190 + ], + [ + 400, + 350 + ], + [ + 50, + 240 + ], + [ + 120, + 240 + ], + [ + 470, + 330 + ], + [ + 260, + 540 + ] + ], + "food-2": [ + [ + 240, + 100 + ], + [ + 380, + 420 + ], + [ + 100, + 50 + ], + [ + 310, + 70 + ], + [ + 520, + 380 + ], + [ + 450, + 450 + ], + [ + 170, + 190 + ], + [ + 30, + 330 + ] + ], + "food-3": [ + [ + 240, + 240 + ], + [ + 170, + 560 + ], + [ + 520, + 260 + ], + [ + 310, + 140 + ], + [ + 30, + 520 + ], + [ + 380, + 520 + ], + [ + 100, + 540 + ], + [ + 450, + 400 + ] + ], + "food-4": [ + [ + 350, + 450 + ], + [ + 210, + 210 + ], + [ + 0, + 330 + ], + [ + 420, + 280 + ], + [ + 140, + 170 + ], + [ + 70, + 170 + ], + [ + 280, + 470 + ], + [ + 490, + 120 + ] + ], + "food-5": [ + [ + 190, + 170 + ], + [ + 120, + 490 + ], + [ + 330, + 540 + ], + [ + 260, + 490 + ], + [ + 540, + 310 + ], + [ + 50, + 380 + ], + [ + 400, + 400 + ], + [ + 470, + 260 + ] + ], + "food-6": [ + [ + 210, + 520 + ], + [ + 490, + 280 + ], + [ + 420, + 120 + ], + [ + 560, + 210 + ], + [ + 350, + 450 + ], + [ + 70, + 590 + ], + [ + 280, + 260 + ], + [ + 140, + 190 + ] + ], + "food-7": [ + [ + 240, + 30 + ], + [ + 170, + 70 + ], + [ + 450, + 400 + ], + [ + 310, + 0 + ], + [ + 380, + 590 + ], + [ + 520, + 310 + ], + [ + 100, + 120 + ], + [ + 30, + 470 + ] + ], + "food-8": [ + [ + 490, + 380 + ], + [ + 350, + 350 + ], + [ + 140, + 470 + ], + [ + 280, + 420 + ], + [ + 70, + 660 + ], + [ + 420, + 100 + ], + [ + 210, + 50 + ], + [ + 560, + 50 + ] + ] + } + }, + { + "index": 18, + "label": "1-sided:unique-SM [generic_udif20]", + "experimental_markets": 5, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 280, + 160 + ], + [ + 240, + 300 + ], + [ + 300, + 420 + ], + [ + 340, + 310 + ], + [ + 380, + 470 + ], + [ + 260, + 110 + ], + [ + 360, + 570 + ], + [ + 320, + 350 + ] + ], + "food-2": [ + [ + 295, + 240 + ], + [ + 255, + 320 + ], + [ + 275, + 440 + ], + [ + 315, + 290 + ], + [ + 195, + 490 + ], + [ + 215, + 130 + ], + [ + 175, + 550 + ], + [ + 235, + 310 + ] + ], + "food-3": [ + [ + 460, + 140 + ], + [ + 520, + 360 + ], + [ + 400, + 320 + ], + [ + 480, + 190 + ], + [ + 540, + 510 + ], + [ + 440, + 150 + ], + [ + 500, + 530 + ], + [ + 420, + 430 + ] + ], + "food-4": [ + [ + 280, + 220 + ], + [ + 240, + 280 + ], + [ + 220, + 400 + ], + [ + 300, + 270 + ], + [ + 160, + 530 + ], + [ + 260, + 210 + ], + [ + 180, + 610 + ], + [ + 200, + 370 + ] + ], + "food-5": [ + [ + 410, + 180 + ], + [ + 330, + 260 + ], + [ + 470, + 380 + ], + [ + 430, + 330 + ], + [ + 370, + 450 + ], + [ + 390, + 90 + ], + [ + 350, + 510 + ], + [ + 450, + 410 + ] + ], + "food-6": [ + [ + 330, + 200 + ], + [ + 410, + 340 + ], + [ + 370, + 360 + ], + [ + 350, + 210 + ], + [ + 310, + 430 + ], + [ + 430, + 190 + ], + [ + 290, + 490 + ], + [ + 390, + 390 + ] + ], + "food-7": [ + [ + 450, + 260 + ], + [ + 490, + 240 + ], + [ + 510, + 460 + ], + [ + 430, + 250 + ], + [ + 410, + 410 + ], + [ + 470, + 230 + ], + [ + 390, + 470 + ], + [ + 370, + 290 + ] + ], + "food-8": [ + [ + 570, + 120 + ], + [ + 490, + 220 + ], + [ + 510, + 340 + ], + [ + 550, + 230 + ], + [ + 530, + 390 + ], + [ + 590, + 170 + ], + [ + 610, + 590 + ], + [ + 630, + 330 + ] + ] + } + }, + { + "index": 19, + "label": "1-sided:unique-SM [generic_udif70]", + "experimental_markets": 4, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 240, + 0 + ], + [ + 310, + 210 + ], + [ + 520, + 240 + ], + [ + 380, + 520 + ], + [ + 30, + 140 + ], + [ + 170, + 290 + ], + [ + 100, + 320 + ], + [ + 450, + 420 + ] + ], + "food-2": [ + [ + 520, + 350 + ], + [ + 170, + 280 + ], + [ + 310, + 170 + ], + [ + 240, + 100 + ], + [ + 450, + 420 + ], + [ + 100, + 220 + ], + [ + 30, + 250 + ], + [ + 380, + 350 + ] + ], + "food-3": [ + [ + 360, + 490 + ], + [ + 290, + 490 + ], + [ + 500, + 520 + ], + [ + 220, + 240 + ], + [ + 430, + 70 + ], + [ + 150, + 150 + ], + [ + 80, + 180 + ], + [ + 10, + 0 + ] + ], + "food-4": [ + [ + 350, + 420 + ], + [ + 420, + 350 + ], + [ + 210, + 310 + ], + [ + 490, + 310 + ], + [ + 280, + 210 + ], + [ + 0, + 570 + ], + [ + 70, + 670 + ], + [ + 140, + 280 + ] + ], + "food-5": [ + [ + 530, + 280 + ], + [ + 460, + 0 + ], + [ + 250, + 100 + ], + [ + 390, + 170 + ], + [ + 180, + 0 + ], + [ + 320, + 80 + ], + [ + 600, + 600 + ], + [ + 670, + 140 + ] + ], + "food-6": [ + [ + 70, + 70 + ], + [ + 140, + 140 + ], + [ + 210, + 380 + ], + [ + 350, + 450 + ], + [ + 0, + 280 + ], + [ + 490, + 360 + ], + [ + 420, + 530 + ], + [ + 280, + 210 + ] + ], + "food-7": [ + [ + 140, + 140 + ], + [ + 420, + 420 + ], + [ + 350, + 450 + ], + [ + 490, + 380 + ], + [ + 280, + 350 + ], + [ + 70, + 430 + ], + [ + 0, + 460 + ], + [ + 210, + 70 + ] + ], + "food-8": [ + [ + 200, + 210 + ], + [ + 270, + 70 + ], + [ + 60, + 30 + ], + [ + 340, + 30 + ], + [ + 480, + 490 + ], + [ + 550, + 500 + ], + [ + 410, + 390 + ], + [ + 130, + 490 + ] + ] + } + }, + { + "index": 20, + "label": "1-sided:4-by-4 [Mkt_1]", + "experimental_markets": 5, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 300, + 400 + ], + [ + 400, + 350 + ], + [ + 250, + 250 + ], + [ + 350, + 250 + ], + [ + 50, + 200 + ], + [ + 100, + 150 + ], + [ + 150, + 50 + ], + [ + 200, + 100 + ] + ], + "food-2": [ + [ + 350, + 300 + ], + [ + 400, + 250 + ], + [ + 250, + 200 + ], + [ + 300, + 400 + ], + [ + 100, + 150 + ], + [ + 150, + 50 + ], + [ + 200, + 100 + ], + [ + 50, + 200 + ] + ], + "food-3": [ + [ + 250, + 250 + ], + [ + 350, + 400 + ], + [ + 300, + 400 + ], + [ + 400, + 350 + ], + [ + 150, + 50 + ], + [ + 200, + 100 + ], + [ + 50, + 200 + ], + [ + 100, + 150 + ] + ], + "food-4": [ + [ + 400, + 200 + ], + [ + 250, + 200 + ], + [ + 350, + 300 + ], + [ + 300, + 300 + ], + [ + 200, + 100 + ], + [ + 50, + 0 + ], + [ + 100, + 150 + ], + [ + 150, + 50 + ] + ], + "food-5": [ + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 300, + 500 + ], + [ + 400, + 450 + ], + [ + 250, + 350 + ], + [ + 350, + 350 + ] + ], + "food-6": [ + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 350, + 400 + ], + [ + 400, + 350 + ], + [ + 250, + 300 + ], + [ + 300, + 500 + ] + ], + "food-7": [ + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 250, + 350 + ], + [ + 350, + 500 + ], + [ + 300, + 500 + ], + [ + 400, + 450 + ] + ], + "food-8": [ + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 400, + 300 + ], + [ + 250, + 300 + ], + [ + 350, + 400 + ], + [ + 300, + 400 + ] + ] + } + }, + { + "index": 21, + "label": "1-sided:4-by-4 [Mkt_2]", + "experimental_markets": 5, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 400, + 400 + ], + [ + 500, + 350 + ], + [ + 350, + 250 + ], + [ + 450, + 250 + ], + [ + 50, + 200 + ], + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 200, + 100 + ] + ], + "food-2": [ + [ + 450, + 300 + ], + [ + 500, + 250 + ], + [ + 350, + 200 + ], + [ + 400, + 400 + ], + [ + 100, + 150 + ], + [ + 150, + 50 + ], + [ + 200, + 100 + ], + [ + 50, + 0 + ] + ], + "food-3": [ + [ + 350, + 250 + ], + [ + 450, + 400 + ], + [ + 400, + 400 + ], + [ + 500, + 350 + ], + [ + 150, + 50 + ], + [ + 200, + 100 + ], + [ + 50, + 0 + ], + [ + 100, + 150 + ] + ], + "food-4": [ + [ + 500, + 200 + ], + [ + 350, + 200 + ], + [ + 450, + 300 + ], + [ + 400, + 300 + ], + [ + 200, + 100 + ], + [ + 50, + 0 + ], + [ + 100, + 150 + ], + [ + 150, + 50 + ] + ], + "food-5": [ + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 300, + 400 + ], + [ + 400, + 300 + ], + [ + 250, + 250 + ], + [ + 350, + 200 + ] + ], + "food-6": [ + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 350, + 250 + ], + [ + 400, + 200 + ], + [ + 250, + 200 + ], + [ + 300, + 400 + ] + ], + "food-7": [ + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 250, + 200 + ], + [ + 350, + 400 + ], + [ + 300, + 400 + ], + [ + 400, + 300 + ] + ], + "food-8": [ + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 400, + 150 + ], + [ + 250, + 150 + ], + [ + 350, + 300 + ], + [ + 300, + 250 + ] + ] + } + }, + { + "index": 22, + "label": "1-sided:4-by-4 [Mkt_3]", + "experimental_markets": 5, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 300, + 400 + ], + [ + 450, + 350 + ], + [ + 250, + 250 + ], + [ + 350, + 250 + ], + [ + 50, + 0 + ], + [ + 100, + 150 + ], + [ + 150, + 50 + ], + [ + 200, + 100 + ] + ], + "food-2": [ + [ + 350, + 300 + ], + [ + 400, + 250 + ], + [ + 200, + 200 + ], + [ + 250, + 400 + ], + [ + 100, + 150 + ], + [ + 150, + 50 + ], + [ + 0, + 100 + ], + [ + 50, + 200 + ] + ], + "food-3": [ + [ + 150, + 250 + ], + [ + 250, + 400 + ], + [ + 200, + 400 + ], + [ + 350, + 350 + ], + [ + 150, + 50 + ], + [ + 0, + 100 + ], + [ + 50, + 0 + ], + [ + 100, + 150 + ] + ], + "food-4": [ + [ + 400, + 200 + ], + [ + 250, + 200 + ], + [ + 350, + 300 + ], + [ + 300, + 300 + ], + [ + 200, + 100 + ], + [ + 50, + 0 + ], + [ + 100, + 150 + ], + [ + 150, + 50 + ] + ], + "food-5": [ + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 300, + 400 + ], + [ + 400, + 350 + ], + [ + 250, + 250 + ], + [ + 350, + 250 + ] + ], + "food-6": [ + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 350, + 300 + ], + [ + 400, + 250 + ], + [ + 250, + 200 + ], + [ + 300, + 400 + ] + ], + "food-7": [ + [ + 100, + 0 + ], + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 250, + 250 + ], + [ + 350, + 400 + ], + [ + 300, + 400 + ], + [ + 400, + 350 + ] + ], + "food-8": [ + [ + 150, + 50 + ], + [ + 0, + 150 + ], + [ + 50, + 100 + ], + [ + 100, + 0 + ], + [ + 400, + 200 + ], + [ + 250, + 200 + ], + [ + 350, + 300 + ], + [ + 300, + 300 + ] + ] + } + }, + { + "index": 23, + "label": "1-sided:4-by-4 [Mkt_3_higher_color_payoff]", + "experimental_markets": 4, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 300, + 500 + ], + [ + 100, + 0 + ], + [ + 400, + 350 + ], + [ + 0, + 150 + ], + [ + 350, + 400 + ], + [ + 150, + 50 + ], + [ + 50, + 100 + ], + [ + 250, + 300 + ] + ], + "food-2": [ + [ + 50, + 200 + ], + [ + 400, + 250 + ], + [ + 150, + 50 + ], + [ + 300, + 400 + ], + [ + 100, + 150 + ], + [ + 250, + 200 + ], + [ + 350, + 300 + ], + [ + 200, + 100 + ] + ], + "food-3": [ + [ + 300, + 400 + ], + [ + 0, + 150 + ], + [ + 250, + 300 + ], + [ + 100, + 0 + ], + [ + 400, + 300 + ], + [ + 50, + 100 + ], + [ + 150, + 50 + ], + [ + 350, + 400 + ] + ], + "food-4": [ + [ + 200, + 100 + ], + [ + 400, + 350 + ], + [ + 100, + 150 + ], + [ + 350, + 250 + ], + [ + 50, + 200 + ], + [ + 250, + 250 + ], + [ + 300, + 400 + ], + [ + 150, + 50 + ] + ], + "food-5": [ + [ + 350, + 350 + ], + [ + 50, + 100 + ], + [ + 400, + 450 + ], + [ + 150, + 50 + ], + [ + 300, + 500 + ], + [ + 100, + 0 + ], + [ + 0, + 150 + ], + [ + 250, + 350 + ] + ], + "food-6": [ + [ + 100, + 150 + ], + [ + 350, + 400 + ], + [ + 200, + 100 + ], + [ + 400, + 350 + ], + [ + 150, + 50 + ], + [ + 300, + 400 + ], + [ + 250, + 250 + ], + [ + 50, + 200 + ] + ], + "food-7": [ + [ + 400, + 450 + ], + [ + 150, + 50 + ], + [ + 350, + 500 + ], + [ + 50, + 100 + ], + [ + 250, + 350 + ], + [ + 0, + 150 + ], + [ + 100, + 0 + ], + [ + 300, + 500 + ] + ], + "food-8": [ + [ + 150, + 50 + ], + [ + 250, + 200 + ], + [ + 50, + 0 + ], + [ + 300, + 300 + ], + [ + 200, + 100 + ], + [ + 350, + 300 + ], + [ + 400, + 200 + ], + [ + 100, + 150 + ] + ] + } + }, + { + "index": 24, + "label": "1-sided:5-SMs [20-20shift]", + "experimental_markets": 5, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 500, + 350 + ], + [ + 480, + 310 + ], + [ + 460, + 440 + ], + [ + 440, + 340 + ], + [ + 400, + 390 + ], + [ + 420, + 390 + ], + [ + 540, + 290 + ], + [ + 520, + 380 + ] + ], + "food-2": [ + [ + 470, + 330 + ], + [ + 450, + 350 + ], + [ + 490, + 320 + ], + [ + 350, + 380 + ], + [ + 390, + 370 + ], + [ + 370, + 370 + ], + [ + 410, + 310 + ], + [ + 430, + 420 + ] + ], + "food-3": [ + [ + 510, + 270 + ], + [ + 490, + 250 + ], + [ + 430, + 380 + ], + [ + 450, + 300 + ], + [ + 570, + 430 + ], + [ + 550, + 450 + ], + [ + 530, + 370 + ], + [ + 470, + 340 + ] + ], + "food-4": [ + [ + 510, + 250 + ], + [ + 490, + 230 + ], + [ + 430, + 420 + ], + [ + 550, + 400 + ], + [ + 530, + 490 + ], + [ + 570, + 410 + ], + [ + 470, + 270 + ], + [ + 450, + 320 + ] + ], + "food-5": [ + [ + 510, + 310 + ], + [ + 410, + 370 + ], + [ + 390, + 340 + ], + [ + 470, + 320 + ], + [ + 450, + 450 + ], + [ + 370, + 490 + ], + [ + 490, + 330 + ], + [ + 430, + 360 + ] + ], + "food-6": [ + [ + 460, + 290 + ], + [ + 440, + 290 + ], + [ + 500, + 400 + ], + [ + 520, + 360 + ], + [ + 380, + 470 + ], + [ + 480, + 470 + ], + [ + 420, + 410 + ], + [ + 400, + 440 + ] + ], + "food-7": [ + [ + 430, + 370 + ], + [ + 490, + 330 + ], + [ + 510, + 300 + ], + [ + 390, + 420 + ], + [ + 370, + 510 + ], + [ + 470, + 350 + ], + [ + 450, + 350 + ], + [ + 410, + 300 + ] + ], + "food-8": [ + [ + 460, + 390 + ], + [ + 440, + 270 + ], + [ + 520, + 360 + ], + [ + 480, + 440 + ], + [ + 540, + 410 + ], + [ + 400, + 430 + ], + [ + 420, + 390 + ], + [ + 500, + 400 + ] + ] + } + }, + { + "index": 25, + "label": "1-sided:5-SMs [70-20]", + "experimental_markets": 5, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 340, + 170 + ], + [ + 380, + 540 + ], + [ + 400, + 400 + ], + [ + 420, + 260 + ], + [ + 440, + 310 + ], + [ + 300, + 380 + ], + [ + 320, + 490 + ], + [ + 360, + 490 + ] + ], + "food-2": [ + [ + 390, + 380 + ], + [ + 290, + 470 + ], + [ + 310, + 50 + ], + [ + 410, + 50 + ], + [ + 270, + 660 + ], + [ + 370, + 100 + ], + [ + 350, + 350 + ], + [ + 330, + 420 + ] + ], + "food-3": [ + [ + 390, + 240 + ], + [ + 470, + 260 + ], + [ + 350, + 540 + ], + [ + 450, + 400 + ], + [ + 330, + 520 + ], + [ + 430, + 520 + ], + [ + 370, + 560 + ], + [ + 410, + 140 + ] + ], + "food-4": [ + [ + 390, + 30 + ], + [ + 450, + 400 + ], + [ + 350, + 120 + ], + [ + 330, + 470 + ], + [ + 430, + 590 + ], + [ + 470, + 310 + ], + [ + 370, + 70 + ], + [ + 410, + 0 + ] + ], + "food-5": [ + [ + 350, + 450 + ], + [ + 250, + 330 + ], + [ + 330, + 470 + ], + [ + 390, + 120 + ], + [ + 290, + 170 + ], + [ + 270, + 170 + ], + [ + 310, + 210 + ], + [ + 370, + 280 + ] + ], + "food-6": [ + [ + 390, + 100 + ], + [ + 350, + 50 + ], + [ + 370, + 190 + ], + [ + 330, + 330 + ], + [ + 470, + 380 + ], + [ + 450, + 450 + ], + [ + 430, + 420 + ], + [ + 410, + 70 + ] + ], + "food-7": [ + [ + 380, + 310 + ], + [ + 340, + 190 + ], + [ + 420, + 330 + ], + [ + 360, + 540 + ], + [ + 300, + 240 + ], + [ + 320, + 240 + ], + [ + 440, + 140 + ], + [ + 400, + 350 + ] + ], + "food-8": [ + [ + 310, + 520 + ], + [ + 370, + 120 + ], + [ + 330, + 260 + ], + [ + 290, + 190 + ], + [ + 350, + 450 + ], + [ + 270, + 590 + ], + [ + 390, + 280 + ], + [ + 410, + 210 + ] + ] + } + }, + { + "index": 26, + "label": "1-sided:5-SMs [70-70]", + "experimental_markets": 5, + "n_per_side": 8, + "matrix": { + "food-1": [ + [ + 330, + 310 + ], + [ + 540, + 140 + ], + [ + 190, + 190 + ], + [ + 400, + 350 + ], + [ + 50, + 240 + ], + [ + 120, + 240 + ], + [ + 470, + 330 + ], + [ + 260, + 540 + ] + ], + "food-2": [ + [ + 240, + 100 + ], + [ + 380, + 420 + ], + [ + 100, + 50 + ], + [ + 310, + 70 + ], + [ + 520, + 380 + ], + [ + 450, + 450 + ], + [ + 170, + 190 + ], + [ + 30, + 330 + ] + ], + "food-3": [ + [ + 240, + 240 + ], + [ + 170, + 560 + ], + [ + 520, + 260 + ], + [ + 310, + 140 + ], + [ + 30, + 520 + ], + [ + 380, + 520 + ], + [ + 100, + 540 + ], + [ + 450, + 400 + ] + ], + "food-4": [ + [ + 350, + 450 + ], + [ + 210, + 210 + ], + [ + 0, + 330 + ], + [ + 420, + 280 + ], + [ + 140, + 170 + ], + [ + 70, + 170 + ], + [ + 280, + 470 + ], + [ + 490, + 120 + ] + ], + "food-5": [ + [ + 190, + 170 + ], + [ + 120, + 490 + ], + [ + 330, + 540 + ], + [ + 260, + 490 + ], + [ + 540, + 310 + ], + [ + 50, + 380 + ], + [ + 400, + 400 + ], + [ + 470, + 260 + ] + ], + "food-6": [ + [ + 210, + 520 + ], + [ + 490, + 280 + ], + [ + 420, + 120 + ], + [ + 560, + 210 + ], + [ + 350, + 450 + ], + [ + 70, + 590 + ], + [ + 280, + 260 + ], + [ + 140, + 190 + ] + ], + "food-7": [ + [ + 240, + 30 + ], + [ + 170, + 70 + ], + [ + 450, + 400 + ], + [ + 310, + 0 + ], + [ + 380, + 590 + ], + [ + 520, + 310 + ], + [ + 100, + 120 + ], + [ + 30, + 470 + ] + ], + "food-8": [ + [ + 490, + 380 + ], + [ + 350, + 350 + ], + [ + 140, + 470 + ], + [ + 280, + 420 + ], + [ + 70, + 660 + ], + [ + 420, + 100 + ], + [ + 210, + 50 + ], + [ + 560, + 50 + ] + ] + } + }, + { + "index": 27, + "label": "large:unique-SM [one_aligned]", + "experimental_markets": 3, + "n_per_side": 15, + "matrix": { + "food-1": [ + [ + 700, + 200 + ], + [ + 150, + 200 + ], + [ + 300, + 850 + ], + [ + 600, + 500 + ], + [ + 550, + 650 + ], + [ + 100, + 500 + ], + [ + 400, + 500 + ], + [ + 750, + 500 + ], + [ + 500, + 850 + ], + [ + 800, + 500 + ], + [ + 250, + 500 + ], + [ + 650, + 500 + ], + [ + 200, + 500 + ], + [ + 450, + 500 + ], + [ + 350, + 600 + ] + ], + "food-2": [ + [ + 700, + 800 + ], + [ + 150, + 800 + ], + [ + 300, + 500 + ], + [ + 600, + 600 + ], + [ + 550, + 700 + ], + [ + 100, + 200 + ], + [ + 400, + 600 + ], + [ + 750, + 600 + ], + [ + 500, + 500 + ], + [ + 800, + 600 + ], + [ + 250, + 200 + ], + [ + 650, + 200 + ], + [ + 200, + 600 + ], + [ + 450, + 200 + ], + [ + 350, + 800 + ] + ], + "food-3": [ + [ + 700, + 450 + ], + [ + 150, + 450 + ], + [ + 300, + 400 + ], + [ + 600, + 350 + ], + [ + 550, + 300 + ], + [ + 100, + 250 + ], + [ + 400, + 350 + ], + [ + 750, + 350 + ], + [ + 500, + 400 + ], + [ + 800, + 350 + ], + [ + 250, + 250 + ], + [ + 650, + 250 + ], + [ + 200, + 350 + ], + [ + 450, + 250 + ], + [ + 350, + 450 + ] + ], + "food-4": [ + [ + 700, + 400 + ], + [ + 150, + 400 + ], + [ + 300, + 600 + ], + [ + 600, + 850 + ], + [ + 550, + 500 + ], + [ + 100, + 550 + ], + [ + 400, + 850 + ], + [ + 750, + 850 + ], + [ + 500, + 650 + ], + [ + 800, + 850 + ], + [ + 250, + 150 + ], + [ + 650, + 150 + ], + [ + 200, + 850 + ], + [ + 450, + 150 + ], + [ + 350, + 400 + ] + ], + "food-5": [ + [ + 700, + 500 + ], + [ + 150, + 500 + ], + [ + 300, + 750 + ], + [ + 600, + 550 + ], + [ + 550, + 250 + ], + [ + 100, + 350 + ], + [ + 400, + 550 + ], + [ + 750, + 550 + ], + [ + 500, + 200 + ], + [ + 800, + 550 + ], + [ + 250, + 350 + ], + [ + 650, + 350 + ], + [ + 200, + 550 + ], + [ + 450, + 350 + ], + [ + 350, + 500 + ] + ], + "food-6": [ + [ + 700, + 150 + ], + [ + 150, + 600 + ], + [ + 300, + 150 + ], + [ + 600, + 300 + ], + [ + 550, + 350 + ], + [ + 100, + 400 + ], + [ + 400, + 300 + ], + [ + 750, + 300 + ], + [ + 500, + 300 + ], + [ + 800, + 300 + ], + [ + 250, + 400 + ], + [ + 650, + 400 + ], + [ + 200, + 300 + ], + [ + 450, + 400 + ], + [ + 350, + 150 + ] + ], + "food-7": [ + [ + 700, + 550 + ], + [ + 150, + 550 + ], + [ + 300, + 700 + ], + [ + 600, + 750 + ], + [ + 550, + 800 + ], + [ + 100, + 450 + ], + [ + 400, + 750 + ], + [ + 750, + 750 + ], + [ + 500, + 700 + ], + [ + 800, + 750 + ], + [ + 250, + 450 + ], + [ + 650, + 450 + ], + [ + 200, + 750 + ], + [ + 450, + 450 + ], + [ + 350, + 550 + ] + ], + "food-8": [ + [ + 700, + 300 + ], + [ + 150, + 300 + ], + [ + 300, + 250 + ], + [ + 600, + 200 + ], + [ + 550, + 450 + ], + [ + 100, + 700 + ], + [ + 400, + 200 + ], + [ + 750, + 200 + ], + [ + 500, + 450 + ], + [ + 800, + 200 + ], + [ + 250, + 700 + ], + [ + 650, + 700 + ], + [ + 200, + 200 + ], + [ + 450, + 700 + ], + [ + 350, + 300 + ] + ], + "food-9": [ + [ + 700, + 600 + ], + [ + 150, + 150 + ], + [ + 300, + 200 + ], + [ + 600, + 250 + ], + [ + 550, + 150 + ], + [ + 100, + 150 + ], + [ + 400, + 250 + ], + [ + 750, + 250 + ], + [ + 500, + 150 + ], + [ + 800, + 250 + ], + [ + 250, + 550 + ], + [ + 650, + 550 + ], + [ + 200, + 250 + ], + [ + 450, + 550 + ], + [ + 350, + 200 + ] + ], + "food-10": [ + [ + 700, + 250 + ], + [ + 150, + 650 + ], + [ + 300, + 650 + ], + [ + 600, + 700 + ], + [ + 550, + 200 + ], + [ + 100, + 600 + ], + [ + 400, + 700 + ], + [ + 750, + 700 + ], + [ + 500, + 600 + ], + [ + 800, + 700 + ], + [ + 250, + 600 + ], + [ + 650, + 600 + ], + [ + 200, + 700 + ], + [ + 450, + 600 + ], + [ + 350, + 650 + ] + ], + "food-11": [ + [ + 700, + 650 + ], + [ + 150, + 250 + ], + [ + 300, + 300 + ], + [ + 600, + 450 + ], + [ + 550, + 400 + ], + [ + 100, + 650 + ], + [ + 400, + 450 + ], + [ + 750, + 450 + ], + [ + 500, + 550 + ], + [ + 800, + 450 + ], + [ + 250, + 650 + ], + [ + 650, + 650 + ], + [ + 200, + 150 + ], + [ + 450, + 650 + ], + [ + 350, + 250 + ] + ], + "food-12": [ + [ + 700, + 850 + ], + [ + 150, + 850 + ], + [ + 300, + 550 + ], + [ + 600, + 800 + ], + [ + 550, + 750 + ], + [ + 100, + 300 + ], + [ + 400, + 800 + ], + [ + 750, + 800 + ], + [ + 500, + 800 + ], + [ + 800, + 800 + ], + [ + 250, + 300 + ], + [ + 650, + 300 + ], + [ + 200, + 800 + ], + [ + 450, + 300 + ], + [ + 350, + 850 + ] + ], + "food-13": [ + [ + 700, + 700 + ], + [ + 150, + 700 + ], + [ + 300, + 350 + ], + [ + 600, + 650 + ], + [ + 550, + 600 + ], + [ + 100, + 750 + ], + [ + 400, + 150 + ], + [ + 750, + 650 + ], + [ + 500, + 350 + ], + [ + 800, + 650 + ], + [ + 250, + 750 + ], + [ + 650, + 750 + ], + [ + 200, + 650 + ], + [ + 450, + 750 + ], + [ + 350, + 350 + ] + ], + "food-14": [ + [ + 700, + 350 + ], + [ + 150, + 350 + ], + [ + 300, + 450 + ], + [ + 600, + 400 + ], + [ + 550, + 550 + ], + [ + 100, + 800 + ], + [ + 400, + 400 + ], + [ + 750, + 400 + ], + [ + 500, + 250 + ], + [ + 800, + 400 + ], + [ + 250, + 800 + ], + [ + 650, + 800 + ], + [ + 200, + 400 + ], + [ + 450, + 800 + ], + [ + 350, + 700 + ] + ], + "food-15": [ + [ + 700, + 750 + ], + [ + 150, + 750 + ], + [ + 300, + 800 + ], + [ + 600, + 150 + ], + [ + 550, + 850 + ], + [ + 100, + 850 + ], + [ + 400, + 650 + ], + [ + 750, + 150 + ], + [ + 500, + 750 + ], + [ + 800, + 150 + ], + [ + 250, + 850 + ], + [ + 650, + 850 + ], + [ + 200, + 450 + ], + [ + 450, + 850 + ], + [ + 350, + 750 + ] + ] + } + }, + { + "index": 28, + "label": "large:unique-SM [one_aligned_w_egal_unstale_matching]", + "experimental_markets": 2, + "n_per_side": 15, + "matrix": { + "food-1": [ + [ + 650, + 350 + ], + [ + 700, + 210 + ], + [ + 400, + 400 + ], + [ + 250, + 350 + ], + [ + 600, + 330 + ], + [ + 420, + 500 + ], + [ + 150, + 500 + ], + [ + 480, + 350 + ], + [ + 100, + 350 + ], + [ + 550, + 250 + ], + [ + 200, + 550 + ], + [ + 750, + 450 + ], + [ + 500, + 200 + ], + [ + 450, + 500 + ], + [ + 800, + 100 + ] + ], + "food-2": [ + [ + 600, + 200 + ], + [ + 620, + 450 + ], + [ + 460, + 500 + ], + [ + 440, + 200 + ], + [ + 580, + 600 + ], + [ + 480, + 800 + ], + [ + 400, + 400 + ], + [ + 520, + 200 + ], + [ + 380, + 200 + ], + [ + 560, + 700 + ], + [ + 420, + 600 + ], + [ + 640, + 180 + ], + [ + 540, + 280 + ], + [ + 500, + 600 + ], + [ + 660, + 50 + ] + ], + "food-3": [ + [ + 800, + 250 + ], + [ + 850, + 180 + ], + [ + 470, + 750 + ], + [ + 430, + 250 + ], + [ + 750, + 350 + ], + [ + 500, + 450 + ], + [ + 350, + 450 + ], + [ + 600, + 250 + ], + [ + 300, + 250 + ], + [ + 700, + 300 + ], + [ + 400, + 400 + ], + [ + 900, + 50 + ], + [ + 650, + 150 + ], + [ + 550, + 350 + ], + [ + 950, + 150 + ] + ], + "food-4": [ + [ + 380, + 230 + ], + [ + 400, + 400 + ], + [ + 170, + 250 + ], + [ + 140, + 600 + ], + [ + 370, + 280 + ], + [ + 210, + 350 + ], + [ + 80, + 700 + ], + [ + 270, + 180 + ], + [ + 50, + 750 + ], + [ + 340, + 380 + ], + [ + 110, + 650 + ], + [ + 750, + 310 + ], + [ + 310, + 350 + ], + [ + 240, + 150 + ], + [ + 800, + 70 + ] + ], + "food-5": [ + [ + 650, + 280 + ], + [ + 700, + 280 + ], + [ + 180, + 200 + ], + [ + 150, + 180 + ], + [ + 400, + 400 + ], + [ + 210, + 250 + ], + [ + 80, + 250 + ], + [ + 280, + 280 + ], + [ + 50, + 650 + ], + [ + 350, + 200 + ], + [ + 110, + 150 + ], + [ + 750, + 80 + ], + [ + 310, + 180 + ], + [ + 250, + 430 + ], + [ + 800, + 230 + ] + ], + "food-6": [ + [ + 700, + 380 + ], + [ + 750, + 100 + ], + [ + 300, + 50 + ], + [ + 230, + 300 + ], + [ + 650, + 300 + ], + [ + 400, + 400 + ], + [ + 100, + 600 + ], + [ + 500, + 380 + ], + [ + 50, + 550 + ], + [ + 600, + 350 + ], + [ + 150, + 300 + ], + [ + 800, + 430 + ], + [ + 550, + 300 + ], + [ + 450, + 300 + ], + [ + 850, + 330 + ] + ], + "food-7": [ + [ + 650, + 330 + ], + [ + 700, + 140 + ], + [ + 200, + 650 + ], + [ + 170, + 280 + ], + [ + 600, + 480 + ], + [ + 230, + 650 + ], + [ + 100, + 650 + ], + [ + 330, + 510 + ], + [ + 50, + 600 + ], + [ + 400, + 400 + ], + [ + 130, + 700 + ], + [ + 750, + 330 + ], + [ + 370, + 430 + ], + [ + 300, + 700 + ], + [ + 800, + 80 + ] + ], + "food-8": [ + [ + 300, + 180 + ], + [ + 350, + 180 + ], + [ + 140, + 350 + ], + [ + 120, + 650 + ], + [ + 260, + 450 + ], + [ + 160, + 700 + ], + [ + 80, + 350 + ], + [ + 200, + 600 + ], + [ + 60, + 800 + ], + [ + 240, + 480 + ], + [ + 100, + 350 + ], + [ + 400, + 400 + ], + [ + 220, + 250 + ], + [ + 180, + 750 + ], + [ + 800, + 210 + ] + ], + "food-9": [ + [ + 650, + 490 + ], + [ + 700, + 380 + ], + [ + 200, + 100 + ], + [ + 170, + 500 + ], + [ + 600, + 250 + ], + [ + 250, + 200 + ], + [ + 100, + 150 + ], + [ + 350, + 480 + ], + [ + 50, + 150 + ], + [ + 550, + 150 + ], + [ + 130, + 250 + ], + [ + 750, + 380 + ], + [ + 400, + 400 + ], + [ + 300, + 250 + ], + [ + 800, + 430 + ] + ], + "food-10": [ + [ + 400, + 400 + ], + [ + 700, + 160 + ], + [ + 180, + 150 + ], + [ + 150, + 550 + ], + [ + 380, + 200 + ], + [ + 210, + 300 + ], + [ + 80, + 300 + ], + [ + 280, + 550 + ], + [ + 50, + 700 + ], + [ + 340, + 450 + ], + [ + 110, + 200 + ], + [ + 750, + 200 + ], + [ + 310, + 430 + ], + [ + 250, + 200 + ], + [ + 800, + 120 + ] + ], + "food-11": [ + [ + 550, + 460 + ], + [ + 600, + 120 + ], + [ + 300, + 850 + ], + [ + 250, + 470 + ], + [ + 500, + 180 + ], + [ + 330, + 600 + ], + [ + 150, + 200 + ], + [ + 400, + 400 + ], + [ + 100, + 500 + ], + [ + 470, + 550 + ], + [ + 200, + 500 + ], + [ + 650, + 280 + ], + [ + 430, + 850 + ], + [ + 370, + 470 + ], + [ + 700, + 280 + ] + ], + "food-12": [ + [ + 300, + 550 + ], + [ + 330, + 230 + ], + [ + 160, + 800 + ], + [ + 140, + 700 + ], + [ + 280, + 150 + ], + [ + 180, + 750 + ], + [ + 100, + 750 + ], + [ + 220, + 850 + ], + [ + 80, + 850 + ], + [ + 260, + 850 + ], + [ + 120, + 450 + ], + [ + 370, + 150 + ], + [ + 240, + 750 + ], + [ + 200, + 650 + ], + [ + 400, + 400 + ] + ], + "food-13": [ + [ + 650, + 300 + ], + [ + 700, + 500 + ], + [ + 450, + 550 + ], + [ + 400, + 400 + ], + [ + 600, + 800 + ], + [ + 500, + 850 + ], + [ + 200, + 850 + ], + [ + 540, + 700 + ], + [ + 100, + 300 + ], + [ + 580, + 750 + ], + [ + 300, + 800 + ], + [ + 750, + 500 + ], + [ + 560, + 800 + ], + [ + 520, + 800 + ], + [ + 800, + 250 + ] + ], + "food-14": [ + [ + 530, + 430 + ], + [ + 570, + 330 + ], + [ + 300, + 700 + ], + [ + 250, + 430 + ], + [ + 500, + 500 + ], + [ + 350, + 550 + ], + [ + 150, + 550 + ], + [ + 420, + 450 + ], + [ + 100, + 450 + ], + [ + 460, + 800 + ], + [ + 200, + 750 + ], + [ + 650, + 230 + ], + [ + 440, + 700 + ], + [ + 400, + 400 + ], + [ + 800, + 370 + ] + ], + "food-15": [ + [ + 640, + 150 + ], + [ + 660, + 600 + ], + [ + 500, + 600 + ], + [ + 480, + 150 + ], + [ + 620, + 850 + ], + [ + 520, + 150 + ], + [ + 420, + 800 + ], + [ + 560, + 750 + ], + [ + 400, + 400 + ], + [ + 600, + 500 + ], + [ + 460, + 850 + ], + [ + 680, + 550 + ], + [ + 580, + 650 + ], + [ + 540, + 850 + ], + [ + 700, + 510 + ] + ] + } + }, + { + "index": 29, + "label": "large:unique-SM [generic_non_aligned]", + "experimental_markets": 3, + "n_per_side": 15, + "matrix": { + "food-1": [ + [ + 460, + 570 + ], + [ + 130, + 625 + ], + [ + 625, + 240 + ], + [ + 735, + 405 + ], + [ + 680, + 20 + ], + [ + 295, + 570 + ], + [ + 570, + 20 + ], + [ + 405, + 240 + ], + [ + 240, + 570 + ], + [ + 790, + 295 + ], + [ + 185, + 570 + ], + [ + 75, + 405 + ], + [ + 515, + 240 + ], + [ + 350, + 405 + ], + [ + 20, + 405 + ] + ], + "food-2": [ + [ + 570, + 240 + ], + [ + 240, + 570 + ], + [ + 20, + 515 + ], + [ + 790, + 20 + ], + [ + 680, + 735 + ], + [ + 515, + 130 + ], + [ + 75, + 460 + ], + [ + 735, + 130 + ], + [ + 405, + 240 + ], + [ + 130, + 570 + ], + [ + 460, + 515 + ], + [ + 185, + 20 + ], + [ + 295, + 20 + ], + [ + 625, + 20 + ], + [ + 350, + 240 + ] + ], + "food-3": [ + [ + 405, + 350 + ], + [ + 680, + 460 + ], + [ + 790, + 20 + ], + [ + 570, + 350 + ], + [ + 240, + 570 + ], + [ + 515, + 185 + ], + [ + 625, + 75 + ], + [ + 350, + 460 + ], + [ + 20, + 20 + ], + [ + 460, + 350 + ], + [ + 185, + 625 + ], + [ + 295, + 790 + ], + [ + 735, + 680 + ], + [ + 130, + 790 + ], + [ + 75, + 130 + ] + ], + "food-4": [ + [ + 515, + 185 + ], + [ + 185, + 75 + ], + [ + 240, + 405 + ], + [ + 570, + 130 + ], + [ + 20, + 515 + ], + [ + 625, + 350 + ], + [ + 405, + 570 + ], + [ + 735, + 405 + ], + [ + 350, + 75 + ], + [ + 460, + 405 + ], + [ + 295, + 350 + ], + [ + 130, + 515 + ], + [ + 790, + 130 + ], + [ + 680, + 460 + ], + [ + 75, + 680 + ] + ], + "food-5": [ + [ + 625, + 20 + ], + [ + 75, + 185 + ], + [ + 350, + 570 + ], + [ + 515, + 240 + ], + [ + 680, + 75 + ], + [ + 240, + 790 + ], + [ + 405, + 790 + ], + [ + 20, + 680 + ], + [ + 130, + 790 + ], + [ + 735, + 460 + ], + [ + 570, + 75 + ], + [ + 185, + 735 + ], + [ + 790, + 295 + ], + [ + 460, + 240 + ], + [ + 295, + 735 + ] + ], + "food-6": [ + [ + 130, + 790 + ], + [ + 295, + 790 + ], + [ + 350, + 735 + ], + [ + 75, + 790 + ], + [ + 515, + 405 + ], + [ + 20, + 240 + ], + [ + 240, + 625 + ], + [ + 625, + 350 + ], + [ + 735, + 680 + ], + [ + 185, + 515 + ], + [ + 790, + 460 + ], + [ + 570, + 240 + ], + [ + 460, + 460 + ], + [ + 405, + 735 + ], + [ + 680, + 350 + ] + ], + "food-7": [ + [ + 185, + 460 + ], + [ + 350, + 240 + ], + [ + 515, + 680 + ], + [ + 405, + 295 + ], + [ + 75, + 790 + ], + [ + 680, + 20 + ], + [ + 735, + 350 + ], + [ + 20, + 625 + ], + [ + 460, + 130 + ], + [ + 130, + 75 + ], + [ + 570, + 240 + ], + [ + 790, + 350 + ], + [ + 625, + 185 + ], + [ + 240, + 130 + ], + [ + 295, + 20 + ] + ], + "food-8": [ + [ + 735, + 680 + ], + [ + 680, + 20 + ], + [ + 20, + 350 + ], + [ + 240, + 515 + ], + [ + 75, + 295 + ], + [ + 295, + 735 + ], + [ + 405, + 680 + ], + [ + 515, + 75 + ], + [ + 350, + 735 + ], + [ + 790, + 240 + ], + [ + 460, + 295 + ], + [ + 625, + 185 + ], + [ + 185, + 570 + ], + [ + 570, + 680 + ], + [ + 130, + 185 + ] + ], + "food-9": [ + [ + 75, + 405 + ], + [ + 405, + 405 + ], + [ + 790, + 130 + ], + [ + 130, + 625 + ], + [ + 460, + 130 + ], + [ + 680, + 625 + ], + [ + 240, + 735 + ], + [ + 515, + 295 + ], + [ + 570, + 405 + ], + [ + 20, + 185 + ], + [ + 185, + 735 + ], + [ + 350, + 460 + ], + [ + 735, + 350 + ], + [ + 295, + 295 + ], + [ + 625, + 75 + ] + ], + "food-10": [ + [ + 185, + 735 + ], + [ + 735, + 680 + ], + [ + 790, + 295 + ], + [ + 460, + 460 + ], + [ + 130, + 625 + ], + [ + 75, + 295 + ], + [ + 350, + 405 + ], + [ + 20, + 570 + ], + [ + 625, + 185 + ], + [ + 240, + 680 + ], + [ + 515, + 130 + ], + [ + 570, + 295 + ], + [ + 405, + 790 + ], + [ + 680, + 350 + ], + [ + 295, + 790 + ] + ], + "food-11": [ + [ + 240, + 515 + ], + [ + 515, + 350 + ], + [ + 130, + 790 + ], + [ + 185, + 570 + ], + [ + 460, + 350 + ], + [ + 570, + 515 + ], + [ + 680, + 295 + ], + [ + 75, + 185 + ], + [ + 405, + 625 + ], + [ + 790, + 20 + ], + [ + 625, + 20 + ], + [ + 735, + 625 + ], + [ + 20, + 405 + ], + [ + 350, + 515 + ], + [ + 295, + 570 + ] + ], + "food-12": [ + [ + 625, + 130 + ], + [ + 75, + 130 + ], + [ + 350, + 75 + ], + [ + 460, + 75 + ], + [ + 570, + 240 + ], + [ + 185, + 405 + ], + [ + 515, + 185 + ], + [ + 20, + 790 + ], + [ + 790, + 295 + ], + [ + 240, + 625 + ], + [ + 680, + 405 + ], + [ + 405, + 75 + ], + [ + 130, + 75 + ], + [ + 295, + 570 + ], + [ + 735, + 515 + ] + ], + "food-13": [ + [ + 790, + 295 + ], + [ + 570, + 295 + ], + [ + 405, + 460 + ], + [ + 295, + 735 + ], + [ + 460, + 460 + ], + [ + 130, + 680 + ], + [ + 680, + 240 + ], + [ + 735, + 515 + ], + [ + 185, + 515 + ], + [ + 20, + 790 + ], + [ + 350, + 790 + ], + [ + 625, + 570 + ], + [ + 240, + 515 + ], + [ + 515, + 185 + ], + [ + 75, + 625 + ] + ], + "food-14": [ + [ + 790, + 75 + ], + [ + 295, + 735 + ], + [ + 735, + 625 + ], + [ + 625, + 185 + ], + [ + 460, + 185 + ], + [ + 240, + 460 + ], + [ + 405, + 130 + ], + [ + 350, + 735 + ], + [ + 680, + 350 + ], + [ + 75, + 735 + ], + [ + 570, + 185 + ], + [ + 20, + 680 + ], + [ + 130, + 735 + ], + [ + 185, + 75 + ], + [ + 515, + 460 + ] + ], + "food-15": [ + [ + 240, + 625 + ], + [ + 20, + 515 + ], + [ + 625, + 185 + ], + [ + 405, + 680 + ], + [ + 295, + 680 + ], + [ + 515, + 75 + ], + [ + 130, + 515 + ], + [ + 350, + 20 + ], + [ + 75, + 460 + ], + [ + 790, + 130 + ], + [ + 680, + 680 + ], + [ + 735, + 130 + ], + [ + 570, + 625 + ], + [ + 185, + 625 + ], + [ + 460, + 295 + ] + ] + } + }, + { + "index": 30, + "label": "large:3-SPs [all_3_SPrs]", + "experimental_markets": 2, + "n_per_side": 15, + "matrix": { + "food-1": [ + [ + 1000, + 440 + ], + [ + 20, + 90 + ], + [ + 790, + 160 + ], + [ + 860, + 370 + ], + [ + 160, + 860 + ], + [ + 440, + 20 + ], + [ + 230, + 580 + ], + [ + 90, + 580 + ], + [ + 720, + 790 + ], + [ + 370, + 860 + ], + [ + 580, + 230 + ], + [ + 510, + 930 + ], + [ + 650, + 300 + ], + [ + 300, + 90 + ], + [ + 930, + 510 + ] + ], + "food-2": [ + [ + 230, + 650 + ], + [ + 790, + 300 + ], + [ + 580, + 720 + ], + [ + 300, + 790 + ], + [ + 650, + 230 + ], + [ + 90, + 440 + ], + [ + 440, + 860 + ], + [ + 370, + 790 + ], + [ + 1000, + 370 + ], + [ + 160, + 650 + ], + [ + 720, + 20 + ], + [ + 510, + 300 + ], + [ + 860, + 90 + ], + [ + 930, + 440 + ], + [ + 20, + 440 + ] + ], + "food-3": [ + [ + 1000, + 510 + ], + [ + 370, + 860 + ], + [ + 160, + 1000 + ], + [ + 930, + 510 + ], + [ + 510, + 580 + ], + [ + 650, + 230 + ], + [ + 440, + 790 + ], + [ + 20, + 300 + ], + [ + 230, + 580 + ], + [ + 790, + 790 + ], + [ + 300, + 790 + ], + [ + 720, + 440 + ], + [ + 580, + 930 + ], + [ + 90, + 1000 + ], + [ + 860, + 370 + ] + ], + "food-4": [ + [ + 860, + 580 + ], + [ + 790, + 230 + ], + [ + 300, + 790 + ], + [ + 90, + 580 + ], + [ + 720, + 790 + ], + [ + 930, + 90 + ], + [ + 230, + 650 + ], + [ + 650, + 90 + ], + [ + 1000, + 160 + ], + [ + 20, + 440 + ], + [ + 160, + 650 + ], + [ + 440, + 20 + ], + [ + 370, + 860 + ], + [ + 510, + 860 + ], + [ + 580, + 300 + ] + ], + "food-5": [ + [ + 580, + 300 + ], + [ + 20, + 440 + ], + [ + 930, + 440 + ], + [ + 440, + 930 + ], + [ + 230, + 650 + ], + [ + 790, + 160 + ], + [ + 720, + 720 + ], + [ + 370, + 930 + ], + [ + 1000, + 300 + ], + [ + 860, + 20 + ], + [ + 510, + 860 + ], + [ + 650, + 90 + ], + [ + 90, + 370 + ], + [ + 300, + 580 + ], + [ + 160, + 160 + ] + ], + "food-6": [ + [ + 720, + 160 + ], + [ + 930, + 510 + ], + [ + 1000, + 90 + ], + [ + 860, + 440 + ], + [ + 20, + 20 + ], + [ + 300, + 860 + ], + [ + 90, + 90 + ], + [ + 160, + 650 + ], + [ + 440, + 930 + ], + [ + 230, + 720 + ], + [ + 510, + 160 + ], + [ + 370, + 860 + ], + [ + 580, + 230 + ], + [ + 790, + 230 + ], + [ + 650, + 790 + ] + ], + "food-7": [ + [ + 580, + 790 + ], + [ + 20, + 650 + ], + [ + 720, + 300 + ], + [ + 510, + 300 + ], + [ + 370, + 930 + ], + [ + 230, + 720 + ], + [ + 790, + 20 + ], + [ + 650, + 160 + ], + [ + 160, + 720 + ], + [ + 300, + 580 + ], + [ + 90, + 580 + ], + [ + 930, + 160 + ], + [ + 860, + 510 + ], + [ + 1000, + 20 + ], + [ + 440, + 230 + ] + ], + "food-8": [ + [ + 790, + 20 + ], + [ + 90, + 1000 + ], + [ + 230, + 650 + ], + [ + 510, + 860 + ], + [ + 1000, + 440 + ], + [ + 930, + 510 + ], + [ + 370, + 510 + ], + [ + 720, + 720 + ], + [ + 440, + 1000 + ], + [ + 650, + 300 + ], + [ + 860, + 370 + ], + [ + 20, + 230 + ], + [ + 580, + 440 + ], + [ + 160, + 650 + ], + [ + 300, + 1000 + ] + ], + "food-9": [ + [ + 230, + 720 + ], + [ + 1000, + 20 + ], + [ + 510, + 860 + ], + [ + 20, + 20 + ], + [ + 930, + 510 + ], + [ + 370, + 1000 + ], + [ + 160, + 1000 + ], + [ + 650, + 230 + ], + [ + 580, + 440 + ], + [ + 860, + 370 + ], + [ + 790, + 90 + ], + [ + 440, + 1000 + ], + [ + 300, + 720 + ], + [ + 720, + 720 + ], + [ + 90, + 90 + ] + ], + "food-10": [ + [ + 230, + 860 + ], + [ + 1000, + 160 + ], + [ + 90, + 510 + ], + [ + 720, + 720 + ], + [ + 930, + 370 + ], + [ + 440, + 580 + ], + [ + 370, + 930 + ], + [ + 860, + 510 + ], + [ + 20, + 230 + ], + [ + 510, + 930 + ], + [ + 300, + 930 + ], + [ + 650, + 370 + ], + [ + 580, + 160 + ], + [ + 160, + 790 + ], + [ + 790, + 20 + ] + ], + "food-11": [ + [ + 370, + 1000 + ], + [ + 440, + 580 + ], + [ + 930, + 370 + ], + [ + 160, + 650 + ], + [ + 230, + 720 + ], + [ + 720, + 790 + ], + [ + 580, + 230 + ], + [ + 510, + 860 + ], + [ + 1000, + 20 + ], + [ + 650, + 230 + ], + [ + 790, + 300 + ], + [ + 860, + 580 + ], + [ + 90, + 580 + ], + [ + 300, + 930 + ], + [ + 20, + 580 + ] + ], + "food-12": [ + [ + 580, + 930 + ], + [ + 1000, + 370 + ], + [ + 160, + 930 + ], + [ + 720, + 230 + ], + [ + 440, + 1000 + ], + [ + 650, + 300 + ], + [ + 860, + 370 + ], + [ + 20, + 370 + ], + [ + 230, + 860 + ], + [ + 930, + 510 + ], + [ + 370, + 510 + ], + [ + 90, + 650 + ], + [ + 790, + 790 + ], + [ + 510, + 510 + ], + [ + 300, + 860 + ] + ], + "food-13": [ + [ + 440, + 370 + ], + [ + 370, + 930 + ], + [ + 650, + 230 + ], + [ + 510, + 90 + ], + [ + 1000, + 90 + ], + [ + 230, + 650 + ], + [ + 860, + 440 + ], + [ + 790, + 440 + ], + [ + 160, + 650 + ], + [ + 300, + 90 + ], + [ + 580, + 720 + ], + [ + 930, + 510 + ], + [ + 20, + 650 + ], + [ + 720, + 160 + ], + [ + 90, + 650 + ] + ], + "food-14": [ + [ + 650, + 90 + ], + [ + 300, + 720 + ], + [ + 720, + 20 + ], + [ + 90, + 1000 + ], + [ + 930, + 300 + ], + [ + 370, + 930 + ], + [ + 510, + 300 + ], + [ + 160, + 1000 + ], + [ + 860, + 510 + ], + [ + 1000, + 160 + ], + [ + 20, + 1000 + ], + [ + 580, + 790 + ], + [ + 790, + 20 + ], + [ + 440, + 300 + ], + [ + 230, + 720 + ] + ], + "food-15": [ + [ + 720, + 230 + ], + [ + 650, + 790 + ], + [ + 160, + 580 + ], + [ + 580, + 160 + ], + [ + 790, + 160 + ], + [ + 1000, + 370 + ], + [ + 230, + 160 + ], + [ + 860, + 20 + ], + [ + 90, + 90 + ], + [ + 300, + 1000 + ], + [ + 930, + 440 + ], + [ + 20, + 720 + ], + [ + 370, + 1000 + ], + [ + 510, + 370 + ], + [ + 440, + 930 + ] + ] + } + }, + { + "index": 31, + "label": "large:3-SPs [3_or_2_SPrs_avg_2.87]", + "experimental_markets": 2, + "n_per_side": 15, + "matrix": { + "food-1": [ + [ + 300, + 790 + ], + [ + 370, + 860 + ], + [ + 650, + 90 + ], + [ + 230, + 650 + ], + [ + 510, + 860 + ], + [ + 930, + 90 + ], + [ + 580, + 300 + ], + [ + 20, + 440 + ], + [ + 720, + 790 + ], + [ + 860, + 580 + ], + [ + 440, + 20 + ], + [ + 160, + 650 + ], + [ + 1000, + 160 + ], + [ + 90, + 580 + ], + [ + 790, + 230 + ] + ], + "food-2": [ + [ + 650, + 230 + ], + [ + 20, + 650 + ], + [ + 790, + 440 + ], + [ + 860, + 440 + ], + [ + 720, + 160 + ], + [ + 230, + 650 + ], + [ + 90, + 650 + ], + [ + 300, + 90 + ], + [ + 1000, + 90 + ], + [ + 440, + 370 + ], + [ + 930, + 510 + ], + [ + 580, + 720 + ], + [ + 160, + 650 + ], + [ + 510, + 90 + ], + [ + 370, + 930 + ] + ], + "food-3": [ + [ + 90, + 510 + ], + [ + 580, + 160 + ], + [ + 860, + 510 + ], + [ + 370, + 930 + ], + [ + 160, + 790 + ], + [ + 440, + 580 + ], + [ + 790, + 20 + ], + [ + 510, + 930 + ], + [ + 930, + 370 + ], + [ + 230, + 860 + ], + [ + 650, + 370 + ], + [ + 300, + 930 + ], + [ + 20, + 230 + ], + [ + 720, + 720 + ], + [ + 1000, + 160 + ] + ], + "food-4": [ + [ + 160, + 930 + ], + [ + 790, + 790 + ], + [ + 20, + 370 + ], + [ + 860, + 370 + ], + [ + 510, + 510 + ], + [ + 650, + 300 + ], + [ + 300, + 860 + ], + [ + 930, + 510 + ], + [ + 440, + 1000 + ], + [ + 580, + 930 + ], + [ + 90, + 650 + ], + [ + 370, + 510 + ], + [ + 230, + 860 + ], + [ + 720, + 230 + ], + [ + 1000, + 370 + ] + ], + "food-5": [ + [ + 930, + 370 + ], + [ + 90, + 580 + ], + [ + 510, + 860 + ], + [ + 580, + 230 + ], + [ + 300, + 930 + ], + [ + 720, + 790 + ], + [ + 20, + 580 + ], + [ + 650, + 230 + ], + [ + 230, + 720 + ], + [ + 370, + 1000 + ], + [ + 860, + 580 + ], + [ + 790, + 300 + ], + [ + 1000, + 20 + ], + [ + 160, + 650 + ], + [ + 440, + 580 + ] + ], + "food-6": [ + [ + 720, + 20 + ], + [ + 790, + 20 + ], + [ + 160, + 1000 + ], + [ + 510, + 300 + ], + [ + 440, + 300 + ], + [ + 370, + 930 + ], + [ + 230, + 720 + ], + [ + 1000, + 160 + ], + [ + 930, + 300 + ], + [ + 650, + 90 + ], + [ + 580, + 790 + ], + [ + 20, + 1000 + ], + [ + 860, + 510 + ], + [ + 90, + 1000 + ], + [ + 300, + 720 + ] + ], + "food-7": [ + [ + 230, + 650 + ], + [ + 580, + 440 + ], + [ + 720, + 720 + ], + [ + 370, + 510 + ], + [ + 160, + 650 + ], + [ + 930, + 510 + ], + [ + 300, + 1000 + ], + [ + 650, + 300 + ], + [ + 1000, + 440 + ], + [ + 790, + 20 + ], + [ + 20, + 230 + ], + [ + 860, + 370 + ], + [ + 440, + 1000 + ], + [ + 510, + 860 + ], + [ + 90, + 1000 + ] + ], + "food-8": [ + [ + 580, + 720 + ], + [ + 860, + 90 + ], + [ + 370, + 790 + ], + [ + 440, + 860 + ], + [ + 930, + 440 + ], + [ + 90, + 440 + ], + [ + 20, + 440 + ], + [ + 160, + 650 + ], + [ + 650, + 230 + ], + [ + 230, + 650 + ], + [ + 510, + 300 + ], + [ + 720, + 20 + ], + [ + 1000, + 370 + ], + [ + 300, + 790 + ], + [ + 790, + 300 + ] + ], + "food-9": [ + [ + 160, + 1000 + ], + [ + 580, + 930 + ], + [ + 20, + 300 + ], + [ + 440, + 790 + ], + [ + 90, + 1000 + ], + [ + 650, + 230 + ], + [ + 860, + 370 + ], + [ + 790, + 79 + ], + [ + 510, + 580 + ], + [ + 1000, + 510 + ], + [ + 720, + 440 + ], + [ + 300, + 790 + ], + [ + 230, + 580 + ], + [ + 930, + 510 + ], + [ + 370, + 860 + ] + ], + "food-10": [ + [ + 1000, + 90 + ], + [ + 580, + 230 + ], + [ + 160, + 650 + ], + [ + 90, + 90 + ], + [ + 790, + 230 + ], + [ + 300, + 860 + ], + [ + 650, + 790 + ], + [ + 230, + 720 + ], + [ + 20, + 20 + ], + [ + 720, + 160 + ], + [ + 370, + 860 + ], + [ + 510, + 160 + ], + [ + 440, + 930 + ], + [ + 860, + 440 + ], + [ + 930, + 510 + ] + ], + "food-11": [ + [ + 720, + 300 + ], + [ + 860, + 510 + ], + [ + 650, + 160 + ], + [ + 790, + 20 + ], + [ + 1000, + 20 + ], + [ + 230, + 720 + ], + [ + 440, + 230 + ], + [ + 300, + 580 + ], + [ + 370, + 930 + ], + [ + 580, + 790 + ], + [ + 930, + 160 + ], + [ + 90, + 580 + ], + [ + 160, + 720 + ], + [ + 510, + 300 + ], + [ + 20, + 650 + ] + ], + "food-12": [ + [ + 790, + 160 + ], + [ + 650, + 300 + ], + [ + 90, + 580 + ], + [ + 230, + 580 + ], + [ + 300, + 90 + ], + [ + 440, + 20 + ], + [ + 930, + 510 + ], + [ + 370, + 860 + ], + [ + 160, + 860 + ], + [ + 1000, + 440 + ], + [ + 510, + 930 + ], + [ + 580, + 230 + ], + [ + 720, + 790 + ], + [ + 860, + 370 + ], + [ + 20, + 90 + ] + ], + "food-13": [ + [ + 510, + 860 + ], + [ + 300, + 720 + ], + [ + 650, + 230 + ], + [ + 160, + 1000 + ], + [ + 720, + 720 + ], + [ + 370, + 1000 + ], + [ + 90, + 90 + ], + [ + 860, + 370 + ], + [ + 930, + 510 + ], + [ + 230, + 720 + ], + [ + 440, + 1000 + ], + [ + 790, + 90 + ], + [ + 580, + 440 + ], + [ + 20, + 20 + ], + [ + 1000, + 20 + ] + ], + "food-14": [ + [ + 160, + 580 + ], + [ + 370, + 1000 + ], + [ + 860, + 20 + ], + [ + 230, + 160 + ], + [ + 510, + 370 + ], + [ + 1000, + 370 + ], + [ + 440, + 930 + ], + [ + 300, + 1000 + ], + [ + 790, + 160 + ], + [ + 720, + 230 + ], + [ + 20, + 720 + ], + [ + 930, + 440 + ], + [ + 90, + 90 + ], + [ + 580, + 160 + ], + [ + 650, + 790 + ] + ], + "food-15": [ + [ + 930, + 440 + ], + [ + 90, + 370 + ], + [ + 370, + 930 + ], + [ + 720, + 720 + ], + [ + 300, + 580 + ], + [ + 790, + 160 + ], + [ + 160, + 160 + ], + [ + 860, + 20 + ], + [ + 230, + 650 + ], + [ + 580, + 300 + ], + [ + 650, + 90 + ], + [ + 510, + 860 + ], + [ + 1000, + 300 + ], + [ + 440, + 930 + ], + [ + 20, + 440 + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/studies/study_018/source/evidence.json b/studies/study_018/source/evidence.json new file mode 100644 index 0000000..2cde5f0 --- /dev/null +++ b/studies/study_018/source/evidence.json @@ -0,0 +1,152 @@ +{ + "_description": "Complete evidence and provenance record. Every substantive claim, design parameter, or material used elsewhere in this package (materials/, task/, evaluation/, audit/) is traceable to one entry here. 'location' cites the page/section of input/paper.pdf unless another source file is named. Evidence labels: verbatim (quoted/transcribed exactly), reported (faithfully paraphrased), derived (transformed, derivation stated), missing (unavailable, left for researcher).", + "entries": [ + { + "id": "design_two_sided_market", + "claim": "Decentralized one-to-one, two-sided market with no transfers; sides called 'foods' and 'colors'; participants fully informed of everyone's payoffs (all F x C match payoffs); unmatched agent earns 0.", + "evidence_label": "reported", + "source": "paper.pdf", + "location": "Section 4, 'Experimental Design', p.10" + }, + { + "id": "design_offer_mechanics", + "claim": "At any point a participant may propose to any member of the opposite side (matched or not), one outstanding offer at a time; a received offer must be answered within 10 seconds or is auto-rejected; accepting a new offer breaks any existing (tentative) match; a market/round ends after 30 seconds elapse with no new offer.", + "evidence_label": "verbatim/reported mix; timing figures (10s, 30s) verbatim", + "source": "paper.pdf and input/open_materials/instructions.pdf", + "location": "paper.pdf Section 4 p.10; instructions.pdf slides 'Making Offers', 'Response to Offers', 'The End of a Round'" + }, + { + "id": "design_main_treatment_sizes", + "claim": "Three main treatments use 8 participants per side (both sides may propose); 5 sessions, 2 practice + 10 real rounds each (fewer in one session); 85 usable experimental-market rounds after dropping 5 malfunctioning markets.", + "evidence_label": "reported", + "source": "paper.pdf", + "location": "Section 4, p.10-11 and footnote 8" + }, + { + "id": "design_market_structures", + "claim": "Three market-structure conditions by number of stable partners per agent: (1) unique stable matching (every agent has exactly 1 stable partner); (2) two embedded 4x4 sub-markets (most agents have 2 stable partners, avg 1.75); (3) five stable matchings with exactly 3 stable partners per agent.", + "evidence_label": "reported", + "source": "paper.pdf", + "location": "Table 1 and surrounding text, p.11-13" + }, + { + "id": "design_cardinal_variation", + "claim": "For each ordinal market, several cardinal (dollar-value) representations were used, varying utilitarian welfare, marginal utility differences between successively ranked partners (e.g. 20 cents vs 70 cents), and correlation/alignment of preferences across sides -- to test whether cardinal payoffs (not just ordinal ranks) affect which stable matching is selected.", + "evidence_label": "reported", + "source": "paper.pdf", + "location": "Section 4, p.11-14" + }, + { + "id": "design_auxiliary_unilateral", + "claim": "Auxiliary 'unilateral offers' treatment: 8-per-side markets identical to main treatments except only foods may propose offers (colors may only accept/reject). 4 sessions; one session dropped for a termination-rule software glitch; 43 usable experimental markets.", + "evidence_label": "reported", + "source": "paper.pdf", + "location": "Section 4 p.14 and Section 6, p.21-25, footnote 11" + }, + { + "id": "design_auxiliary_large", + "claim": "Auxiliary 'large markets' treatment: 15 participants per side (instead of 8), both sides propose, otherwise as main treatment. 3 sessions, 12 usable experimental markets; markets with a unique stable matching or with 3 stable partners.", + "evidence_label": "reported", + "source": "paper.pdf", + "location": "Section 4 p.14, Section 6 p.21, 25, footnote 11" + }, + { + "id": "design_lab_and_subjects", + "claim": "Run at the California Social Science Experimental Laboratory (CASSEL) using a modified version of 'multi-stage' software; participants were UCLA undergraduates; each participant took part in only one session; $5 show-up fee; average total pay $40 (main), $33 (unilateral), $24 (large).", + "evidence_label": "verbatim (payment figures) / reported (rest)", + "source": "paper.pdf", + "location": "Section 4 p.14-15" + }, + { + "id": "instructions_script", + "claim": "Full participant instruction slide deck for the main (8-per-side, bilateral) treatment.", + "evidence_label": "verbatim", + "source": "input/open_materials/instructions.pdf", + "location": "all pages; transcribed in materials/instructions_script.json" + }, + { + "id": "payoff_matrices_all", + "claim": "31 cardinal payoff-matrix treatments (7 unique-SM baseline, 6 4-by-4 baseline, 4 5-SM baseline, 2 unique-SM one-sided, 4 4-by-4 one-sided, 3 5-SM one-sided, 3 large unique-SM, 2 large 3-stable-partner), each with per-cell (food payoff, color payoff) in cents.", + "evidence_label": "verbatim", + "source": "input/open_materials/Payoff Matrices.txt", + "location": "full file; transcribed in materials/payoff_matrices_verbatim.json", + "verification_note": "Brute-force stable-matching enumeration (permutation search) over the transcribed matrices confirms treatment #1 (unique-SM/two_aligned) has exactly 1 stable matching, #8 (4-by-4/Mkt_1) has exactly 4, and #15 (5-SM/20-20) has exactly 5 -- consistent with the paper's Table 1 counts, corroborating the transcription." + }, + { + "id": "finding_stability_rate_main", + "claim": "88.24% of main-treatment markets (75/85) reach a fully stable matching; 95.44% of matched pairs have no blocking partner on average; even unstable markets are 'close' to stable (median payoff loss from not exploiting the best blocking opportunity is 2.1% / about 10 cents).", + "evidence_label": "verbatim (percentages) / reported", + "source": "paper.pdf", + "location": "Section 5.1, Table 2, p.15-19" + }, + { + "id": "finding_stability_by_structure", + "claim": "Stability rate by market structure (main treatments): unique stable matching 90.00%, two embedded 4-by-4 94.29%, five stable matchings 75.00%.", + "evidence_label": "verbatim", + "source": "paper.pdf", + "location": "Table 2, p.17" + }, + { + "id": "finding_median_dominance", + "claim": "In markets with three stable partners (five market-wide stable matchings): 80% of market-wide stable matchings are the median stable matching (0% food-optimal, 0% color-optimal); at the individual match level, 77% of stable matches are median-stable matches.", + "evidence_label": "verbatim", + "source": "paper.pdf", + "location": "Section 5.2, Table 3 (top panel, 'All' column), p.19-21" + }, + { + "id": "finding_cardinal_effect", + "claim": "The side of the market with steeper marginal cardinal incentives ('more to lose') achieves its most-preferred stable matching more often -- e.g. across the four 5-stable-matching cardinal variants, % median|stable ranges 60-100% and food/color-optimal shares shift with the 20/70-cent marginal-difference manipulation (Table 3).", + "evidence_label": "verbatim", + "source": "paper.pdf", + "location": "Table 3 and Section 7, p.19-27" + }, + { + "id": "finding_unilateral_comparison", + "claim": "With unilateral (foods-only) offers: 60.47% of markets (26/43) reach a stable matching (vs 88.24% main); 83.30% of pairs have no blocking partner (vs 95.44%); median stable matching remains modal (80% median|stable in 5-SM markets, same as main); foods (the proposing side) achieve their optimal stable matching far more often (86% of 4-stable-matching markets vs 27% in main).", + "evidence_label": "verbatim", + "source": "paper.pdf", + "location": "Table 4, Table 3 (bottom panel), Section 6, p.21-25" + }, + { + "id": "finding_large_market_comparison", + "claim": "Large (15-per-side) markets: 66.67% of markets (8/12) reach a stable matching; 93.33% of pairs have no blocking partner; convergence slower (avg 4.47 min to final matching vs 1.62 min in main); every agent with three stable partners matches with their median stable partner (market-wide stable matchings are exclusively median).", + "evidence_label": "verbatim", + "source": "paper.pdf", + "location": "Table 4, Section 6, p.25, 934-956" + }, + { + "id": "finding_convergence_speed", + "claim": "Main treatments: average 1.62 minutes (sd 1.00) to final matching, average 44.8/39.7/59.2 offers (unique/4x4/5-SM) with 8x8=64 possible directional offers; 89% of markets terminate before 5 minutes.", + "evidence_label": "verbatim", + "source": "paper.pdf", + "location": "Section 5.1 p.18-19, Table 5 p.33" + }, + { + "id": "finding_strategic_targeting", + "claim": "Proposers are more likely to target blocking partners (probability of offering to a blocking partner ~0.15 higher than to a non-blocking partner) and more likely to target blocking partners who gain more from the match; not all offers to blocking partners are accepted (offers to blocking pairs accepted 60.5% early vs higher later); agents avoid the theoretically-possible indefinite cycles of blocking pairs that naive sequential-blocking-pair or DA-type dynamics would produce.", + "evidence_label": "reported", + "source": "paper.pdf", + "location": "Section 8, Table 6, Table 9, p.34-46" + }, + { + "id": "egalitarian_matching_avoidance", + "claim": "In markets containing a salient but unstable egalitarian matching (all agents get equal payoff), participants consistently avoid it in favor of the (unequal) stable matching -- none of the main-treatment egalitarian-matching markets end at the unstable egalitarian outcome.", + "evidence_label": "verbatim", + "source": "paper.pdf", + "location": "Section 7, p.26-27" + }, + { + "id": "simulation_benchmarks_note", + "claim": "The paper also simulates four theoretical dynamic-matching algorithms (2RDA, DACC, RPS, RBR) 10,000 times per market as comparison benchmarks (Tables 7-8). This package's evaluation.py does not reimplement these algorithms as comparison baselines -- see audit/missing_information.json entry 'dynamic_model_benchmarks'.", + "evidence_label": "reported", + "source": "paper.pdf", + "location": "Section 8.4-8.5, Tables 7-8, p.35-43" + }, + { + "id": "appendix_check", + "claim": "input/open_materials/paper/matching_experiment_appendix.pdf (the paper's own Online Appendix) was read in full; it contains additional figures/robustness tables and formal definitions (e.g. match-level cycle) referenced by the main text, but no additional participant-facing instructions, payoff matrices, or materials beyond what is in Payoff Matrices.txt and instructions.pdf.", + "evidence_label": "reported", + "source": "input/open_materials/paper/matching_experiment_appendix.pdf" + } + ] +} diff --git a/studies/study_018/source/paper_metadata.json b/studies/study_018/source/paper_metadata.json new file mode 100644 index 0000000..102802d --- /dev/null +++ b/studies/study_018/source/paper_metadata.json @@ -0,0 +1,27 @@ +{ + "title": "An Experimental Study of Decentralized Matching", + "authors": [ + {"name": "Federico Echenique", "affiliation": "Department of Economics, UC Berkeley"}, + {"name": "Alejandro Robinson-Cortes", "affiliation": "Department of Economics, University of Exeter"}, + {"name": "Leeat Yariv", "affiliation": "Department of Economics, Princeton University"} + ], + "date": "2024-10-14", + "source_file": "input/paper.pdf (contributor filename: matching_experiment.pdf)", + "keywords": ["Decentralized Matching", "Experiments", "Market Design"], + "venue": "unknown (working paper as uploaded; no journal/proceedings header present in the PDF)", + "funding": "National Science Foundation (SES 0963583); Gordon and Betty Moore Foundation (grant 1158)", + "abstract_evidence_label": "verbatim", + "abstract": "We present an experimental study of decentralized two-sided matching markets with no transfers. Experimental participants are informed of everyone's preferences and can make arbitrary non-binding match offers that get finalized when a period of market inactivity has elapsed. Several insights emerge. First, stable outcomes are prevalent. Second, while centralized clearinghouses commonly aim at implementing extremal stable matchings, our decentralized markets most frequently culminate in the median stable matching. Third, preferences' cardinal representations impact the stable partners participants match with. Last, the dynamics underlying our results exhibit strategic sophistication, with agents successfully avoiding cycles of blocking pairs.", + "external_sources": [], + "external_sources_note": "The job's contributor-supplied external-source policy authorized only the uploaded open-materials package (input/open_materials/), not a network-fetched OSF/materials URL. Every source used in this package comes from input/paper.pdf or input/open_materials/. Footnote 7 of the paper mentions a public materials link (https://sites.google.com/view/decentralized-matching) but this package does not fetch it, per the no-network-research instruction; it is recorded here for the researcher's reference only, not as a consulted source.", + "site_mentioned_in_paper_but_not_fetched": "https://sites.google.com/view/decentralized-matching", + "open_materials_supplied": { + "pathname": "input/open_materials/", + "contents": [ + "Payoff Matrices.txt (31 verbatim cardinal payoff-matrix treatments)", + "instructions.pdf (verbatim CASSEL participant instruction slide deck, main treatment)", + "paper/matching_experiment.pdf (duplicate of input/paper.pdf)", + "paper/matching_experiment_appendix.pdf (online appendix; consulted for supplementary detail, no additional participant-facing materials found there)" + ] + } +} diff --git a/studies/study_018/study.json b/studies/study_018/study.json new file mode 100644 index 0000000..aeb0606 --- /dev/null +++ b/studies/study_018/study.json @@ -0,0 +1,68 @@ +{ + "paper": { + "title": "An Experimental Study of Decentralized Matching", + "authors": [ + "Federico Echenique", + "Alejandro Robinson-Cortes", + "Leeat Yariv" + ], + "date": "2024-10-14", + "metadata_file": "source/paper_metadata.json" + }, + "empirical_studies": [ + { + "id": "decentralized_matching_experiment", + "design": "A single experimental paradigm (a decentralized, full-information, one-to-one two-sided matching market with no transfers and non-binding offers) run across three main treatments and two auxiliary treatments, all varying only the market's structural parameters -- see 'conditions' below. There is one underlying study design, not several unrelated experiments.", + "participants": "UCLA undergraduates recruited at the California Social Science Experimental Laboratory (CASSEL); 8 participants per side (main and unilateral treatments) or 15 per side (large-market treatment); each participant took part in one session only, playing several rounds (experimental markets).", + "conditions": [ + { + "name": "Main: unique stable matching", + "n_per_side": 8, + "proposing": "both sides", + "n_experimental_markets_in_paper": 30 + }, + { + "name": "Main: two embedded 4x4 markets", + "n_per_side": 8, + "proposing": "both sides", + "n_experimental_markets_in_paper": 35 + }, + { + "name": "Main: five stable matchings, three stable partners", + "n_per_side": 8, + "proposing": "both sides", + "n_experimental_markets_in_paper": 20 + }, + { + "name": "Auxiliary: unilateral offers (foods propose only)", + "n_per_side": 8, + "proposing": "foods only", + "n_experimental_markets_in_paper": 43 + }, + { + "name": "Auxiliary: large markets", + "n_per_side": 15, + "proposing": "both sides", + "n_experimental_markets_in_paper": 12 + } + ], + "outcomes": [ + "Whether a market's final matching is stable (no blocking pairs)", + "Which stable matching is reached when several exist (median / food-optimal / color-optimal / other)", + "Distance to stability for unstable outcomes (# blocking pairs, payoff loss)", + "Market dynamics: number/timing of offers and matches, offer targeting (blocking pairs, stable partners), cycles" + ] + } + ], + "external_sources_authorized": "Contributor-uploaded open materials only (input/open_materials/); no network research was requested or performed. See source/paper_metadata.json 'external_sources' (empty) and 'external_sources_note'.", + "package_entry_point": "task/adapter.py (run_sessions / --smoke-test); evaluation via evaluation/evaluation.py:evaluate()", + "readiness_status": { + "status": "ready_with_documented_limitations", + "summary": "All 8 condition arms run end-to-end offline (verified via `python task/adapter.py --smoke-test`) using verbatim payoff matrices and, for the main bilateral treatment, verbatim participant instructions. Two categories of departure from the original are documented rather than silently patched: (1) continuous real-time offer/inactivity clocks are discretized into a tick model, and (2) exact median/extremal stable-matching classification is only computed for arms with n_per_side<=9 (the two 15-per-side 'large' arms report stability but not median classification). See audit/missing_information.json for the full list and suggested actions." + }, + "contributors": [ + { + "name": "tanzhou" + } + ] +} diff --git a/studies/study_018/task/__pycache__/adapter.cpython-311.pyc b/studies/study_018/task/__pycache__/adapter.cpython-311.pyc new file mode 100644 index 0000000..1aec4ac Binary files /dev/null and b/studies/study_018/task/__pycache__/adapter.cpython-311.pyc differ diff --git a/studies/study_018/task/adapter.py b/studies/study_018/task/adapter.py new file mode 100644 index 0000000..95126d4 --- /dev/null +++ b/studies/study_018/task/adapter.py @@ -0,0 +1,339 @@ +"""Runnable adapter for the decentralized two-sided matching-market experiment +(Echenique, Robinson-Cortes & Yariv, "An Experimental Study of Decentralized Matching"). + +Every food-side and color-side participant in the original experiment is played here +by an independent call to the injected `llm(prompt) -> str`. No participant's action +is scripted, sampled from a fixed distribution, or pre-computed -- see task/task.json +for the full fidelity rationale and the (documented) real-time-clock discretization. + +Runs fully offline: all payoffs and instructions are read from local JSON files under +materials/; no network access is performed or required. +""" + +import json +import random +import re +from pathlib import Path + +HERE = Path(__file__).resolve().parent +PACKAGE_ROOT = HERE.parent +MATERIALS_DIR = PACKAGE_ROOT / "materials" + +TASK_JSON_PATH = HERE / "task.json" +PAYOFF_MATRICES_PATH = MATERIALS_DIR / "payoff_matrices_verbatim.json" +INSTRUCTIONS_PATH = MATERIALS_DIR / "instructions_script.json" + + +class BlockedError(RuntimeError): + """Raised when a required researcher decision or material is missing.""" + + +def _load_json(path): + if not path.exists(): + raise BlockedError( + "Required material file not found: %s. See audit/missing_information.json." % path + ) + with open(path, "r", encoding="utf-8") as fh: + return json.load(fh) + + +def load_conditions(): + task = _load_json(TASK_JSON_PATH) + return {c["arm"]: c for c in task["conditions"]} + + +def load_payoff_treatment(index): + data = _load_json(PAYOFF_MATRICES_PATH) + for t in data["treatments"]: + if t["index"] == index: + return t + raise BlockedError("payoff_treatment_index %s not found in payoff_matrices_verbatim.json" % index) + + +def build_instructions(condition): + """Return the participant-facing instructions text for a given condition arm. + + The main (bilateral, 8-per-side) arms get the verbatim CASSEL script. Unilateral + and large arms get that same verbatim script with the group-size number and (for + unilateral arms) an explicit proposing-rule sentence substituted in -- these + substitutions are marked 'derived', not verbatim; see materials/instructions_script.json + 'not_covered_by_this_script' and audit/missing_information.json. + """ + doc = _load_json(INSTRUCTIONS_PATH) + slides = [s["text"] for s in doc["slides"]] + text = "\n\n".join(slides) + n = condition["n_per_side"] + if n != 8: + text = text.replace("There will be 8 colors and 8 fruit in your group.", + "There will be %d colors and %d fruit in your group." % (n, n)) + if condition["proposing"] == "unilateral_food_only": + text = text.replace( + "You make an offer by clicking on the name you want to match with (right panel).", + "Only participants assigned the role of \"fruit\" (food) may make offers in this " + "session; if you are a \"color\" you may only accept or reject offers you receive. " + "You make an offer by clicking on the name you want to match with (right panel)." + ) + return text + + +def format_matrix(matrix, n): + foods = ["food-%d" % (i + 1) for i in range(n)] + colors = ["color-%d" % (j + 1) for j in range(n)] + header = " " + " ".join("%9s" % c for c in colors) + lines = [header] + for i, f in enumerate(foods): + row = matrix[f] + cells = ["%4d,%4d" % (row[j][0], row[j][1]) for j in range(n)] + lines.append("%-10s " % f + " ".join(cells)) + return "\n".join(lines) + + +def describe_state(matches, n): + foods = ["food-%d" % (i + 1) for i in range(n)] + parts = [] + for f in foods: + c = matches.get(f) + parts.append("%s: %s" % (f, c if c else "unmatched")) + return "; ".join(parts) + + +def describe_history(history): + if not history: + return "(none yet)" + lines = [] + for h in history: + if h["type"] == "made": + lines.append("You offered %s; it was %s." % (h["target"], h["outcome"])) + elif h["type"] == "received": + lines.append("You received an offer from %s and you %s." % (h["source"], h["outcome"])) + return " ".join(lines) + + +PROPOSE_INSTRUCTIONS = ( + "You are participant '%(role)s' (a %(side)s) in a decentralized matching market. " + "You and everyone else can see every possible match's payoff below. A match pays " + "the two people involved the two numbers shown for their pair; if you end the market " + "unmatched you earn 0. You may, right now, either propose a match to any one member " + "of the opposite side (whether or not they are currently matched), or pass. Offers are " + "not binding until the market ends, and you may later receive or make other offers.\n\n" + "Full payoff matrix (food_payoff, color_payoff for each food-color pair):\n%(matrix)s\n\n" + "Current matches (all tentative): %(state)s\n\n" + "Your own history so far: %(history)s\n\n" + "Reply with exactly one line: either 'PASS' or 'OFFER: ' (e.g. 'OFFER: color-3'). " + "%(target_note)s" +) + +RESPOND_INSTRUCTIONS = ( + "You are participant '%(role)s' (a %(side)s) in a decentralized matching market. " + "You have just received a match offer from %(source)s. You may accept (breaking your " + "current match, if any) or reject. You have full information about everyone's payoffs.\n\n" + "Full payoff matrix (food_payoff, color_payoff for each food-color pair):\n%(matrix)s\n\n" + "Current matches (all tentative, before this offer): %(state)s\n\n" + "Your own history so far: %(history)s\n\n" + "Reply with exactly one line: either 'ACCEPT' or 'REJECT'." +) + + +def _parse_propose(reply, valid_targets): + if not reply: + return ("PASS", None, True) + m = re.search(r"OFFER\s*:\s*([a-zA-Z]+-\d+)", reply, re.IGNORECASE) + if m: + target = m.group(1).lower() + for v in valid_targets: + if v.lower() == target: + return ("OFFER", v, False) + return ("PASS", None, True) + if re.search(r"\bPASS\b", reply, re.IGNORECASE): + return ("PASS", None, False) + return ("PASS", None, True) + + +def _parse_respond(reply): + if not reply: + return ("REJECT", True) + if re.search(r"\bACCEPT\b", reply, re.IGNORECASE): + return ("ACCEPT", False) + if re.search(r"\bREJECT\b", reply, re.IGNORECASE): + return ("REJECT", False) + return ("REJECT", True) + + +def run_market(llm, condition, rng, seed_label): + n = condition["n_per_side"] + treatment = load_payoff_treatment(condition["payoff_treatment_index"]) + matrix = treatment["matrix"] + foods = ["food-%d" % (i + 1) for i in range(n)] + colors = ["color-%d" % (j + 1) for j in range(n)] + bilateral = condition["proposing"] == "bilateral" + proposers = foods + colors if bilateral else list(foods) + + matches = {} # food_role -> color_role, and reverse maintained via lookup + rev_matches = {} # color_role -> food_role + history = {a: [] for a in foods + colors} + events = [] + + task = _load_json(TASK_JSON_PATH) + td = task["timing_discretization"] + size_key = condition["size"] + inactivity_ticks = td["default_inactivity_ticks"][size_key] + max_ticks = td["default_max_ticks"][size_key] + + no_offer_streak = 0 + tick = 0 + terminated_by = "max_ticks" + while tick < max_ticks: + tick += 1 + actor = rng.choice(proposers) + role_side = "food" if actor.startswith("food") else "color" + valid_targets = colors if role_side == "food" else foods + matrix_text = format_matrix(matrix, n) + state_text = describe_state(matches, n) + history_text = describe_history(history[actor]) + prompt = PROPOSE_INSTRUCTIONS % { + "role": actor, + "side": role_side, + "matrix": matrix_text, + "state": state_text, + "history": history_text, + "target_note": "Valid targets: %s." % ", ".join(valid_targets), + } + reply = llm(prompt) + action, target, fallback = _parse_propose(reply, valid_targets) + event = {"tick": tick, "actor": actor, "action": action, "target": target, + "parse_fallback": fallback} + + if action == "PASS": + no_offer_streak += 1 + events.append(event) + else: + no_offer_streak = 0 + recipient = target + matrix_text2 = format_matrix(matrix, n) + state_text2 = describe_state(matches, n) + recipient_side = "color" if role_side == "food" else "food" + history_text2 = describe_history(history[recipient]) + prompt2 = RESPOND_INSTRUCTIONS % { + "role": recipient, + "side": recipient_side, + "source": actor, + "matrix": matrix_text2, + "state": state_text2, + "history": history_text2, + } + reply2 = llm(prompt2) + decision, fallback2 = _parse_respond(reply2) + event["response"] = decision + event["response_parse_fallback"] = fallback2 + events.append(event) + + outcome = "accepted" if decision == "ACCEPT" else "rejected" + history[actor].append({"type": "made", "target": recipient, "outcome": outcome}) + history[recipient].append({"type": "received", "source": actor, "outcome": outcome}) + + if decision == "ACCEPT": + if role_side == "food": + f, c = actor, recipient + else: + f, c = recipient, actor + old_c = matches.get(f) + if old_c: + rev_matches.pop(old_c, None) + old_f = rev_matches.get(c) + if old_f: + matches.pop(old_f, None) + matches[f] = c + rev_matches[c] = f + + if no_offer_streak >= inactivity_ticks: + terminated_by = "inactivity" + break + + final_matching = {f: matches.get(f) for f in foods} + + return { + "arm": condition["arm"], + "structure": condition["structure"], + "proposing": condition["proposing"], + "size": condition["size"], + "n_per_side": n, + "payoff_treatment_index": condition["payoff_treatment_index"], + "seed_label": seed_label, + "events": events, + "final_matching": final_matching, + "n_ticks_used": tick, + "terminated_by": terminated_by, + "payoff_matrix": matrix, + } + + +def run_sessions(llm, seed, n, arms=None, on_session=None): + """Run n sessions (experimental markets) for every condition arm in task.json, + or only the arms named in `arms` when it is provided. + + Returns a flat list of session-log dicts, each carrying its own condition/arm + labels so evaluation.py can group and compare across arms. + """ + conditions = load_conditions() + if arms: + conditions = {name: condition for name, condition in conditions.items() if name in arms} + base_rng = random.Random(seed) + sessions = [] + for arm_name, condition in conditions.items(): + for i in range(n): + session_seed = base_rng.randint(0, 2**31 - 1) + rng = random.Random(session_seed) + seed_label = "%s#%d(seed=%d)" % (arm_name, i, session_seed) + session = run_market(llm, condition, rng, seed_label) + sessions.append(session) + if on_session: + on_session(session) + return sessions + + +def _stub_llm(prompt): + """Deterministic offline stub used only by --smoke-test: a proposer offers the + first untried valid target (or passes if all have been tried), and a recipient + alternates accept/reject based on the prompt's own hash. This is NOT a research + participant model -- it only exists to exercise run_sessions()/evaluate() without + a real model plugged in.""" + if "Reply with exactly one line: either 'PASS' or 'OFFER" in prompt: + targets = re.findall(r"Valid targets: (.+)\.", prompt) + options = [t.strip() for t in targets[0].split(",")] if targets else [] + tried = set(re.findall(r"You offered ([a-zA-Z]+-\d+)", prompt)) + remaining = [o for o in options if o not in tried] + return "OFFER: %s" % remaining[0] if remaining else "PASS" + return "ACCEPT" if hash(prompt) % 2 == 0 else "REJECT" + + +def _smoke_test(): + conditions = load_conditions() + print("Loaded %d condition arms:" % len(conditions), ", ".join(conditions)) + sessions = run_sessions(_stub_llm, seed=1, n=1) + print("Ran %d smoke-test sessions with a deterministic stub LLM (no network)." % len(sessions)) + for s in sessions: + matched = sum(1 for v in s["final_matching"].values() if v) + print(" - %-24s ticks=%3d terminated_by=%-10s matched=%d/%d" % ( + s["arm"], s["n_ticks_used"], s["terminated_by"], matched, s["n_per_side"])) + import sys + sys.path.insert(0, str(HERE.parent / "evaluation")) + try: + from evaluation import evaluate # type: ignore + except Exception: + import importlib.util + spec = importlib.util.spec_from_file_location( + "evaluation", str(HERE.parent / "evaluation" / "evaluation.py")) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + evaluate = mod.evaluate + result = evaluate(sessions) + print("evaluate() returned keys:", list(result.keys())) + print("OK: adapter runs end-to-end without network access.") + + +if __name__ == "__main__": + import sys + if "--smoke-test" in sys.argv: + _smoke_test() + else: + print("Usage: python adapter.py --smoke-test") diff --git a/studies/study_018/task/task.json b/studies/study_018/task/task.json new file mode 100644 index 0000000..8c5b254 --- /dev/null +++ b/studies/study_018/task/task.json @@ -0,0 +1,108 @@ +{ + "_description": "Runnable task definition for the decentralized two-sided matching-market experiment. One 'session' below = one experimental market (one 'round' in the paper): a full group of food-side and color-side agents interacting until the market ends. task/adapter.py's run_sessions() runs the requested number of sessions for every arm listed under 'conditions'.", + "study": "decentralized_matching_experiment", + "entry_point": "task/adapter.py", + "harness_interface": { + "llm_signature": "llm(prompt: str) -> str", + "run_sessions_signature": "run_sessions(llm, seed, n) -> list[dict] # n sessions per condition-arm, every arm below is run", + "evaluate_signature": "evaluate(sessions: list[dict]) -> dict, in evaluation/evaluation.py" + }, + "participant_structure": { + "every_original_subject_is_an_agent": true, + "scripted_roles": [], + "scripted_roles_justification": "The paper's participants were exclusively human subjects recruited at CASSEL (UCLA undergraduates); no confederates, experimenters-in-role, or pre-recorded stimuli stood in for any market participant (source/evidence.json:design_lab_and_subjects). Every food-side and color-side role in every arm below is therefore played by an independent call to the injected llm().", + "agents_per_session": { + "main_treatments": "8 food agents + 8 color agents = 16 independent LLM-driven participants", + "unilateral_treatments": "8 food agents + 8 color agents = 16 independent LLM-driven participants (colors' action space is restricted to accept/reject; they still make their own decisions)", + "large_treatments": "15 food agents + 15 color agents = 30 independent LLM-driven participants" + }, + "order_of_action": "Not fixed by the researcher. As in the original (participants act asynchronously and freely, subject only to a 10-second offer-response window and a 30-second end-of-market inactivity window), the adapter draws, at each discrete tick, one agent uniformly at random from the set of agents currently eligible to initiate an offer (both sides in bilateral arms, food side only in unilateral arms) and asks it to decide. This preserves the property that no participant's turn order is scripted and that the realized order is a genuine consequence of (simulated) independent, uncoordinated agents, matching the paper's decentralized design (paper.pdf Section 4).", + "visibility": { + "full_information": true, + "each_decision_prompt_includes": [ + "the acting agent's own role label (e.g. 'food-3')", + "the complete cardinal payoff matrix for both sides (every food-color pair's [food_payoff, color_payoff]), exactly as participants 'observe all potential payoffs from a numerical matrix on the experimental interface' (source/evidence.json:design_two_sided_market)", + "the current, publicly-visible match board (who is matched to whom right now, including nobody if unmatched) -- visible to all agents, as in the original 'Current Matches' panel", + "the acting agent's own private history of offers it made and received so far this session (with outcomes), since a human participant naturally remembers their own past interactions even though the interface does not broadcast others' offer histories" + ], + "not_shown": "Other agents' offers/rejections that did not involve the acting agent are not shown to the acting agent, matching the original (only accepted offers -- i.e. matches -- become public; the process of making an offer itself is private until/unless accepted)." + }, + "sequential_dependency_preserved": "Because match state and each agent's private history are threaded through the whole session and every subsequent decision (by that agent or any other) reads the live state, one agent's action can and does change what later agents see and how they respond -- e.g. an accepted offer immediately changes the match board every other agent's next prompt shows, exactly as in the original decentralized market. No participant's response is pre-computed, sampled from a fixed distribution, or otherwise decided without a fresh llm() call conditioned on the live state." + }, + "timing_discretization": { + "original_mechanism": "Continuous real time: any participant may act at any instant; a received offer auto-rejects if unanswered after 10 seconds; the market ends after 30 seconds elapse with no new offer of any kind (accepted or not).", + "adapter_mechanism": "Discrete ticks. Each tick draws one eligible proposer uniformly at random and asks it 'offer or pass'; if it offers, the single targeted recipient is immediately asked 'accept or reject' (standing in for the 10-second response window, since a discrete-tick simulation has no wall clock). A running counter of consecutive no-offer ticks stands in for the 30-second inactivity clock: it resets to 0 on any offer (accepted or rejected) and increments on a pass; the market ends when the counter reaches inactivity_ticks, or when max_ticks (a compute-budget safety cap, never reached in the paper's own data) is hit first.", + "evidence_label": "derived", + "departure_from_original_and_likely_effect": "This is a necessary discretization for a turn-based agent harness and is recorded in audit/missing_information.json ('timing_discretization_is_approximate'). It preserves the qualitative properties the fidelity rules require (full information, free asynchronous offers to anyone, tentative matches, non-binding offers, no scripted order) but does not reproduce exact real-time race conditions (e.g. two humans clicking within the same second). The paper itself finds behavior is not sensitive to fine-grained timing, so this is judged a low-risk departure.", + "default_inactivity_ticks": {"main": 16, "unilateral": 16, "large": 30}, + "default_max_ticks": {"main": 300, "unilateral": 300, "large": 900} + }, + "action_protocol": { + "propose_or_pass_prompt": "Given to the randomly-drawn eligible proposer; must reply with either 'PASS' or 'OFFER: ' naming one current member of the opposite side.", + "respond_prompt": "Given to the recipient of a just-made offer; must reply with either 'ACCEPT' or 'REJECT'.", + "parsing": "task/adapter.py parses the first ACCEPT/REJECT or PASS/OFFER token found (case-insensitive); an unparseable reply is treated as PASS / REJECT respectively and logged as a 'parse_fallback' event so evaluation.py and the researcher can see how often this occurred." + }, + "conditions": [ + { + "arm": "main_unique_sm", + "size": "main", "n_per_side": 8, "proposing": "bilateral", "structure": "unique_stable_matching", + "payoff_treatment_index": 6, "payoff_treatment_label": "baseline:unique-SM [generic_udif20]", + "paired_unilateral_arm": "unilateral_unique_sm" + }, + { + "arm": "main_four_by_four", + "size": "main", "n_per_side": 8, "proposing": "bilateral", "structure": "two_embedded_four_by_four", + "payoff_treatment_index": 8, "payoff_treatment_label": "baseline:4-by-4 [Mkt_1]", + "paired_unilateral_arm": "unilateral_four_by_four" + }, + { + "arm": "main_five_stable", + "size": "main", "n_per_side": 8, "proposing": "bilateral", "structure": "five_stable_matchings", + "payoff_treatment_index": 14, "payoff_treatment_label": "baseline:5-SMs [20-20shift]", + "paired_unilateral_arm": "unilateral_five_stable" + }, + { + "arm": "unilateral_unique_sm", + "size": "main", "n_per_side": 8, "proposing": "unilateral_food_only", "structure": "unique_stable_matching", + "payoff_treatment_index": 18, "payoff_treatment_label": "1-sided:unique-SM [generic_udif20]", + "paired_bilateral_arm": "main_unique_sm" + }, + { + "arm": "unilateral_four_by_four", + "size": "main", "n_per_side": 8, "proposing": "unilateral_food_only", "structure": "two_embedded_four_by_four", + "payoff_treatment_index": 20, "payoff_treatment_label": "1-sided:4-by-4 [Mkt_1]", + "paired_bilateral_arm": "main_four_by_four" + }, + { + "arm": "unilateral_five_stable", + "size": "main", "n_per_side": 8, "proposing": "unilateral_food_only", "structure": "five_stable_matchings", + "payoff_treatment_index": 24, "payoff_treatment_label": "1-sided:5-SMs [20-20shift]", + "paired_bilateral_arm": "main_five_stable" + }, + { + "arm": "large_unique_sm", + "size": "large", "n_per_side": 15, "proposing": "bilateral", "structure": "unique_stable_matching", + "payoff_treatment_index": 27, "payoff_treatment_label": "large:unique-SM [one_aligned]" + }, + { + "arm": "large_three_stable", + "size": "large", "n_per_side": 15, "proposing": "bilateral", "structure": "multiple_stable_matchings", + "payoff_treatment_index": 30, "payoff_treatment_label": "large:3-SPs [all_3_SPrs]" + } + ], + "conditions_note": "The paper ran 140 experimental markets across 31 cardinal payoff treatments (materials/payoff_matrices_verbatim.json has all 31, verbatim). The 8 arms above are the minimal set that covers every comparison the paper's headline results require: bilateral vs. unilateral (bargaining power), main vs. large (market size), and unique- vs. four-by-four vs. five-stable market structure (emergence and selection of median stable matchings). Each arm's bilateral/unilateral pair uses the *same* underlying cardinal matrix label where the source data allows it (see paired_*_arm fields), matching the paper's own within-matrix comparison design. A researcher can add further arms by pointing payoff_treatment_index at any of the other 23 treatments in payoff_matrices_verbatim.json without any code change.", + "materials_references": [ + "materials/materials.json", + "materials/instructions_script.json", + "materials/payoff_matrices_verbatim.json" + ], + "outputs": { + "session_log_fields": [ + "arm, structure, proposing, size, n_per_side, payoff_treatment_index, seed", + "events: ordered list of {tick, actor, action(PASS|OFFER|ACCEPT|REJECT), target, parse_fallback:bool}", + "final_matching: {food_role: color_role or null, ...}", + "n_ticks_used, terminated_by ('inactivity'|'max_ticks')", + "payoff_matrix: the exact matrix used (embedded so evaluation.py is self-sufficient)" + ] + } +}