Skip to content

Commit

Permalink
Improved setUp with dummy data for logsum builders
Browse files Browse the repository at this point in the history
  • Loading branch information
jpn-- committed Dec 23, 2016
1 parent acf8c7c commit fcd1106
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 24 deletions.
4 changes: 2 additions & 2 deletions py/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -4370,7 +4370,7 @@ def delete_data_fountain(self) -> "void":
def change_data_fountain(self, datafile: 'Fountain') -> "void":
return _core.Model2_change_data_fountain(self, datafile)

def setUp(self, and_load_data: 'bool'=True, force: 'bool'=False, cache: 'bool'=False) -> "void":
def setUp(self, and_load_data: 'bool'=True, force: 'bool'=False, cache: 'bool'=False, check_validity: 'bool'=True) -> "void":

if self.logger(): self.logger().log(30, "Model.setUp...")
if self._ref_to_db is not None and self.is_provisioned()==0 and and_load_data:
Expand All @@ -4379,7 +4379,7 @@ def setUp(self, and_load_data: 'bool'=True, force: 'bool'=False, cache: 'bool'=F
if self.logger(): self.logger().info("autoprovisioned data from database")


val = _core.Model2_setUp(self, and_load_data, force, cache)
val = _core.Model2_setUp(self, and_load_data, force, cache, check_validity)

if self.logger(): self.logger().log(30, "Model.setUp complete")

Expand Down
33 changes: 24 additions & 9 deletions py/dt.py
Original file line number Diff line number Diff line change
Expand Up @@ -251,8 +251,10 @@ def __repr__(self):

@property
def h5caseids(self):
return _pytables_link_dereference(self.h5top.caseids)

try:
return _pytables_link_dereference(self.h5top.caseids)
except _tb.exceptions.NoSuchNodeError:
return numpy.zeros(0, dtype=numpy.int64)

def create_group(self, *arg, **kwargs):
return self.h5f.create_group(*arg, **kwargs)
Expand Down Expand Up @@ -384,6 +386,7 @@ def set_alternatives(self, altids, alt_labels=None):
alt_labels = ["a{}".format(a) for a in altids]
for an in alt_labels:
h5altnames.append( str(an) )
self._refresh_dna(self.alternative_names(), self.alternative_codes())

def alternative_codes(self):
try:
Expand All @@ -410,13 +413,22 @@ def alternative_code(self, name):
return self.alts.altids[idx]

def caseids(self):
return _pytables_link_dereference(self.h5top.caseids)[:]
try:
return _pytables_link_dereference(self.h5top.caseids)[:]
except _tb.exceptions.NoSuchNodeError:
return numpy.zeros(0, dtype=numpy.int64)

def array_caseids(self, screen=None):
screen, n_cases = self.process_proposed_screen(screen)
if isinstance(screen, str) and screen=="None":
return _pytables_link_dereference(self.h5top.caseids)[:]
return _pytables_link_dereference(self.h5top.caseids)[screen]
try:
return _pytables_link_dereference(self.h5top.caseids)[:]
except _tb.exceptions.NoSuchNodeError:
return numpy.zeros(0, dtype=numpy.int64)
try:
return _pytables_link_dereference(self.h5top.caseids)[screen]
except _tb.exceptions.NoSuchNodeError:
return numpy.zeros(0, dtype=numpy.int64)

@property
def caseindexes(self):
Expand Down Expand Up @@ -825,10 +837,13 @@ def array_weight(self, *, var=None, **kwargs):
return self.array_idco('_weight_', **kwargs)

def array_choice(self, **kwargs):
if isinstance(self.idca._choice_, (_tb.Group,GroupNode)):
##!stacktuple = self.idca._choice_._v_attrs.stack
stacktuple = self.from_vault('stack._choice_')
return numpy.expand_dims(self.array_idco(*stacktuple, **kwargs), axis=-1)
try:
if isinstance(self.idca._choice_, (_tb.Group,GroupNode)):
##!stacktuple = self.idca._choice_._v_attrs.stack
stacktuple = self.from_vault('stack._choice_')
return numpy.expand_dims(self.array_idco(*stacktuple, **kwargs), axis=-1)
except _tb.NoSuchNodeError:
return numpy.zeros([self.nCases(), self.nAlts(), 1], dtype=numpy.float64)
return self.array_idca('_choice_', **kwargs)

def array_avail(self, *, var=None, dtype=numpy.bool_, **kwargs):
Expand Down
45 changes: 44 additions & 1 deletion py/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,7 @@ def load(self, filename="@@@", *, echo=False, d=None):
filename = self
if d:
self = Model(d)
self.setUp(False)
else:
self = Model()
inf = numpy.inf
Expand All @@ -405,7 +406,7 @@ def handle_starttag(subself, tag, attrs):
if use:
for attrname,attrval in attrs:
if attrname=='content':
self.loads(attrval, use_base64=True, echo=echo)
self.loads(attrval, use_base64=True, echo=echo, d=self.df)
parser = LarchHTMLParser_ModelLoader()
with open(filename) as f:
parser.feed(f.read())
Expand All @@ -423,6 +424,7 @@ def loads(self, content="@@@", *, use_base64=False, echo=False, d=None):
content = self
if d:
self = Model(d)
self.setUp(False)
else:
self = Model()
inf = numpy.inf
Expand Down Expand Up @@ -1870,6 +1872,47 @@ def provision_without_utility(self):
except ProvisioningError:
pass

def provision_zeros(self, ncases=None, nalts=None, initializer=None, avail_initializer=None):
'''
Initialize input data arrays with zeros instead of loading from a data file.
Parameters
----------
ncases : int
Override the number of cases provisioned. You probably want to use this.
nalts : int
Override the nubmer of alternatives provisioned.
Probably you don't want to do this, but just in case.
initializer : float64
Optionally fill utilityca and utilityco with this value instead of zero.
avail_initializer : bool
Optionally fill avail with this value instead of False
'''
need = self.needs()
ncases = ncases or self.nCases()
if ncases==0:
import warnings
warnings.warn("ncases is zero in provision_zeros")
if nalts==0:
import warnings
warnings.warn("nalts is zero in provision_zeros")
nalts = nalts or self.nAlts()
zer = {}
_shape = lambda req: (ncases, nalts, req.nVars() or 1) if req.dimty==3 else (ncases, req.nVars() or 1)
numpy_dtype_nums = {
7: numpy.int64,
12: numpy.float64,
0: numpy.bool,
}
for key,val in need.items():
if initializer is not None and key in ('UtilityCA','UtilityCO'):
zer[key] = numpy.full(_shape(val), initializer, dtype=numpy_dtype_nums[val.dtype])
elif avail_initializer is not None and key in ('Avail',):
zer[key] = numpy.full(_shape(val), avail_initializer, dtype=numpy_dtype_nums[val.dtype])
else:
zer[key] = numpy.zeros(_shape(val), dtype=numpy_dtype_nums[val.dtype])
self.provision( zer )

def provision(self, *args, idca_avail_ratio_floor=None, cache=False, **kwargs):
from .db import DB
from .dt import DT
Expand Down
8 changes: 4 additions & 4 deletions src/model/elm_model2.h
Original file line number Diff line number Diff line change
Expand Up @@ -536,9 +536,9 @@ namespace elm {
// void _setUp_availability_data();
// void _setUp_choice_data();
// void _setUp_weight_data();
void _setUp_utility_data_and_params();
void _setUp_quantity_data_and_params();
void _setUp_samplefactor_data_and_params();
void _setUp_utility_data_and_params(bool check_validity=true);
void _setUp_quantity_data_and_params(bool check_validity=true);
void _setUp_samplefactor_data_and_params(bool check_validity=true);
void _setUp_allocation_data_and_params();

void _setUp_MNL();
Expand Down Expand Up @@ -825,7 +825,7 @@ FOSWIG( %rename(__repr__) representation; )
void change_data_fountain(elm::Fountain& datafile);

public:
void setUp(bool and_load_data=true, bool force=false, bool cache=false);
void setUp(bool and_load_data=true, bool force=false, bool cache=false, bool check_validity=true);
void _pull_graph_from_db();

std::string setUpMessage;
Expand Down
22 changes: 14 additions & 8 deletions src/model/elm_model2_setup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ void _setUp_linear_data_and_params
, etk::logging_service* msg
, std::set< std::string >* cache_valid_ca=nullptr
, std::set< std::string >* cache_valid_co=nullptr
, const bool& check_validity=true
)
{
size_t slot, slot2;
Expand Down Expand Up @@ -212,7 +213,9 @@ void _setUp_linear_data_and_params
if (Input_UtilityCO && Params_UtilityCO) {
// First, populate the data_port
etk::strvec u_co = __identify_needs((*Input_UtilityCO));
__check_validity_of_needs(u_co, _fount, IDCO, msg, cache_valid_ca, cache_valid_co);
if (check_validity) {
__check_validity_of_needs(u_co, _fount, IDCO, msg, cache_valid_ca, cache_valid_co);
}

// Second, resize the paramArray
auto s = _fount ? _fount->nAlts() : Xylem.n_elemental();
Expand Down Expand Up @@ -299,7 +302,7 @@ void _setUp_linear_data_and_params_edges



void elm::Model2::_setUp_utility_data_and_params()
void elm::Model2::_setUp_utility_data_and_params(bool check_validity)
{
BUGGER(msg) << "--Params_Utility--\n";

Expand All @@ -316,14 +319,15 @@ void elm::Model2::_setUp_utility_data_and_params()
, &msg
, &cache_valid_ca
, &cache_valid_co
, check_validity
);

BUGGER(msg) << "Params_UtilityCA \n" << Params_UtilityCA.__str__();
BUGGER(msg) << "Params_UtilityCO \n" << Params_UtilityCO.__str__();

}

void elm::Model2::_setUp_quantity_data_and_params()
void elm::Model2::_setUp_quantity_data_and_params(bool check_validity)
{
BUGGER(msg) << "--Params_Quantity--\n";

Expand All @@ -340,6 +344,7 @@ void elm::Model2::_setUp_quantity_data_and_params()
, &msg
, &cache_valid_ca
, &cache_valid_co
, check_validity
);

BUGGER(msg) << "Params_QuantityCA \n" << Params_QuantityCA.__str__();
Expand All @@ -355,7 +360,7 @@ void elm::Model2::_setUp_quantity_data_and_params()

}

void elm::Model2::_setUp_samplefactor_data_and_params()
void elm::Model2::_setUp_samplefactor_data_and_params(bool check_validity)
{
BUGGER(msg) << "--Params_Sampling--\n";

Expand All @@ -372,6 +377,7 @@ void elm::Model2::_setUp_samplefactor_data_and_params()
, &msg
, &cache_valid_ca
, &cache_valid_co
, check_validity
);

BUGGER(msg) << "Params_SamplingCA \n" << Params_SamplingCA.__str__();
Expand Down Expand Up @@ -491,7 +497,7 @@ void elm::Model2::_pull_graph_from_db()
}


