import uuid import streamlit as st st.set_page_config( page_title="Inception", page_icon="🔥", # layout="wide", initial_sidebar_state="collapsed", ) from data_loaders import ( tokenizer_decode, tokenizer_encode, humanizer_en, humanizer_it, dehumanizer_it, dehumanizer_en, bigram_model, ) @st.cache_data() def get_human_available_careers(lang: str = 'en'): careers = list(tokenizer_decode().values()) if lang == 'it': return sorted([humanizer_it()[key] for key in careers[2:]]) else: return sorted([humanizer_en()[key] for key in careers[2:]]) human_careers_en = get_human_available_careers() from generate_persona import display_personal_data, generate_personal_data from utils import check_login, report, small_report EXPLANATION = "This will allow the user to adjust the sampling probabilities toward more or less conventional choices." TEMP_EXPLANATION = "Low temperature results in much more conventional choices. High temperature results sampling from a broader selection of less conventional choices." HELP_START = "Whether to start with a specific career or a random one. Some starting careers are not well represented in our sample." def rate(pos, state): st.session_state["ratings"][pos] = state small_report() st.image("header.svg", width=None, use_column_width="always") st.subheader(" INDA PoC: Generating career pathways") st.write("*an app by the INDA data science team within the Zucchetti s.p.a.*") st.write("\n\n\n\n") # if "login" not in st.session_state: # check_login() spot = st.empty() if "initialized" not in st.session_state: # Basic initialization st.session_state["user"] = None st.session_state["ratings"] = {} st.session_state["session_id"] = str(uuid.uuid4()) # Load data spot.write("Loading tokenizer...") _ = tokenizer_decode() spot.write("Tokenizer loaded.") spot.write("Loading humanizer...") _ = humanizer_it() spot.write("Humanizer loaded.") spot.write("Loading transition matrix...") _ = bigram_model() spot.write("Transition matrix loaded.") spot.write("") st.toast("Data successfully loaded.", icon="✅") st.session_state.initialized = True with st.container(border=True): cont_cols = st.columns([1, 2]) with cont_cols[0]: use_temp = st.checkbox( label="Use temperature", key="checkbox_temp", value=False, help=EXPLANATION ) chose_start = st.checkbox( label="Chose start", key="checkbox_start", value=False, help=HELP_START) generate = st.button("Generate Career", type="primary") with cont_cols[1]: if use_temp: temp = st.slider( label="Temperature", min_value=0.0, max_value=1.0, step=0.1, key="slider_temp", value=0.5, disabled=(not use_temp), help=TEMP_EXPLANATION, ) if chose_start: start_career = st.selectbox( label="Chose starting career", options=human_careers_en, index=None, key="selectbox_start", placeholder="Select a starting career", label_visibility="collapsed", help="" ) if use_temp: temperature = temp else: temperature = None st.write("\n\n\n\n") if generate: if 'selectbox_start' in st.session_state and st.session_state.selectbox_start is not None: starting_career_token = tokenizer_encode()[dehumanizer_en()[start_career]] else: starting_career_token = None st.session_state["career_id"] = str(uuid.uuid4()) st.session_state["career"], st.session_state["weight"] = ( bigram_model().generate_career(temperature=temperature, init_token=starting_career_token) ) st.session_state["career_ESCO"] = [tokenizer_decode()[job] for job in st.session_state["career"]] st.session_state["ratings"] = {} num_jobs = len(st.session_state["career"]) - 2 # generate_personal_data() report() if "career" in st.session_state: # display_personal_data() st.subheader(f"A mock career pathway") st.write("*A repeated work title means the person had the same job for a different company*") cols = st.columns([0.3,0.7, 2.2, 0.9]) #cols[0].write("*Employment*") cols[1].write("*ESCO code*") cols[2].write("*Description*") cols[3].write("*Is this feasible?*") for index, job in enumerate(st.session_state["career"][1:-1]): cols = st.columns([0.3,0.7, 2.2, 0.3, 0.3, 0.3]) code = tokenizer_decode()[job] cols[0].write(f"#{index+1}") cols[1].write(code) cols[2].write(humanizer_en()[code]) if index in st.session_state["ratings"]: conf = ( "primary" if st.session_state["ratings"][index] == -1 else "secondary" ) neutral = ( "primary" if st.session_state["ratings"][index] == 0 else "secondary" ) happy = ( "primary" if st.session_state["ratings"][index] == 1 else "secondary" ) else: conf, happy, neutral = "secondary", "secondary", "primary" cols[3].button( ":confused:", key=f"odd_job_{(index+1):02d}", type=conf, on_click=rate, args=( index, -1, ), ) cols[4].button( ":neutral_face:", key=f"neutral_job_{(index+1):02d}", type=neutral, on_click=rate, args=( index, 0, ), ) cols[5].button( ":sunglasses:", key=f"cor_job_{(index + 1):02d}", type=happy, on_click=rate, args=( index, 1, ), ) st.write("\n\n\n\n\n") st.divider() st.write("\n\n")