void elm::Model2::setUp(bool and_load_data, bool force, bool cache)
void elm::Model2::setUp(bool and_load_data, bool force, bool cache, bool check_validity)
{

if (!force) {
Expand Down Expand Up @@ -528,7 +534,7 @@ void elm::Model2::setUp(bool and_load_data, bool force, bool cache)
}

BUGGER(msg) << "Setting up utility parameters...";
_setUp_utility_data_and_params();
_setUp_utility_data_and_params(check_validity);
if (features & MODELFEATURES_NESTING) {
if (!option.suspend_xylem_rebuild) {
elm::cellcode root = Xylem.root_cellcode();
Expand All @@ -549,15 +555,15 @@ void elm::Model2::setUp(bool and_load_data, bool force, bool cache)


if (Input_Sampling.ca.size() || Input_Sampling.co.metasize()) {
_setUp_samplefactor_data_and_params();
_setUp_samplefactor_data_and_params(check_validity);
}

if (features & MODELFEATURES_ALLOCATION) {
_setUp_allocation_data_and_params();
}

if (features & MODELFEATURES_QUANTITATIVE) {
_setUp_quantity_data_and_params();
_setUp_quantity_data_and_params(check_validity);
}

_setUp_coef_and_grad_arrays();
Expand Down

0 comments on commit fcd1106

Please sign in to comment.